Не могу получить все результаты, используя fetch (PDO :: FETCH_ASSOC); - PullRequest
0 голосов
/ 25 апреля 2018

ребята, я пытаюсь получить список идентификаторов сайтов в соответствии с идентификатором пользователя.

Это то, что я получил до сих пор.

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;

Это часть, в которую я захожу в таблицу «Избранное» и получаю все идентификаторы сайта, соответствующие идентификатору пользователя.

$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);

$ siteList возвращается в виде массива, подобногоэто:

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

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

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

 )

Теперь я хочу пойти к таблице, где находятся все сайты, и получить только те с этими идентификаторами.

Это то, что я использую, но этополучает только последний:

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);
 }

Если я сделаю print_r ($ userSites), я вернусь:

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

Как вы можете видеть, он возвращает только последний.Как мне сделать так, чтобы он возвращал массив со всеми сайтами в нем?Я что-то не так делаю?

РЕДАКТИРОВАТЬ: Привет, ребята, после стольких исследований я наконец-то исправил это.

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



    return $siteList;
  }

1 Ответ

0 голосов
/ 25 апреля 2018

Это потому, что вы выполняете запрос вне внутреннего цикла, в котором вы связываете значения.

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 на каждой итерации, тогда когда вы запускаете его толькоВ прошлый раз вы связали его «Палками».Также 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];

За исключением того, что я просто составил эти цифры (очевидно).

Таким образом, вы можете уменьшить количество запросов, которые вы выполняете.Вы можете даже быть в состоянии поместить это вне цикла (ов) полностью, но без большего контекста я не могу действительно сказать это.Основным является то, что вызов БД стоит дорого, и вы должны стараться делать это как можно меньше раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...