/ / Dziwne zachowanie podczas wstawiania daty z PHP do bazy danych - php, mysql, date

Dziwne zachowanie podczas wstawiania daty z PHP do bazy danych - php, mysql, date

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 № 1

Ani 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])). "  ) ";