我正在为我的工作创建一个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;即使日期是当前日期。
答案 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>