将日期从PHP插入数据库时​​出现奇怪的行为

时间:2011-08-10 14:30:26

标签: php mysql date

在“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();

?>

这给了我在数据库中的函数,在“DATE”类型的字段名称“time”中。 如果使用这个:

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

- &GT;不起作用

编辑: 我已经从“m-d-Y”改为“Y-m-d”以获得适当的语义,但它仍然不起作用

但是,如果我改变这样的代码:

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

它有效。

有人可以帮我解释一下吗?

3 个答案:

答案 0 :(得分:2)

您希望date("Y-m-d"不是date("m-d-Y"

See here for explanation of what date/time formats MySQL accepts

如果你使用这种格式,你还需要在日期前引用,因为没有它们,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 :(得分:1)

日期存储为Y-m-d

所以你的代码应该这样做:

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

答案 2 :(得分:0)

两个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');";
相关问题