Как проверить дату MYSQL в PHP? - PullRequest
8 голосов
/ 28 февраля 2009

Пользователи выбирают свою дату из 3 выпадающих списков (день, месяц, год). Я скомбинирую их на стороне сервера, чтобы получить строку типа «2008-12-30». Как я могу проверить, чтобы эта дата была только в правильном формате / числовом и т. Д.?

Ответы [ 6 ]

18 голосов
/ 21 марта 2011

Я лично обнаружил, что это правильный и элегантный способ определить, является ли дата одновременно в соответствии с форматом и действительным :

  • считает даты типа 20111-03-21 недействительными - в отличие от checkdate()
  • нет возможных предупреждений PHP (если, конечно, указан какой-либо один параметр) - в отличие от большинства explode() решений
  • учитывает високосные годы, в отличие от решений только для регулярных выражений
  • полностью совместим с форматом mysql DATE (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']);
}
6 голосов
/ 28 февраля 2009

Если это 3 отдельных раскрывающихся списка, вам нужно будет подтвердить их как три отдельных значения.

То есть

  • Подтвердите, что столбец года числовой и между годами, допустимыми в вашем приложении
  • Проверить, что столбец месяца является числовым
  • Проверить, что столбец дня числовой
  • Проверьте, что все они являются допустимыми значениями, используя 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 год или около того.

4 голосов
/ 09 декабря 2012

Я использую эту функцию:

<?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 ); 
?>

$ a верно, остальные ложны - и это правильно

Функция из Raveren (выше) не будет охватывать действительные даты с временными метками !!! $ a возвращает false там! И кстати: checkdate () вернул бы true для $ b, хотя это не является действительным mysql datetime

2 голосов
/ 28 февраля 2009

Проверить правильность даты можно с помощью checkdate . Если вы хотите убедиться, что значения являются числовыми и имеют правильную длину, вы можете сделать что-то простое: is_int ctype_digit и strlen комбинация перед построением даты.

// untested
if( !ctype_digit)( $month ) || strlen( $month ) != 2 ) {
    // handle error
}
// repeat for $day and $year
if ( checkdate( $month, $day, $year ) {
    // do your work
}
1 голос
/ 14 февраля 2011

Просто была такая же проблема. Я написал короткую функцию, которая проверяет, правильный ли формат, а также реальная ли дата:

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;
}

надеюсь, это поможет.

0 голосов
/ 28 февраля 2009

Если у вас есть три раскрывающихся списка, то значения, полученные из раскрывающихся списков, всегда должны быть числами, поскольку вы контролируете значения, связанные с месяцем (показано ниже). Это тогда привело бы к заключению, что объединенный результат является действительным.

<option value="01">January</option>

Если вы предоставляете вспомогательные записи в раскрывающихся списках, таких как «Выбрать месяц», тогда вы можете сделать это значение 0 и убедиться, что значения, приходящие из каждого раскрывающегося списка, больше нуля.

Существует вероятность того, что кто-то изменит форму HTML для предоставления других значений. Если это проблема, вы можете использовать PHP-функцию ctype_digit () , чтобы проверить, что каждое предоставленное значение на самом деле является числовой цифрой.

Если вы обеспокоены тем, что дата действительно действительна, используйте функцию checkdate () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...