警告:我是php新手

我正在从mysql格式的表格(即YYYY-MM-DD)中读取2个日期,并尝试对它们的有效性进行错误检查,并且其中一个小于另一个

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
}


希望这可以帮助 :)

10-08 03:43