0

我正在做一个关于 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>";
        }
    }
?>

现在,当我将 (empty($_POST[$fieldname]) 更改为 (empty($_POST['menu_name']) 时,它会吐出错误,但它们是针对恰好正确的位置和可见字段...?有吗?一个我看不到的角色被遗漏了。我主要是复制和粘贴来防止那些愚蠢的错误。注意:对位置和可见性的验证确实有效......我认为......因为你不能离开那些无论如何,字段都是空白的,我怎么知道...

任何帮助是极大的赞赏。

4

1 回答 1

2

错误就在这里:

$_POST[$fieldname] != 0

空字符串 = 0,因为 0 为假。因此,在您的 if 语句中,您说它是否为空(它是)并且不等于 0(它确实如此)。

你能做的是

  1. 完全删除 !=0 语句,因为空的语句会很好地检查它。
  2. 如果您想接受“0”作为选项,请使用正确的运算符:!=="0"。

当您使用 3 等于或 !== 时,它会针对类型进行验证。0===0, 0==false, "0"==0, "0"==false, and 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. $aAND$b==to0==to false,它们都不是整数,都是字符串,空字符串和包含0字符的字符串是不一样的。

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

于 2012-08-16T17:52:39.113 回答