предостережение: я новичок в php
Я читаю 2 даты из формы в формате mysql (т.е. ГГГГ-ММ-ДД) и пытаюсь проверить их правильность на наличие ошибок, и что одна из них меньше другой
if(!empty($day1) && !empty($day2)){
$sndate=array();
$sndate = explode('-',$day1);
$sndtnum = implode($sndate);
$sndtnum = (int) $sndtnum;
$unsndate=array();
$unsndate = explode('-',$day2);
$unsndtnum = implode($unsndate);
$unsndtnum = (int) $unsndtnum;
if (!checkdate($sndate[1],$sndate[2],sndate[0]) || !checkdate($unsndate[1],$unsndate[2],unsndate[0]) || $unsndtnum<$sndtnum)
{ $error=True; $errtext .="Date field is filled in wrong \n";
}else {$error=False;}
}
Это не похоже на работу. Я почти уверен, что это из-за контрольной даты, но я не уверен, что нет также проблемы с имплозой / кастом.
Любые идеи о том, как это исправить?
Отдельно от sndate[0]
а также unsndate[0]
переменные, у которых отсутствуют знаки доллара, ваш чек фактически не будет работать, если злой пользователь введет нечисловые символы в $day1
(например. 2015-09abc-01
будет считаться менее 2015-05-01
).
Следующий подход проверяет даты, преобразовывая их из известного формата в объект DateTime, а затем снова обратно, проверяя, что две отформатированные даты равны:
$f = 'Y-m-d';
$ok1 = ($d1 = DateTime::createFromFormat($f, $day1)) && $d1->format($f) == $day1;
$ok2 = ($d2 = DateTime::createFromFormat($f, $day2)) && $d2->format($f) == $day2;
if ($ok1 && $ok2 && $d1 <= $d2) {
// Ok
} else {
// Error
}
Надеюсь это поможет 🙂
Других решений пока нет …