В настоящее время я работаю с Doctrine 2 и MySQL. Я сталкиваюсь с некоторыми проблемами, когда я работаю с полями datetime в mysql, соответственно DateTime в PHP. Когда в моей базе данных значение даты «0000-00-00», в PHP это значение преобразуется в -0001-11-30. Я очень доволен этим, поэтому мне нужно сделать чек на значение «0000-00-00». Есть ли у кого-нибудь идеи по этому поводу? Благодарю.
NB Я думаю, что правильно сделать проверку на «-0001-11-30» вместо «0000-00-00».
Если дата не установлена, используйте NULL
для указания этого состояния. Это решает вашу проблему и делает схему базы данных более понятной и многословной.
Альтернативой является установка режима NO_ZERO_DATE
SQL на вашем сервере MySQL. Вы можете установить его для своего текущего сеанса, как описано в http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html.
Я использую эту функцию во всем моем коде. Передайте ему дату-строку или объект DateTime (Неизменяемый); он выплевывает объект DateTime или DateTimeImmutable PHP, или false, если ввод представляет собой строку типа «0000-00-00». Со вторым параметром он также может заставить результат быть неизменным или нет:
function ensureDateTime ( $input, $immutable = NULL ) { if ( ! $input instanceof \DateTimeInterface ) { if ( in_array( $input, ['0000-00-00', '0000-00-00 00:00:00'], true ) ) { $input = false; } elseif ( $immutable ) { $input = new \DateTimeImmutable( $input ); } else { $input = new \DateTime( $input ); } } elseif ( true === $immutable && $input instanceof \DateTime ) { $input = new \DateTimeImmutable( $input->format(TIMESTAMPFORMAT), $input->getTimezone() ); } elseif ( false === $immutable && $input instanceof \DateTimeImmutable ) { $input = new \DateTime( $input->format(TIMESTAMPFORMAT), $input->getTimezone() ); } return $input; }
В принципе «Я не уверен, с чего я начал, но я знаю, что хочу», функция.
(Примечание: немного синтаксиса PHP 7 здесь, но легко адаптируется к PHP 5)
Если вы не можете справиться с этим в своей базе данных, вы можете использовать этот фрагмент, чтобы избежать этого поведения, и подтвердите дату
$date = new DateTime('0000-00-00 00:00'); if (DateTime::createFromFormat('Ym-d', $date->format('Ym-d'))) { // Valid } else { // Not valid }