【问题标题】:insert null date / time into mysql with php causing 0000-00-00 / 00:00:00使用php将空日期/时间插入mysql导致0000-00-00 / 00:00:00
【发布时间】:2011-08-30 10:33:17
【问题描述】:

我在这里和其他地方看到几个问题在某些情况下解决了这个问题,但不是我需要的。

我正在使用一个脚本,该脚本存储一组值以根据更改进行插入或更新。

设置了一些日期/时间,而一些日期/时间为空。我正在尝试使用 $var=NULL,然后使用 insert into ... ('{$var}') 插入,如果为 null,则获取时间为 00:00:00,如果设置了时间,则获取时间。

使用 $var="NULL" 插入并插入到 ... ('{$var}') 中,如果为 null,则为 00:00:00,如果设置了时间,则为时间。

如果我删除了插入 ... ({$var}) 的引号,它在为空时有效,但如果日期不为空,它当然会失败。

我有另一个 VARCHAR 字段,我正在做同样的事情,它工作正常。即如果有一个字符串,它作为一个字符串传入,如果它是空的,我设置 var=null。我在插入查询中使用引号,如果它为空,则作为空输入,如果不为空,则插入字符串。

使用条件语句将需要进行相当大的重写,所以我希望避免这种情况。

任何关于如何在没有 IF 语句的情况下进行这项工作的建议(如果可能的话)都会有所帮助。

谢谢。


我已经测试了这几种方法,如果不将日期/时间字段设置为 VARCHAR,我将无法获得所需的结果,而我不想这样做。这是数据库结构,插入查询和结果。

id  int(11)         No  None    AUTO_INCREMENT                          
event_new_date_start    date            Yes NULL                                
event_new_time_start    time            Yes NULL                                
event_link  varchar(150)    latin1_swedish_ci       Yes NULL    




    $event_new_date_start1 = 'NULL';
    $event_new_time_start1 = 'NULL';
    $event_link1 = 'NULL';
    $event_new_date_start2 = '2011-04-04';
    $event_new_time_start2 = '13:13';
    $event_link2 = 'http://abc.com';
    $event_new_date_start3 = NULL;
    $event_new_time_start3 = NULL;
    $event_link3 = NULL;

    mysql_query("
    insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
    ('{$event_new_date_start1}', '{$event_new_time_start1}', '{$event_link1}')
    ");

    mysql_query("
    insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
    ('{$event_new_date_start2}', '{$event_new_time_start2}', '{$event_link2}')
    ");

    mysql_query("
    insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
    ('{$event_new_date_start3}', '{$event_new_time_start3}', '{$event_link3}')
    ");                          


        1   0000-00-00  00:00:00    NULL
        2   2011-04-04  13:13:00    http://abc.com
        3   0000-00-00  00:00:00

当我将日期/时间字段更改为 CHAR 时,它在查询中使用引号按预期工作。

        4   NULL    NULL    NULL
        5   2011-04-04  13:13   http://abc.com
        6            

【问题讨论】:

    标签: php mysql string datetime null


    【解决方案1】:

    MySQL 经常做这样完全愚蠢的事情;查看这个有用的MySQL "gotchas" 列表。在这种情况下,我希望您的日期字段不是 NULL 并且您的 SQL 合规模式不是很严格;这会导致 MySQL 输入默认日期 0 而不是您实际要求它执行的 NULL。更改您的架构以使您的日期字段默认为空,这应该会消失。

    请注意,如果您进行其他人建议的更改,这将起作用,例如插入 NULL 而不是带引号的 'NULL'。

    【讨论】:

    • 日期字段的默认值为 NULL,如果您看到上面的代码,如果 var 设置为 NULL,则插入 '',如果 var 设置为 'NULL',则插入 0s。谢谢你的链接。
    【解决方案2】:

    rdineiu 是对的,问题是你插入了“null”这个词。 MySQL 不理解这一点,因此它没有给出错误(像许多 DB 那样),而是插入了一个全为零的时间。这在 Java 中特别有趣,因为尝试读取该值会引发异常。

    最好的办法是转向使用 DBO 的参数化 SQL 查询。您可以通过this question and answer on SO 找到更多信息和一些链接。这不仅可以解决您的问题,还可以解决在插入和读回其他值时可能发生的(一些)SQL 注入问题。

    如果不这样做(同样,你应该并且是正确的答案),你可以在不带引号的情况下进行插入(“({$var})”),并通过附加必要的函数运行日期如果它不为空,则引用。但是如果你直接从用户那里获取日期值,这不会保护你,如果你有一个字符串字段想要为空,你也会遇到同样的问题。

    【讨论】:

      【解决方案3】:

      如果您使用引号,则表示您希望日期为字符串'NULL'。 MySQL 无法将其解析为有效日期,因此它回退到 0

      在设置$var 的值时,将其设置为NULL 或者如果它不为空,则将其设置为带引号的字符串,然后只需在查询中使用({$var}) 而不是('{$var}')

      【讨论】:

      • 我也对此进行了测试,不幸的是,有些日期为空,有些则不是,没有引号,非空日期正确输入,但空值是 0。没有引号,非空日期会抛出错误。我猜解决这个问题的唯一方法是执行 IF 来查看值是否为 null 并动态创建查询。
      • 如果您使用 PDO 和准备好的语句,您的生活会更轻松;它将把 NULL 作为 NULL 放入,日期用引号括起来。它还将使 SQL 注入预防变得更加容易。
      • @Jason, ifs,但在 PHP 中,而不是在 SQL 中。我的意思是,if (empty($var)) { $var = 'NULL'; } else { $var = "'" . mysql_real_escape_string($var) . "'"; }。您可以为任何$var 执行此操作,而不仅仅是日期,因此您可以执行一次。即使您在撇号 ('123') 之间插入整数,MySQL 也不会抱怨,因此您可以在任何地方真正使用它。
      • 这是最好的答案,但并没有真正解决问题。我打算出去说这可能是mysql中的一个错误。不确定。但是,我将其更改为使用 PDO 并解决了问题。谢谢el yobo。
      猜你喜欢
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2014-02-19
      • 1970-01-01
      • 2016-06-04
      • 2017-09-21
      相关资源
      最近更新 更多