Когда я пытаюсь поместить значение в Поле даты, которое недопустимо, MySQL, кажется, использует 0000-00-00 вместо этого. Существует ли способ, которым я могу сделать эту "проверку", не обновляя Поле даты? И сделать это от, например, PHP?
Как, там способ, которым я могу запросить сервер MySQL и спросить "Эй, эта ДАТА, ВРЕМЯ или ДАТА И ВРЕМЯ, допустимая Вам?"
Или есть ли, возможно, еще лучший способ сделать его?
Если вы выберете режим сервера для сервера MySQL, который не допускает недопустимых значений даты, запрос, содержащий такое искаженное представление даты, вызовет ошибку вместо (тихо) предположения 0000 -00-00
см. http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
например
$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$pdo->exec('CREATE TEMPORARY TABLE foo (id int auto_increment, d datetime, primary key(id))');
$query = "INSERT INTO foo (d) VALUES ('2010-02-31 12:15:18')";
foreach( array('ALLOW_INVALID_DATES', 'STRICT_ALL_TABLES') as $mode ) {
echo $mode, ": "; flush();
$pdo->exec("SET SESSION sql_mode='$mode'");
$pdo->exec($query);
echo "Ok.\n";
}
отпечатки
ALLOW_INVALID_DATES: Ok.
STRICT_ALL_TABLES:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2010-02-31 12:15:18' for column 'd' at row 1' in [...]
Вы можете проанализировать дату в соответствии с форматом, который вы хотите использовать, а затем вызвать checkdate, чтобы проверить, является ли это допустимой датой. Обязательно прочтите комментарии к http://php.net/manual/en/function.checkdate.php .
Используйте эту функцию в php для проверки действительной даты:
function valid_date($date) {
return (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date));
}
Или, как сказал @VolkerK, если в базу данных будет вставлена недопустимая дата, она будет хранится как 0000-00-00, поэтому вы также можете:
ВЫБРАТЬ * ИЗ таблицы WHERE date_field> '0000-00-00'
Вы можете просто использовать «постоянный» запрос без использования временных таблиц и тестовых полей:
mysql> select day('2010-02-31 00:00:00');
+----------------------------+
| day('2010-02-31 00:00:00') |
+----------------------------+
| NULL |
+----------------------------+