Svi*_*ish 19 php mysql validation datetime
当我尝试将值放入无效的DATE字段时,MySQL似乎使用了0000-00-00.有没有办法在没有更新DATE字段的情况下"检查"?并从例如PHP做到这一点?
比如,有没有办法可以查询MySQL服务器并询问"嘿,这个DATE,TIME或DATETIME对你有效吗?"
或者是否有更好的方法呢?
我在我的应用程序中使用这种语法,它的工作就像魅力一样!
SELECT DATE('2013-09-31') AS valid;
Run Code Online (Sandbox Code Playgroud)
我的系统是Win7x64,PHP 5.5和MySQL 5.6.16
由于问题说明MySQL,这里是一个MySQL解决方案:
由于需要考虑所有不同的可能日期格式,因此很难验证字段是否为日期。但是,如果您知道字段日期格式是以下格式之一:
'yyyy-mm-dd'
'yyyy-mm-dd hh:mm:ss'
'yyyy-mm-dd whatever'
Run Code Online (Sandbox Code Playgroud)
此代码将帮助您:
SELECT count(*) FROM `table`
WHERE DATE(STR_TO_DATE(`column`, '%Y-%m-%d')) IS NOT NULL
AND `column` NOT REGEXP '^[0-9\.]+$'
Run Code Online (Sandbox Code Playgroud)
基本上 :
DATE(STR_TO_DATE(**1**, '%Y-%m-%d')) = '2001-00-00'如果count(*)是>0,那就是约会,如果是,0那就是别的东西。
注意
此方法适用于任何日期格式的字符串,只要您事先知道它们遵循什么格式(我知道情况并非总是如此,但仍然有用)。只需替换a priori查询中的格式
如果您为 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";
}
Run Code Online (Sandbox Code Playgroud)
印刷
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 [...]
Run Code Online (Sandbox Code Playgroud)