【问题标题】:PHP array through foreach for validationPHP数组通过foreach进行验证
【发布时间】:2012-08-16 17:17:01
【问题描述】:

我正在做一个关于 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']) 时,它会吐出错误,但它们是针对恰好正确的位置和可见字段... ?有没有遗漏的字符,我只是看不到。我做了大部分复制和粘贴来防止那些愚蠢的错误。注意:对位置和可见的验证确实有效......我认为......因为你无论如何不能将这些字段留空我怎么知道...

非常感谢任何帮助。

【问题讨论】:

  • 您是否尝试过回显 SQL 查询以确保它看起来像您认为的那样?
  • 您能否提供更多信息,您能否在代码顶部执行 var_dump($_POST) 并提供输出?
  • 转储给了我这个:array 'menu_name' => string '' (length=0) 'position' => string '7' (length=1) 'visible' => string '1 ' (length=1) 'submit' => string '编辑主题' (length=12)

标签: php arrays validation foreach


【解决方案1】:

错误就在这里:

$_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$a AND $b==0==false,它们都不是整数,都是字符串,并且空字符串与包含0 的字符串不同字符。

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

【讨论】:

  • $_POST[$fieldname] 永远不会=== 0
  • 非常正确,它始终是一个字符串,所以它可能应该被删除。
  • 视频说 $_POST[$fieldname] != 0) 用于可见字段,因为可见性关闭 = 0 那么你会得到一个错误......有意义吗?
  • 将其更改为:!=="0",因为它是字段提交的字符串,可能等于“0”或“1”。视频会让你误入歧途。
  • @user980988 我为你打败了众所周知的死马。
猜你喜欢
  • 2018-03-17
  • 2016-06-07
  • 1970-01-01
  • 2023-03-14
  • 2014-01-12
  • 1970-01-01
  • 2010-10-01
  • 2011-09-09
  • 2015-04-06
相关资源
最近更新 更多