如何在PHP中验证MYSQL日期?

如何在PHP中验证MYSQL日期?,php,mysql,date,Php,Mysql,Date,用户可以从3个下拉列表中选择日期日、月、年。我将在服务器端将它们组合成一个字符串,如“2008-12-30”。然后如何进行验证以确保此日期的格式正确/仅限数字等?您可以使用来检查该日期是否有效。如果要确保这些值是数字且长度正确,可以在生成日期之前执行一些简单的操作,如and和组合 // untested if( !ctype_digit)( $month ) || strlen( $month ) != 2 ) { // handle error } // repeat for $day

用户可以从3个下拉列表中选择日期日、月、年。我将在服务器端将它们组合成一个字符串,如“2008-12-30”。然后如何进行验证以确保此日期的格式正确/仅限数字等?

您可以使用来检查该日期是否有效。如果要确保这些值是数字且长度正确,可以在生成日期之前执行一些简单的操作,如and和组合

// untested
if( !ctype_digit)( $month ) || strlen( $month ) != 2 ) {
    // handle error
}
// repeat for $day and $year
if ( checkdate( $month, $day, $year ) {
    // do your work
}

如果它们是三个单独的下拉列表,则需要将它们作为三个单独的值进行验证

验证“年份”列是否为数字,以及在应用程序中的任何年份之间是否有效 验证“月份”列是否为数字 验证“日”列是否为数字 使用checkdate验证它们是否都是有效值 或者,您可以将它们全部转换为整数,将它们组合成一个日期,然后查看结果日期是否有效。即

$time = mktime(0, 0, 0, (int)$_POST['month'], (int)$_POST['day'], (int)$_POST['year']);

// in this example, valid values are between jan 1 2000 (server time) and now
// modify as required
if ($time < mktime(0, 0, 0, 1, 1, 2000) || $time > time())
  return 'Invalid!';

$mysqltime = date('Y-m-d', $time);

// now insert $mysqltime into database

此方法的缺点是,它只适用于Unix时间戳范围内的日期,即1970到2038年左右。

如果有三个下拉列表,则来自下拉列表的值应始终为数字,因为您控制与下面所示月份相关的值。这将导致得出结论,即综合结果是有效的

<option value="01">January</option>
如果在下拉列表中提供帮助条目,如选择月份,则可以将该值设为0,并确保每个下拉框中的值大于零

有可能有人会修改HTML表单以提供其他值。如果这是一个问题,那么您可以使用PHP函数来检查提供的每个值实际上是一个数字


如果您担心日期实际上是有效的,请使用该函数。

也有同样的问题。我编写了一个简短的函数,用于检查格式是否正确,以及日期是否真实:

function valid_mysql_date($str){
    $date_parts = explode('-',$str);
    if (count($date_parts) != 3) return false;
    if ((strlen($date_parts[0]) != 4) || (!is_numeric($date_parts[0]))) return false;
    if ((strlen($date_parts[1]) != 2) || (!is_numeric($date_parts[1]))) return false;
    if ((strlen($date_parts[2]) != 2) || (!is_numeric($date_parts[2]))) return false;
    if (!checkdate( $date_parts[1], $date_parts[2] , $date_parts[0] )) return false;
    return true;
}

希望能有所帮助。

我个人认为这是确定日期是否符合格式且有效的正确而优雅的方法:

将日期(如20111-03-21)视为无效-与checkdate不同 与大多数explode解决方案不同,如果提供任何一个参数,自然不会出现可能的PHP警告 与仅限正则表达式的解决方案不同,考虑闰年 与mysql日期格式10.03.21完全兼容与2010-03-21相同 以下是您可以使用的方法:

/**
 * Tests if a string is a valid mysql date.
 *
 * @param   string   date to check
 * @return  boolean
 */
function validateMysqlDate( $date )
{
    return preg_match( '#^(?P<year>\d{2}|\d{4})([- /.])(?P<month>\d{1,2})\2(?P<day>\d{1,2})$#', $date, $matches )
           && checkdate($matches['month'],$matches['day'],$matches['year']);
}
我正在使用此功能:

$a是真的,其他的都是假的——这是正确的

以上Ravelen的函数将不包含带有时间戳的有效日期!!! $a返回错误!
顺便说一句:checkdate对于$b将返回true,尽管它不是一个有效的mysql日期时间

您能稍微改写一下吗;还不完全清楚你在追求什么。是否要验证来自查询的日期,还是要在将单个组件插入数据库之前验证它们?我要组合日期的组件,并根据数据库验证组合日期。您可能要检查它是否为整数,而不是数字。is_numeric对于浮点和整数都为true,但is_int仅检查整数。is_int无法处理用户提交的变量,即$POST中的变量,因为这些变量始终是字符串类型。但是,您可以使用int$_POST['var']将它们强制转换为整数,然后使用==,将其与原始字符串值进行松散的比较。不使用表单就可以将它们发布到脚本。我可以编写一个机器人,在你的表单上发布帖子,在不使用表单的情况下发布我为每个字段输入的任何值。这就是为什么建议使用ctype_digit和checkdate是有意义的。我的回答是基于你有表格的陈述。即使您使用脚本,在这种情况下也不会使用表单中的值。我根据thomasrutter的注释将答案从is_int更改为ctype_digit,即is_int无法正确处理POST变量。有趣的是,现在我正试图了解我的问题是什么…:现在我明白我的意思了,因为我今天遇到了同样的问题。checkdate请求三个参数。所以,如果你有一系列的日期,这对你没有帮助。我的函数得到一个字符串并格式化它,然后用checkDate检查是的,我也有同样的问题。我有一个字符串,所以checkdate对我没用。不过,这个解决方案对我来说非常有效。谢谢。谢谢,不知怎的,我在生产中使用的那个是正确的,抱歉这个错误。技术上是正确的,但它允许01/02/03。谁知道用户想要什么,但它仍然被认为是有效的。谢谢,你的函数帮助了我:这将错误地使10.03.21 00:00:00无效,并且在没有时间的情况下根本不会验证日期字符串-这是OP要求的。
<?php 
function validateMysqlDate( $date ){ 
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $date, $matches)) { 
        if (checkdate($matches[2], $matches[3], $matches[1])) { 
            return true; 
        } 
    } 
    return false; 
} 

// check it: 
  $a = validateMysqlDate('2012-12-09 09:04:00');
  $b = validateMysqlDate('20122-12-09 09:04:00');
  $c = validateMysqlDate('2012-12_09 09:04:00');
  $d = validateMysqlDate('');
  var_dump( $a );
  var_dump( $b );
  var_dump( $c );
  var_dump( $d ); 
?>