2009-02-28 2 views
8

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

+0

Можете ли вы изменить это немного; не совсем понятно, что вам нужно. Вы хотите проверить дату, исходящую от запроса, или вы хотите проверить отдельные компоненты, прежде чем вставлять их в базу данных? – Rob

+0

Я хочу объединить компоненты даты и подтвердить комбинированную дату по базе данных. –

+1

Почему это было приостановлено? –

ответ

6

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

Т.х

  • Validate, что столбец года числовой и между независимо годами действуют в вашем приложении
  • Validate, что столбец месяца числового
  • Validate, что колонка дня числовой
  • Подтвердите, что все допустимые значения используются с помощью checkdate()

Или вы можете просто бросить их al l в целое число, объединить их вместе в дату и посмотреть, действительно ли результирующая дата. Т.е.,

$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 или около того.

+0

Возможно, вы захотите проверить, является ли оно целым числом, а не если оно числовое. is_numeric является истинным как для float, так и для целых чисел, но is_int проверяет только целые числа. – gpojd

+0

is_int() не может работать с представленными пользователем переменными, то есть переменными в $ _POST, потому что они всегда имеют строку типа. Тем не менее, вы можете применить их к целому, используя (int) $ _ POST ['var'], а затем слегка сравните это с исходным строковым значением (используя ==). – thomasrutter

2

Вы можете проверить, что дата действительна с использованием 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 
} 
+0

Я изменил свой ответ от is_int на ctype_digit на основе комментария thomasrutter, что is_int не будет корректно обрабатывать POST-переменные. – gpojd

-1

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

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

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

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

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

+0

Возможно создание сообщений в скрипте без использования форм. Я могу написать бота, который делает сообщение в вашей форме и публикует любое значение, которое я вставляю для каждого поля, без использования форм. –

+0

Это правда, поэтому предложение использования ctype_digit() и checkdate() имеет смысл. Я основывал свой ответ на утверждении, что у вас есть форма. Даже если вы используете скрипт, в этом случае не так много случаев, когда он не будет использовать значения в формах. – Paulo

1

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

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

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

+1

есть checkdate(), чувак –

+0

смешно, теперь я пытаюсь понять, что со мной не так ... :) –

+0

ok now Я вижу, что я имел в виду, потому что сегодня я столкнулся с той же проблемой. checkdate() запросить три параметра. поэтому, если у вас есть строка даты, это не поможет вам. моя функция получает строку и ее форматы и проверяет с помощью checkdate() –

17

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

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

Да, $ str следует изменить на $ date ... [функция отредактирована] – Ricky

+0

Спасибо, как-то тот, который я использую в производстве, правильно, извините за ошибку. – raveren

+0

хорошо! это полезно –

4

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

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

$ а истинно, остальные являются ложными - и тх t является правильным

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

+0

Спасибо, ваша функция помогла мне :) –

+0

Это будет * неправильно * invalidate '10.03.21 00: 00: 00' и ​​не будет проверять строки даты без времени * на всех * - которые запросил ОП. – raveren