如何调试我的PHP验证功能?

时间:2015-05-30 20:48:30

标签: php

我正在为我的工作创建一个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代码只返回&#34;日期在当前日期之前&#34;即使日期是当前日期。

2 个答案:

答案 0 :(得分:3)

如果要在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对象。

[编辑]我已经在代码中添加了一些内容来处理使用DateTime类来处理日期比较,以便在出现之前提供&#39;错误。

这里重要的一点是,如果你有一个DateTime对象,你需要将它与另一个DateTime对象进行比较;较旧的strtotime()DateTime生成了不同类型的日期资源,您无法一起使用它们(至少在它们之间不进行转换时)。

答案 1 :(得分:1)

解决方案:使用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>