表单验证不使用FOR循环

时间:2017-04-02 17:45:23

标签: php

我有3个文本字段和一个隐藏字段。文本字段接受日期。如果输入的日期晚于任何文本字段的今天,则应显示错误消息。只有在第一个文本字段中输入更晚的日期时,这才能正常工作。如果我在第二个或第三个中执行,它将继续重定向,这显然不应该发生。

$count = count($_POST['complete_date']);
        for($i = 0; $i < $count; ++$i) {

        if($_POST['complete_date'][$i] > date('Y-m-d')) {
            echo error_message("Date can't be in the future");
            break;

            } else {


$stmt = $link->prepare("UPDATE `units` SET `complete_date` = ? WHERE `units` = ?");
        $stmt->bind_param("si", $_POST['complete_date'][$i], $_POST['units'][$i]);
        $stmt->execute();
        $stmt->close();
        header("location: dashboard.php");
        exit();

    }
} 

1 个答案:

答案 0 :(得分:1)

这是正常的,如果你在第二个或第三个位置有错误,你仍然会对数组的第一个项执行查询。你应该这样做:

$count = count($_POST['complete_date']);
$error = false;
    for($i = 0; $i < $count && ! $error; ++$i) {

    if($_POST['complete_date'][$i] > date('Y-m-d')) {
        echo error_message("Date can't be in the future");
        $error = true;

        } 
   }

  //Only process if there are no errors in all the dates
  if(! $error){
  $stmt = $link->prepare("UPDATE `units` SET `complete_date` = ? WHERE `units` = ?");
    $stmt->bind_param("si", $_POST['complete_date'][$i],$_POST['units'][$i]);
    $stmt->execute();
    $stmt->close();
    header("location: dashboard.php");
    exit();

}