W "form.php"
<html>
<body>
<form action="process.php" method="post">
<input type="text" name="dat" />
<input type="submit" value="submit" />
</form>
</body>
</html>
W "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();
?>
To da mi 0000-00-00 w bazie danych, w polu "czas" typu "DATA". Jeśli używasz tego:
$time = explode("-", $_POST["dat"]);
$query = "INSERT INTO sts (time) VALUES ( " . date("m-d-Y", mktime(0, 0, 0, $time[1], $time[2], $time[0])). " ) ";
-> nie działa również
EDYTOWAĆ: Zmieniłem z "m-d-Y" na "Y-m-d" na odpowiedni semantyczny, ale nadal nie działa
Jeśli jednak zmienię kod w ten sposób:
$query = "INSERT INTO sts (time) VALUES ("1991-10-05") ";
to działa.
Czy ktoś może mi to wyjaśnić?
Odpowiedzi:
0 dla odpowiedzi № 1Ani jeśli twoje dwa przykłady PHP mają podaną datę. Będą generować zapytania wyglądające jak:
INSERT INTO sts (time) VALUES (2009-01-02);
który zostanie sparsowany do
INSERT INTO sts (time) VALUES (2006)
2009-01-02 to literał numeryczny z dwoma odejmowaniami, a nie datą. Aby uzyskać program MySQL traktujący to jako wartość daty, MUSI być cytowany:
INSERT INTO sts (time) VALUES ("2009-01-02");
^----------^--- quotes MUST be present
Twój PHP powinien wyglądać tak:
$date = mysql_real_escape_string($_POST["dat"]);
$query = "INSERT INTO sts (time) VALUES ("$dat");";
2 dla odpowiedzi nr 2
Chcesz date("Y-m-d"
nie date("m-d-Y"
Zobacz tutaj, aby dowiedzieć się, jakie formaty daty / czasu MySQL akceptuje
Również potrzebujesz wyceny w terminie, jeśli używasz tego formatu, ponieważ bez nich MySQL uważa, że wstawiasz nymber: 1991-10-05 = 1976
.
$query = "INSERT INTO sts (time) VALUES ("" . date("Y-m-d", mktime(0, 0, 0, $time[1], $time[2], $time[0])). "" ) ";
Lub alternatywnie krótszy format i bez cudzysłowów
$query = "INSERT INTO sts (time) VALUES (" . date("Ymd", mktime(0, 0, 0, $time[1], $time[2], $time[0])). " ) ";
i osobiście:
$ts = strtotime($_POST["dat"]);
if($ts != 0) {
$date = date("Ymd",$ts);
$query = "INSERT INTO sts (time) VALUES ($date) ";
} else {
// invalid date format
}
I tak jak inni mówili w komentarzach: nigdy nie wkładaj $_POST
(lub $_GET
lub dowolne niezaufane dane) bezpośrednio w zapytaniach. Zawsze najpierw uciekaj / usuwaj dane.
1 dla odpowiedzi nr 3
Daty są przechowywane jako Y-m-d
Twój kod powinien więc:
$query = "INSERT INTO sts (time) VALUES ( " . date("Y-m-d", mktime(0, 0, 0, $time[1], $time[2], $time[0])). " ) ";