【问题标题】:Invalid argument supplied for foreach() search results为 foreach() 搜索结果提供的参数无效
【发布时间】:2018-10-17 05:24:20
【问题描述】:

我正在尝试在我的 Web 应用程序中实现一个过滤系统,用户可以通过该系统按类别过滤他们的项目列表。但是,正在显示以下错误消息

"Invalid argument supplied for foreach() in foreach ($item as $key => $val)" 

我不完全确定为什么。我尝试了各种方法来克服这个问题,例如尝试将$items 设置为数组,但仍然没有成功。在没有实施搜索系统的情况下,特定用户的项目会正确显示,但是一旦我实施过滤器,就会显示上面的错误消息。任何建议将不胜感激。

items.php

<div class="card">
    <div class="card-header">Items</div>
        <form action="" method="post">
            <div class="form-group">
                <label for="name">Search for Items</label>
                    <input type="text" class="form-control" id="search" name="search">
            </div>
            <button type="submit">Search</button>
        </form>
        <div class="card-body items">
           <table class = "items">

           <?php
           $itemsObject = new items($database); 
           $item = $itemsObject->getItemsForUser($_SESSION['userData']['userid'], $_POST['search']); 
           foreach ($item as $key => $val) { 
              echo '<tr><td>'.$val['cat_name'].'</td><td>'.$val['amount'].'</td></tr>';   
      }
?>
           </table>
       </div>
   </div>
</div>

items.classes.php

   public function getItemsForUser($userid, $search = null){
      if(!isset($search)){
        $query = "SELECT i.*, c.cat_name, c.cat_id FROM items AS i INNER JOIN categories AS c ON i.cat_id = c.cat_id WHERE userid = :userid";
        $pdo = $this->db->prepare($query);
        $pdo->bindParam(':userid', $userid);
        } else {
                $query = "SELECT i.*, c.cat_name, c.cat_id FROM items AS i INNER JOIN categories AS c ON i.cat_id = c.cat_id WHERE userid = :userid AND c.cat_name LIKE :search";
            $pdo = $this->db->prepare($query);
            $pdo->bindParam(':userid', $userid);
            $pdo->bindParam(':search', $search);
        }
       $pdo->execute();
       return $pdo->fetchAll();
    }

【问题讨论】:

  • 检查您的 $item 数组是否为空或未使用 print_r($item);die();
  • 您的 items.classes.php 中有一个 TYPO 错误。像这样,$query = "SELECT i.*, c.cat_name, c.cat_id FROM items AS i INNER JOIN categories AS c ON i.cat_id = c.cat_id WHERE userid = :userid";
  • 你错过了行尾的 (") $query = "SELECT i.*, c.cat_name, c.cat_id FROM items AS i INNER JOIN categories AS c ON i.cat_id = c.cat_id WHERE userid = :userid;

标签: php html mysql pdo


【解决方案1】:

将执行查询放在 if/else 之外

if(isset($search)){
    $search = '%'.$search.'%';
    $query = "SELECT i.*, c.cat_name, c.cat_id FROM items AS i INNER JOIN categories AS c ON i.cat_id = c.cat_id WHERE userid = :userid AND c.cat_name LIKE :search";
    $pdo = $this->db->prepare($query);
    $pdo->bindParam(':userid', $userid);
    $pdo->bindParam(':search', $search);
} else {
        $query = "SELECT i.*, c.cat_name, c.cat_id FROM items AS i INNER JOIN categories AS c ON i.cat_id = c.cat_id WHERE userid = :userid";
        $pdo = $this->db->prepare($query);
        $pdo->bindParam(':userid', $userid);
}

$pdo->execute(); // <---- HERE
return $pdo->fetchAll();

【讨论】:

  • 这消除了错误,但是表格不再显示?
  • 可能是因为你没有任何结果
  • 我重新安排了查询的结构,但是结果没有被过滤,我不完全确定为什么。有什么建议吗?
  • 如果您从查询中删除过滤器(只是 SELECT * FROM 表),它会返回任何结果吗?
  • 我已经整理好了,不过感谢您的帮助!另外,如果我想在不刷新页面的情况下清除搜索,我该怎么做呢?
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 2011-02-07
相关资源
最近更新 更多