无法使用fetch获取所有结果(PDO :: FETCH_ASSOC);

时间:2018-04-25 18:51:05

标签: php pdo

我试图根据用户ID获取网站ID列表。

这是我到目前为止所得到的。

[ { curr: *first, first: *first, last: *second } },
  { curr: *second, first: *first, last: *second } ]

这是我转到“收藏夹”表并获取与用户ID对应的所有网站ID的部分。

public function getSites(){
  $stmt = $this->db->prepare("SELECT Sites_idSites FROM favorites WHERE 
  User_idUser=:idUser");
 $userId =$_SESSION['user_session']['idUser'];
 $stmt->bindparam(":idUser", $userId);
 $stmt->execute();
 $siteList= $stmt->fetchAll(PDO::FETCH_ASSOC);

 foreach($siteList as $value){
 foreach($value as $key){
 $stmt = $this->db->prepare("SELECT * FROM sites WHERE idSites=:siteList");
 $stmt->bindparam(":siteList",$key);


 }
 $stmt->execute();
 $userSites = $stmt->fetch(PDO::FETCH_ASSOC);
 }

 return $userSites;

$ siteList以这样的数组形式返回:

$stmt = $this->db->prepare("SELECT Sites_idSites FROM favorites WHERE 
  User_idUser=:idUser");
 $userId =$_SESSION['user_session']['idUser'];
 $stmt->bindparam(":idUser", $userId);
 $stmt->execute();
 $siteList= $stmt->fetchAll(PDO::FETCH_ASSOC);

现在,我想要的是,去所有网站所在的桌子,只获得带有这些ID的那些。

这是我正在使用的,但它只获得最后一个:

Array
(
    [0] => Array
        (
            [Sites_idSites] => 20
        )

    [1] => Array
    (
        [Sites_idSites] => 21
    )

    [2] => Array
    (
        [Sites_idSites] => 22
    )

 )

如果我执行print_r($ userSites),我将返回:

foreach($siteList as $value){
    foreach($value as $key){
          $stmt = $this->db->prepare("SELECT * FROM sites WHERE idSites=:siteList");
          $stmt->bindparam(":siteList",$key);


 }
    $stmt->execute();
    $userSites = $stmt->fetch(PDO::FETCH_ASSOC);
 }

正如你所看到的,它只返回最后一个。如何让它返回包含所有网站的数组?我做错了吗?

编辑:经过这么多研究后,我们终于解决了这个问题。

Array
(
    [idSites] => 22
    [name] => rwrwer
    [url] => werwerwerwer
    [Category_idCategory] => 1
)

1 个答案:

答案 0 :(得分:2)

这是因为您在内部循环之外运行查询,您可以在其中绑定值。

foreach($siteList as $value){
    foreach($value as $key){
          $stmt = $this->db->prepare("SELECT * FROM sites WHERE idSites=:siteList");
          $stmt->bindparam(":siteList",$key);
          //bind and rebind, so only the last one "Sticks"
    }
    //run query after the loop
    $stmt->execute();
    $userSites = $stmt->fetch(PDO::FETCH_ASSOC);
}

你基本上是在每次迭代时重新绑定:siteList,然后当你最后一次绑定它时运行它" Sticks"。此外fetch只返回一行(至少没有循环)

您可以在循环中移动它然后执行fetchAll但更好的方法是构建一个列表,然后像这样使用IN()

foreach($siteList as $value){
    $i = 0;
    $ids = [];
    $where = [];
    $sql = 'SELECT * FROM sites WHERE';
    foreach($value as $key){
       $placeholder = ":id_{$i}";
       $where[] = $placeholder;
       $ids[$placeholder] = $key;
      ++$i;
    }
    $this->db->prepare($sql.' idSites IN( '.implode(',',$where).' )');
    $stmt->execute($ids);
    $userSites = $stmt->fetchAll(PDO::FETCH_ASSOC);
 }

SQL应该如下所示

SELECT * FROM sites WHERE idSites IN( :id_1,:id_2,:id_3 )

$ids数组看起来应该是这样的

$ids = [':id_1'=>1,':id_2'=>53,':id_3'=>1239];

除此之外,我只是编造了这些数字(显然)。

这样可以减少执行的查询数量。你甚至可以把它完全放在循环之外,但没有更多的上下文,我真的不能这么说。最基本的是,调用数据库是昂贵的,你应该尽可能少地尝试这样做。

相关问题