如何调试我的PHP验证函数


How to debug my PHP validation function?

我正在为我的工作创建一个web表单,正在使用PHP进行验证。但是,当我测试页面时,当输入有效信息时,我总是得到返回的所有错误消息,而没有正确提交表单。以下是一小段代码(包括HTML部分):

<?php
$date =""
$dateerror = ""
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST["date"])) {
        $dateerror = "Date is required";
    } else {
        $date = test_input($_POST["date"]);
        $array = explode("/", $date);
        $day = $array[1];
        $month = $array[0];
        $year = $array[2];
        if (!checkdate($month, $day, $year)) {
            $dateerror = "Date mustbe in M/D/Y format";
        } else {
            date_default_timezone_set("America/Anchorage");
            $today = strtotime("now");
            if (strtotime($date)>=$today) {
                $date = test_input($_POST["date"]);
            } else {
                $dateerror = "Date is before present day";
            }
        }
    }
<input type="text" size="9" name="date" id="date" required title="Please enter current date"><?php echo $dateerror; ?><br>

同样,即使日期是当前日期,PHP代码也只返回"Date is before present day"。

如果您想在PHP中验证日期,最好的方法是使用DateTime类,特别是createFromFormat方法。

这个调用将创建一个DateTime对象,设置为给定格式的指定日期,如果是无效日期,则创建false

例如:

<?php
$input = "05/08/2015";
$test = DateTime::createFromFormat('d/m/Y', $input);
if (!$test) {
    print "You entered an invalid date";
    die;
}
$now = new DateTime();
if ($test < $now) {
    print "Date is before present.";
    die;
}
?>

就是这么简单。不需要正则表达式,也不需要爆炸输入等;只是一个简单的测试。一旦确定日期有效,您还可以使用$test变量来处理日期,因为它是一个标准的DateTime对象。

[EDIT]我在代码中添加了一点来处理使用DateTime类来处理日期比较,以给出'before present'错误。

这里重要的一点是,如果你有一个DateTime对象,你需要将它与另一个DateTime对象进行比较;较旧的strtotime()生成与DateTime不同类型的日期资源,并且您不能同时使用它们(至少不能在它们之间一直转换)。
解决方案:使用date("M/D/Y"):
$today = strtotime(date("M/D/Y")); // 1432958400
$date = strtotime($_POST["date"]); // user input. 05-30-2015 will yield 1432958400
// the rest of your logic here

下面是特定于代码的解决方案:

<?php
$date =""
$dateerror = ""
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST["date"])) {
        $dateerror = "Date is required";
    } else {
        $date = test_input($_POST["date"]);
        $array = explode("/", $date);
        $day = $array[1];
        $month = $array[0];
        $year = $array[2];
        if (!checkdate($month, $day, $year)) {
            $dateerror = "Date mustbe in M/D/Y format";
        } else {
            date_default_timezone_set("America/Anchorage");
            $today = strtotime(date("M/D/Y"));
            if (strtotime($date)>=$today) {
                $date = test_input($_POST["date"]);
            } else {
                $dateerror = "Date is before present day";
            }
        }
    }
<input type="text" size="9" name="date" id="date" required title="Please enter current date"><?php echo $dateerror; ?><br>