Пользователи будут выбирать дату из 3 выпадающих списков (день, месяц, год). Я объединю их на стороне сервера, чтобы создать строку типа «2008-12-30». Как я могу затем проверить, чтобы убедиться, что эта дата была в правильном формате/только числовой и т. Д.?Как проверить дату MYSQL в PHP?
ответ
Если они представляют собой 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 или около того.
Возможно, вы захотите проверить, является ли оно целым числом, а не если оно числовое. is_numeric является истинным как для float, так и для целых чисел, но is_int проверяет только целые числа. – gpojd
is_int() не может работать с представленными пользователем переменными, то есть переменными в $ _POST, потому что они всегда имеют строку типа. Тем не менее, вы можете применить их к целому, используя (int) $ _ POST ['var'], а затем слегка сравните это с исходным строковым значением (используя ==). – thomasrutter
Вы можете проверить, что дата действительна с использованием 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
}
Я изменил свой ответ от is_int на ctype_digit на основе комментария thomasrutter, что is_int не будет корректно обрабатывать POST-переменные. – gpojd
Если у вас есть три выпадающих списка, то значения, исходящие из выпадающих списков, всегда должны быть числами, поскольку вы управляете значениями, связанными с месяцем (см. Ниже). Это привело бы к выводу, что объединенный результат действителен.
<option value="01">January</option>
Если вы предоставите предоставить записи помощи в раскрывающемся меню, такие как «Выберите месяц», то вы можете сделать это значение 0 и убедитесь, что значения, поступающие из каждой коробки падения больше нуля.
Существует вероятность того, что кто-то изменит форму HTML, чтобы предоставить другие значения. Если это вызывает беспокойство, вы можете использовать функцию PHP ctype_digit(), чтобы проверить, что каждое предоставленное значение на самом деле является числовой цифрой.
Если вы обеспокоены тем, что дата действительно действительна, используйте функцию checkdate().
Возможно создание сообщений в скрипте без использования форм. Я могу написать бота, который делает сообщение в вашей форме и публикует любое значение, которое я вставляю для каждого поля, без использования форм. –
Это правда, поэтому предложение использования ctype_digit() и checkdate() имеет смысл. Я основывал свой ответ на утверждении, что у вас есть форма. Даже если вы используете скрипт, в этом случае не так много случаев, когда он не будет использовать значения в формах. – Paulo
Просто у той же проблемы. Я написал небольшую функцию, которая проверяет, если формат является правильным, а также если дата реальна:
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;
}
надеюсь, что это помогает.
есть checkdate(), чувак –
смешно, теперь я пытаюсь понять, что со мной не так ... :) –
ok now Я вижу, что я имел в виду, потому что сегодня я столкнулся с той же проблемой. checkdate() запросить три параметра. поэтому, если у вас есть строка даты, это не поможет вам. моя функция получает строку и ее форматы и проверяет с помощью checkdate() –
Я лично нашел, что это правильный и элегантный способ, чтобы определить, если дата как в соответствии с форматом и действительный:
- обрабатывает даты, как
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']);
}
Я использую эту функцию:
<?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
Спасибо, ваша функция помогла мне :) –
Это будет * неправильно * invalidate '10.03.21 00: 00: 00' и не будет проверять строки даты без времени * на всех * - которые запросил ОП. – raveren
Можете ли вы изменить это немного; не совсем понятно, что вам нужно. Вы хотите проверить дату, исходящую от запроса, или вы хотите проверить отдельные компоненты, прежде чем вставлять их в базу данных? – Rob
Я хочу объединить компоненты даты и подтвердить комбинированную дату по базе данных. –
Почему это было приостановлено? –