在foreach循环内的isset检查

时间:2013-12-31 05:10:25

标签: php post foreach isset

道歉,如果这是一个愚蠢的问题,但我现在正在学习PHP而且我遇到了关于对$ _POST值进行isset检查的问题,该值可能存在也可能不存在,具体取决于用户是否提交了形式与否。

如果我在foreach循环的上下文之外执行以下操作,我会得到一个未定义的索引消息(当表单尚未提交时),正如我所期望的那样:

if ($_POST['dorm'] == "somethingrandom"){ ... }

据我了解,我收到此错误,因为$ _POST值不存在,我需要通过isset()或!empty()检查运行它,而不是假设它存在。但是如果我在foreach循环中有完全相同的代码,我就不会收到错误:

<form action="test.php" method="post">
<select name="dorm">
<?php foreach ($DORMS as $dorm){
    if ($_POST['dorm'] == $dorm){
        echo "<option selected value=\"$dorm\">$dorm</option>";
    } else {
        echo "<option value=\"$dorm\">$dorm</option>";
    }
}
?> // end php tag
</select>
</form>

同样,上面的代码没有创建错误,即使我没有进行任何isset()或!empty()检查。我只是想知道这是否是预期的行为,如果是,为什么?

任何澄清将不胜感激!谢谢。

6 个答案:

答案 0 :(得分:1)

$DORMS为空时,预计foreach内部不会出现任何通知或错误。当foreach为空时,$DORMS内的代码无法执行。如果您在$DORMS中有一些价值,则可以使用chrome dev toolsfirebug看到该通知。

enter image description here

修改

注意与foreach循环无关。您没有看到通知,因为它是在html中的<select>元素内生成的。浏览器未显示<select>内的任何普通文本。如果您的foreach循环位于<p> html元素内,您可以在浏览器输出该消息时看到该消息。

<p>
<?php foreach ($DORMS as $dorm){
    if ($_POST['dorm'] == $dorm){
        echo "<option selected value=\"$dorm\">$dorm</option>";
    } else {
        echo "<option value=\"$dorm\">$dorm</option>";
    }
}
?>
</p>

答案 1 :(得分:0)

您可以通过两种方式检查表单是否通过POST方法提交

if($_POST){
   ...
}

if(isset($_POST['your_variable'])){
   ...
}

答案 2 :(得分:0)

这样做的唯一原因是因为数组$DORMS为空。在这种情况下,foreach循环将永远不会执行正文,因此它永远不会尝试访问不存在的$_POST['dorm']

您应该做的是将另一个变量设置为选定的宿舍,并通过isset检查来保护它:

$dorm_input = isset($_POST['dorm']) ? $_POST['dorm] : null;

然后在循环中检查if ($dorm == $dorm_input)

答案 3 :(得分:0)

这可能会发生,因为它没有进入循环

答案 4 :(得分:0)

试试这个

  <?php
    if (isset($_POST['dorm'])) 
  {
    $DORMS = $rows; //array from database
    foreach($DORMS  as $dorm){
         if($row['dorm'] == $_POST['dorm']){
              $isSelected = ' selected="selected"'; // if the option submited in form is as same as this row we add the selected tag
         } else {
              $isSelected = ''; // else we remove any tag
         }
         echo "<option value='".$row['id']."'".$isSelected.">".$row['name']."</option>";
       }
  }
    ?>

答案 5 :(得分:0)

正如其他人所说,空的$ DORMS可能是没有得到通知的原因。要检查您的代码,您可以执行类似的操作。

if (is_array($DORMS) && sizeof($DORMS) > 0) {
    foreach ($DORMS as $dorm) {
        if (isset($_POST['dorm']) && $_POST['dorm'] == $dorm){
            echo "<option selected value=\"$dorm\">$dorm</option>";
        } else {
            echo "<option value=\"$dorm\">$dorm</option>";
        }
    }
}