【问题标题】:isset check inside foreach loopforeach 循环内的 isset 检查
【发布时间】:2014-01-18 01:51:59
【问题描述】:

抱歉,如果这是一个愚蠢的问题,但我现在正在学习 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() 检查。我只是想知道这是否是预期的行为,如果是,为什么?

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

【问题讨论】:

  • 我在 foreach 循环内部和外部得到未定义的索引,正如预期的那样,使用 php 5.3.10。你用的是什么版本?
  • for each 循环中可能没有任何内容.. :)
  • 能否在 foreach 循环中回显 $_POST['dorm'] 和 $dorm 的值,然后您就可以知道是什么值了。
  • 你在 if 语句的右括号后错过了关闭的 php 标签。
  • 你的 foreach 剂量只工作一次

标签: php post foreach isset


【解决方案1】:

$DORMS 为空时,foreach 内不会出现通知或错误。当$DORMS 为空时,foreach 内的代码不会被执行。当您在$DORMS 中有一些价值时,您可以使用chrome dev toolsfirebug 看到该通知。

编辑

通知与foreach 循环无关。您看不到通知,因为它是在 html 中的 &lt;select&gt; 元素内生成的。浏览器未显示&lt;select&gt; 内的任何正常文本。如果您的 foreach 循环位于 &lt;p&gt; 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>

【讨论】:

  • 感谢您的评论。 $DORMS 是一个分配有 9 个字符串的数组。而且我很确定 foreach 代码正在执行,因为选择元素在页面上正确呈现。我只是没有收到预期的错误消息。
  • 然后您可以使用 firebug 或 chrome 开发工具看到该错误消息。它在页面源代码内。
  • 是的,你是对的!错误确实出现在萤火虫中。奇怪的是,当代码在 foreach 循环之外时会在页面上弹出通知,但在循环内部时不会。感谢您的帮助!
  • 这并不奇怪。如果这个“foreach”循环在&lt;p&gt; html 标记内,您可以看到该消息。它在&lt;select&gt; 里面。选择中的普通文本不会在浏览器中显示。
  • 我想我的意思是这对我来说很奇怪。但既然你解释了它,它就很有意义了。再次感谢!
【解决方案2】:

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

if($_POST){
   ...
}

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

【讨论】:

  • 感谢 Yogesh。这是有道理的,但我试图弄清楚为什么我没有在我的 foreach 循环中运行检查时没有收到未定义的通知。
  • 它实际上是在抛出警告消息,但是由于您使用了 select 标签,因此警告消息会在它下面。由于 select 标记旨在仅显示包含的选项标记,因此忽略选项标记之外的文本(此处为警告消息)。
【解决方案3】:

这可能是因为它没有进入循环

【讨论】:

    【解决方案4】:

    试试这个

      <?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】:

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

      您应该为所选宿舍设置另一个变量,并使用isset 检查来保护它:

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

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

      【讨论】:

      • 默认情况下不发帖怎么办。在这种情况下,将不会创建 select。
      • 感谢 Barmar 的回复。这是有道理的,我相信它会起作用。我只是想从概念上理解为什么当我没有在我的 foreach 循环中运行 isset 检查时我没有收到错误。我没有将它包含在我的原始帖子中,但是 $DORMS 数组分配了 9 个字符串值。我很确定 foreach 循环正在执行,因为选择在页面上正确呈现。
      【解决方案6】:

      正如其他人所说,空的 $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>";
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-08-09
        • 2016-11-30
        • 1970-01-01
        • 2016-09-26
        • 2012-07-19
        • 2019-09-04
        • 2021-12-12
        • 2012-07-28
        • 2020-04-15
        相关资源
        最近更新 更多