【问题标题】:Invalid argument supplied for foreach() - but script still works为 foreach() 提供的参数无效 - 但脚本仍然有效
【发布时间】:2014-04-16 21:19:10
【问题描述】:

建议的问题尚未完全涵盖我的问题。我对这里的答案很感兴趣,Invalid argument supplied for foreach!,但不太明白它在我的情况下如何应用。

我有以下代码,它确实按我的预期工作;该代码通过匹配从上一页发布的作为隐藏表单给出的 id,在 mysql 数据库中找到“电子邮件”列,来构建一个电子邮件地址数组。

但是,我也收到错误消息:Invalid argument supplied for foreach() on line 50

任何帮助表示赞赏。

function findEmail($id) {
$mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DB);
if ($mysqli->connect_errno) {
    error_log("Cannot connect to MySQL: " . $mysqli->connect_error);
    return false;
}

$query = "SELECT email FROM `Students` WHERE id = '$id'";
$result = $mysqli->query($query);
while($row = $result->fetch_array()) {
    $rows[] = $row;
}
$email = "";
foreach($rows as $row) {      //This is line 50
    $email = ($row['email']);
}
return $email;
}

$userId = array();
$userEmail = array();

foreach($_POST as $key => $value) {
array_push($userId, $value);
array_push($userEmail, findEmail($value));
}

【问题讨论】:

  • 你在while循环两次然后foreach,它没有意义
  • 您似乎也只是在 foreach 循环中分配了 $email,所以最后您不是添加到变量中,而是每次都覆盖它。
  • ID 是唯一的,因此应该只有一个电子邮件地址。

标签: php mysql foreach


【解决方案1】:

这个错误不是致命的,你可以让它成为......但是错误是 $rows 没有定义——你的查询必须返回空。

【讨论】:

    【解决方案2】:

    你可能在 $rows 数组中有一个元素为 NULL,如果你 var_dump($rows) 你有任何 NULLS 吗?

    【讨论】:

    • 是的 - 事实上,尽管表单中只有隐藏元素,但 $_POST 中包含值“提交”,这会导致错误。
    【解决方案3】:

    您需要初始化变量 $rows,否则如 http://www.php.net/manual/en/control-structures.foreach.php 中所述,foreach“当您尝试在具有不同数据类型或未初始化变量的变量上使用它时会发出错误”

    所以在第 50 行之前放这个:

    $rows=null;
    

    【讨论】:

      【解决方案4】:

      函数可以这样优化:

      function findEmail($id) {
      $mysqli = new mysqli(DBHOST,DBUSER,DBPASS,DB);
      if ($mysqli->connect_errno) {
          error_log("Cannot connect to MySQL: " . $mysqli->connect_error);
          return false;
      }
      
      $query = "SELECT email FROM `Students` WHERE id = '$id'";
      $result = $mysqli->query($query);  
      
        $row = $result->fetch_array($query);
      
        return $row[0];
      }
      

      【讨论】:

        【解决方案5】:

        “提交”的值被发送到函数。添加下面的第二行解决了这个问题。

        foreach($_POST as $key => $value) {
            if($key == "submit") continue;
            array_push($userId, $value);
            array_push($userEmail, findEmail($value));
        }
        

        【讨论】:

          猜你喜欢
          • 2011-05-17
          • 2011-02-07
          相关资源
          最近更新 更多