Странное поведение при вставке даты из PHP в базу данных - PullRequest
0 голосов
/ 10 августа 2011

В "form.php"

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

В "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();

?>

Это дает мне 0000-00-00 в базе данных, в названии поля«время» типа «ДАТА».При использовании этого:

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

-> тоже не работает

РЕДАКТИРОВАТЬ: я изменил с "mdY" на "Ymd" для соответствующей семантики, но все равно не работаетработа

Однако, если я изменю код следующим образом:

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

, это сработает.

Кто-нибудь может мне это объяснить?

Ответы [ 3 ]

2 голосов
/ 10 августа 2011

Вы хотите date("Y-m-d", а не date("m-d-Y"

См. Здесь для объяснения того, какие форматы даты / времени принимает MySQL

Также вам нужно заключать в кавычки дату, если вы используете этот формат, потому что без них MySQL думает, что вы вставляете 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])). "'  ) ";

Или в более коротком формате и без кавычек

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

и лично я бы сделал:

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

И так же, как другие говорили в комментариях: никогда не вставляйте $_POST (или $_GET или любые ненадежные данные) непосредственно в ваши запросы. Всегда сначала избегайте / дезинфицируйте данные.

1 голос
/ 10 августа 2011

Даты хранятся в формате Ymd

. Таким образом, ваш код должен:

$query = "INSERT INTO sts (time) VALUES ( " .  date("Y-m-d", mktime(0, 0, 0, $time[1], $time[2], $time[0])). "  ) ";
0 голосов
/ 10 августа 2011

Ни в том случае, если в ваших двух примерах PHP указана дата.Они будут генерировать запросы, которые выглядят так:

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

, который будет проанализирован до

INSERT INTO sts (time) VALUES (2006) 

2009-01-02 - это числовой литерал с двумя вычитаниями, а НЕ дата.Чтобы заставить MySQL воспринимать это как значение даты, оно ДОЛЖНО быть заключено в кавычки:

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

Так что ваш PHP должен выглядеть так:

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

$query = "INSERT INTO sts (time) VALUES ('$dat');";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...