2013-11-12 3 views
-1

Я пытаюсь вставить новую строку в свою базу данных с датой и той же датой плюс 1 неделя.DATE_ADD sql в PHP PDO

Я использую PDO в php, не знаю, если это релевантно.

Это код, который не удается:

$stmtEncInsert = $db->prepare("INSERT INTO test 
             (id_Event, NIF, name , description, image, start_date, end_date) 
VALUES (:idOfEvent, :NIF, :name, :description, :image, :startDate, DATE_ADD(:date_end,INTERVAL 1 WEEK) 
             )"); 

     $stmtEncInsert->execute(array(':idOfEvent' => $idOfEvent, ':NIF'=> $NIF, ':name' => $resEnc['name'], ':description' => $resEnc['description'], 
             ':image' => $resEnc['image'], ':startDate' => $date_end, ':date_end' => $date_end)); 

Я получаю некоторые данные из других запросов (например: $ resEnc [ '..']), но все данные в порядке. Я попытался напечатать в файле все данные, и все они в порядке, они существуют.

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

Я думаю, что это проблема с DATE_ADD или так, но у меня нет нашел что-то связанное с этим.

Я протестировал удаление DATE_ADD и просто используя current_date, и он работает, поэтому я думаю, что это проблема.

Любая идея?

Я использую MySQL в качестве двигателя

Это выход за исключение Дано:

Integrity constraint violation: 1048 Column 'end_date' cannot be null 

$ date_end содержит 0000-00-00 он является действительной датой и поле типа DATE получил из БДА от другого запроса

+1

Вам необходимо научиться отлаживать код –

+2

Как общий совет: всегда публиковать сообщения об ошибках (вы можете использовать буфер обмена, чтобы вам не нужно вводить текст), а не их интерпретацию.Кроме того, если есть проблема с 'DATE_ADD (: date_end, INTERVAL 1 WEEK)', как мы можем диагностировать что-либо, если мы не знаем, что ': date_end' содержит? Если '$ date_end' является' 'Dog '', было бы довольно очевидно, почему он терпит неудачу. –

+0

Я уже добавил больше информации – Biribu

ответ

1

0000-00-00 is не действительная дата. MySQL может быть настроен для хранения недопустимых или неполных дат, но это не делает их действительными. Таким образом, попытка добавить одну неделю не возвращает действительную дату, но NULL:

mysql> SELECT DATE_ADD('0000-00-00', INTERVAL 1 WEEK); 
+-----------------------------------------+ 
| DATE_ADD('0000-00-00', INTERVAL 1 WEEK) | 
+-----------------------------------------+ 
| NULL         | 
+-----------------------------------------+ 
1 row in set, 1 warning (0.03 sec) 

Подводя итог: как объясняет сообщение об ошибке, если вы создали end_date быть обязательным, оно не может быть пустым. Либо присвойте ему правильное значение, либо допустите его значение NULL.


Edit # 1: Если вы хотите, чтобы заставить что '0000-00-00' плюс 1 неделя равна '0000-00-00' вы можете сделать это:

COALESCE(DATE_ADD('0000-00-00', INTERVAL 1 WEEK), '0000-00-00') 

ИМХО, дело с '0000-00-00' даты не дает никакой пользы и делает все более запутанным, но это ваш код в любом случае ;-)

Редактировать # 2: Пользователи не вводите нули в полевые даты. Ваш PHP код должен обнаружить пустые даты и вставить NULL:

if(is_valid_date($_POST['start_date'])){ 
    $start_date = $_POST['start_date']; 
}else{ 
    $start_date = NULL; 
} 
$stmtEncInsert = $db->prepare("INSERT INTO test (start_date) VALUES (:start_date)"); 
$stmtEncInsert->execute(
    array('test_date' => $start_date), 
); 

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

+0

Если я попробую то же самое в heidiSQL, просто используя '0000-00-00', он работает. Итак, возможно, дата неверна, но работает за пределами php. Я пробовал прямо сейчас, чтобы создать дату в php в качестве аргумента, подобного этому: date (...), но также не удалось – Biribu

+0

Не обижайтесь, но вам нужно прекратить опробовать случайные вещи и сообщить с неопределенным описанием того, что вы сделали. Убедитесь, что вы * понимаете * ответы, которые вы получили, и просите разъяснений, если вы этого не сделаете. Что бы ни случилось, см. Мое редактирование. –

+0

Не обижайтесь, не волнуйтесь. Я здесь, чтобы учиться. Я попытался создать еще одну строку с другой датой: 2013-03-05, и она работает. Вы говорили о 0000-00-00, была неправильная дата из-за цифр? Я хоть из-за формы. Большинство строк, которые я читаю, создаются другими пользователями, и они не устанавливают дату, поэтому требуется 0000-00-00, поэтому я должен иметь дело с этим. – Biribu

Смежные вопросы