вставить пустую дату / время в MySQL с php, вызывая 0000-00-00 / 00:00:00 - PullRequest
2 голосов
/ 22 мая 2011

Я вижу пару вопросов здесь и в других местах, которые решают эту проблему в некоторых случаях, но не совсем то, что мне нужно.

Я работаю со сценарием, который хранит массив значений для вставки или обновления на основе изменений.

некоторые даты / время установлены, а некоторые равны нулю.я пытаюсь с $ var = NULL, затем вставка с вставкой в ​​... ('{$ var}') и получения 00:00:00 для времени, если ноль, и времени, если время установлено.

вставка с $ var = "NULL" и вставка в ... ('{$ var}') и получение 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            

Ответы [ 3 ]

5 голосов
/ 22 мая 2011

Если вы используете кавычки, то вы говорите, что хотите, чтобы дата была строкой 'NULL'. MySQL не может разобрать это к действительной дате, поэтому это возвращается к 0.

При установке значения $var установите его либо просто NULL, либо строку в кавычках, если она не равна нулю, затем просто используйте ({$var}) в запросе вместо ('{$var}').

1 голос
/ 22 мая 2011

rdineiu прав, проблема в том, что вы вставляете слово «ноль».MySQL не понимает этого и поэтому вместо сообщения об ошибке (как это делают многие БД), он вставляет время всех нулей.Это особенно забавно в Java, так как попытка прочитать это значение вызовет исключение.

Лучше всего перейти на параметризованные запросы SQL с использованием DBO.Вы можете найти немного больше и некоторые ссылки с этим вопросом и ответом на SO .Это не только решит вашу проблему, но и решит (некоторые) проблемы внедрения SQL, которые могут возникнуть при вставке и считывании других значений.

Без этого (что, опять же, вы должны и это правильноответ), вы можете выполнить вставку без кавычек ("({$ var})") и пропустить дату через функцию, которая добавляет необходимые кавычки, если она не равна нулю.Но это не защитит вас, если вы получите значения даты непосредственно от пользователей, и у вас возникнет та же проблема, если у вас есть строковое поле, которое вы хотите обнулять.

0 голосов
/ 23 мая 2011

MySQL часто делает такие глупые вещи; посмотрите этот полезный список MySQL "gotchas" . В этом случае я ожидаю, что ваше поле даты НЕ ПУСТО и ваш режим соответствия SQL не очень строг; это заставляет MySQL вводить дату по умолчанию 0 вместо NULL, которую вы фактически просили это сделать. Измените вашу схему так, чтобы поле даты DEFAULT NULL исчезло, и это должно исчезнуть.

Обратите внимание, что это будет работать, если вы внесете изменения, предложенные другими, например, вставить NULL не в кавычки 'NULL'.

...