PHP数组通过foreach进行验证

时间:2012-08-16 17:17:01

标签: php arrays validation foreach

我正在做PHP的教程。我在CRUD课程的更新部分,正在处理验证脚本。我完全遵循了代码...我认为但仍然无法正常工作。这是问题:当我单击“提交”以尝试使用菜单名称字段为空来测试验证时,它会通过而没有错误...并使用空列表项更新导航?我查看了代码,所有内容似乎都是正确的,但我对此非常新,所以问题很容易被忽视。

以下是代码:

if(isset($_POST['submit'])) {
    $errors = array();

    $required_fields = array('menu_name', 'position', 'visible');   
    foreach($required_fields as $fieldname) {
        if(!isset($_POST[$fieldname]) || (empty($_POST[$fieldname]) && $_POST[$fieldname] != 0) ) {
            $errors[] = $fieldname;
        }
    }

    if(empty($errors)) {
        //Perform Update
        $id = mysql_prep($_GET['subj']);
        $menu_name = mysql_prep($_POST['menu_name']);
        $position = mysql_prep($_POST['position']);
        $visible = mysql_prep($_POST['visible']);

        $query = "UPDATE subjects SET
                    menu_name = '{$menu_name}',
                    position = {$position},
                    visible = {$visible} WHERE id = {$id}";

        $result = mysql_query($query, $connection);

        if(mysql_affected_rows() == 1){
            // success
            $message = "Subject was sucessfully updated"; 
        }else{
            $message = "The subject update failed.";
            $message .= "<br />" . mysql_error();
        }
    }else{
        //error occured
        $message = "There were " . count($errors) . " errors in the form.";
    }
} // end if(isset($_POST['submit']) )
?>

来自身体的代码:

<h2>Edit Subject: <?php echo $sel_subject['menu_name']; ?></h2>
<?php 
    if(!empty($message)){
        echo "<p class=\"message\">" . $message . "</p>";
    }
?>
<?php
    if(!empty($errors)){
        echo "<p class=\"errors\">";
        echo "Please review the folowing fields: <br />";
        foreach($errors as $error){
            echo "-" . $error . "</p>";
        }
    }
?>

现在当我更改(空($ _ POST [$ fieldname])为(空($ _ POST ['menu_name'])时,它会发出错误,但它们是针对位置和可见字段恰好是正确的... ?是否遗漏了一些我无法看到的角色。我做了大部分复制和粘贴以防止那些愚蠢的错误。注意:位置和可见的验证确实有效...我想......既然你不管怎么说,我不知道这些领域是否空白......

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

错误就在这里:

$_POST[$fieldname] != 0

空字符串= 0,因为0为假。所以在你的if语句中,你说它是否为空(它是)并且不等于0(它就是这样)。

你能做的是

  1. 完全删除!= 0语句,因为空将执行一个大工作检查。
  2. 使用正确的运算符:!==“0”,如果您想接受“0”作为选项。
  3. 当您使用3等于或!==时,它会根据类型进行验证。 0 === 0,0 == false,“0”== 0,“0”== false,false === false,但是0!== false,0!==“0”和“0 “!==假。 我希望这是有道理的。

    修改

    让我们通过一系列测试进一步将它运行到地面。

    $a='';
    $b="0";
    if(empty($a))
        echo'$a is empty<br/>';
    if(empty($b))
        echo'$b is empty<br/>';
    if($a!=0)
        echo'$a does not equal 0/false<br/>';
    if($b!=0)
        echo'$b does not equal 0/false<br/>';
    if($a!==0)
        echo'$a does not equal integer 0<br/>';
    if($b!==0)
        echo'$b does not equal integer 0<br/>';
    if($a!=="0")
        echo'$a does not equal string 0<br/>';
    if($b!=="0")
        echo'$b does not equal string 0<br/>';
    

    上面的输出是

    $a is empty
    $b is empty
    $a does not equal integer 0
    $b does not equal integer 0
    $a does not equal string 0
    

    结论: $a==$b$a!==$b$a$b==0==false,它们都不是整数,都是字符串,空字符串与包含0字符的字符串不同。

    $_POST[$fieldname]!=0更改为$_POST[$fieldname]!=="0"