使用php cause 0000-00-00 / 00:00:00将空日期/时间插入到mysql中

时间:2011-05-22 01:32:28

标签: php mysql string datetime null

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

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

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

使用$ var =“NULL”插入并插入到...('{$ var}')并获得00:00:00(如果为null)和时间(如果设置了时间)。

如果我删除插入的引号...({$ var})它的作用是null,但如果日期不为null,它当然会失败。

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

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

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

感谢。


我已经测试了这几种方法,如果没有制作日期/时间字段VARCHAR,我无法获得所需的结果,我不想这样做。这是db结构,插入查询和结果。

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            

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

如果不这样做(这又是你应该而且是正确的答案),你可以不带引号(“({$ var})”)插入,并通过追加必要的函数运行日期引号如果不为null。但是,如果您直接从用户那里获得日期值,这将无法保护您,如果您想要可以为空的字符串字段,则会遇到同样的问题。

答案 2 :(得分:0)

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

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