这是我到目前为止所得到的。
[ { 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
)
答案 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];
除此之外,我只是编造了这些数字(显然)。
这样可以减少执行的查询数量。你甚至可以把它完全放在循环之外,但没有更多的上下文,我真的不能这么说。最基本的是,调用数据库是昂贵的,你应该尽可能少地尝试这样做。