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 № 1Auch 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])). " ) ";