/ / Seltsames Verhalten beim Einfügen von Datum aus PHP in die Datenbank - PHP, MySQL, Datum

Seltsames Verhalten beim Einfügen von Daten aus PHP in die Datenbank - php, mysql, date

In "form.php"

<html>
<body>
<form action="process.php" method="post">
<input type="text" name="dat" />
<input type="submit" value="submit" />
</form>
</body>
</html>

In "process.php":

<?php
echo $_POST["dat"];

mysql_connect("localhost", "root", "123456")
or die("can"t connect");
mysql_select_db("st")
or die("can"t selectdb");

$query = "INSERT INTO sts (time) VALUES ( " . $_POST["dat"]. "  ) ";


$result = mysql_query($query)
or die(mysql_error());

$mysql_close();

?>

Dies gibt mir eine Registrierung in der Datenbank im Feldname "Zeit" vom Typ "DATUM". Wenn dies verwendet wird:

$time = explode("-", $_POST["dat"]);
$query = "INSERT INTO sts (time) VALUES ( " .  date("m-d-Y", mktime(0, 0, 0, $time[1], $time[2], $time[0])). "  ) ";

-> funktioniert auch nicht

BEARBEITEN: Ich habe von "m-d-Y" zu "Y-m-d" für die entsprechende Semantik gewechselt, aber es funktioniert immer noch nicht

Wenn ich den Code jedoch wie folgt ändere:

$query = "INSERT INTO sts (time) VALUES ("1991-10-05") ";

Es klappt.

Kann mir jemand das erklären?

Antworten:

0 für die Antwort № 1

Auch nicht, wenn in Ihren beiden PHP-Beispielen das Datum angegeben ist. Sie generieren Abfragen, die wie folgt aussehen:

INSERT INTO sts (time) VALUES (2009-01-02);

das wird analysiert auf

INSERT INTO sts (time) VALUES (2006)

2009-01-02 ist ein numerisches Literal mit zwei Subtraktionen, KEIN Datum. Damit MySQL dies als Datumswert behandelt, MUSS es in Anführungszeichen gesetzt werden:

INSERT INTO sts (time) VALUES ("2009-01-02");
^----------^--- quotes MUST be present

Ihr PHP sollte also so aussehen:

$date = mysql_real_escape_string($_POST["dat"]);

$query = "INSERT INTO sts (time) VALUES ("$dat");";

2 für die Antwort № 2

Sie wollen date("Y-m-d" nicht date("m-d-Y"

Hier erfahren Sie, welche Datums- und Uhrzeitformate MySQL akzeptiert

Außerdem benötigen Sie Anführungszeichen, wenn Sie dieses Format verwenden, da MySQL denkt, Sie würden ohne diese Anführungszeichen eine Zahl einfügen: 1991-10-05 = 1976.

$query = "INSERT INTO sts (time) VALUES ("" .  date("Y-m-d", mktime(0, 0, 0, $time[1], $time[2], $time[0])). ""  ) ";

Oder alternativ kürzeres Format und ohne Anführungszeichen

$query = "INSERT INTO sts (time) VALUES (" .  date("Ymd", mktime(0, 0, 0, $time[1], $time[2], $time[0])). "  ) ";

und persönlich würde ich tun:

$ts = strtotime($_POST["dat"]);
if($ts != 0) {
$date = date("Ymd",$ts);
$query = "INSERT INTO sts (time) VALUES ($date) ";
} else {
// invalid date format
}

Und genau wie andere in Kommentaren sagten: Niemals setzen $_POST (oder $_GET oder nicht vertrauenswürdigen Daten) direkt in Ihren Abfragen. Daten immer zuerst entkommen / bereinigen.


1 für die Antwort № 3

Die Daten werden als Y-m-d gespeichert

So sollte Ihr Code tun:

$query = "INSERT INTO sts (time) VALUES ( " .  date("Y-m-d", mktime(0, 0, 0, $time[1], $time[2], $time[0])). "  ) ";