je sais que cette erreur est courante mais dans mon cas je pense c'est different et j'espere que vous allez pouvoir m'aider!

je veux filtrer par rapport à la session d'un Admin et je vois si l'adminitrateur n'a pas de publication j'ai butté sur cette erreur "Call to a member function fetchAll() on bool" par conte s'il en a elle me retourne le resultat!
mon code:

//Trouver les articles et les catégories avec la pagination en fonction de la session de l' ADM et retourner les resultats
public function findPaginatedSession($session){
$paginated = new Paginated(
" SELECT post.id, post.name, post.content, post.created_at, users.username
FROM post
INNER JOIN users
ON post.session_admin = users.id
WHERE publier = '0' AND post.session_admin = $session
ORDER BY post.created_at DESC",
"SELECT COUNT(id) FROM {$this->table}"
);
$post = $paginated->getItems($this->class);
(new CategoryTable($this->pdo))->hydratePost($post);
return [$post , $paginated];
}

// Rechercher les articles avec la pagination

public function getItems($classMapping): array
   {if($this->items === null){         
      $currentPage = Url::getPositiveInt('page', 1);
      $page = $this->getPage(); 
      if($currentPage > $page){
          throw new \Exception("Cette page  n'existe pas");
      }
      $offset = $this->perPage * ($currentPage -1);
          return $this->items = $this->pdo->query(
              $this->query .
              " LIMIT {$this->perPage} OFFSET $offset")
              ->fetchAll(PDO::FETCH_CLASS, $classMapping);
          }
          return $this->items;
   }

/// Rechercher les categorie a partir d'id des articles trouver//
public function hydratePostSess(array $post){
$postById = [];
foreach($post as $posts){
$posts->setCategories([]);
$postById[$posts->getId()] = $posts;
}
$categorie = $this->pdo
->query('SELECT c.*, pc.post_id
FROM post_category pc
JOIN category c ON c.id = pc.category_id
WHERE pc.post_id IN (' . implode(',', array_keys($postById)) . ')
')->fetchAll(PDO::FETCH_CLASS, $this->class); /// elle m'a indiqué que l'erreur se trouve ici

         foreach($categorie as $category){
            $postById[$category->getPostId()]->addCategory($category);
         }
    }

7 réponses


je sais que cette erreur est courante mais dans mon cas je pense c'est different et j'espere que vous allez pouvoir m'aider!

je veux filtrer par rapport à la session d'un Admin et je vois si l'adminitrateur n'a pas de publication j'ai butté sur cette erreur "Call to a member function fetchAll() on bool" par conte s'il en a elle me retourne le resultat!
mon code:

//Trouver les articles et les catégories avec la pagination en fonction de la session de l' ADM et retourner les resultats

public function findPaginatedSession($session){
$paginated = new Paginated(
" SELECT post.id, post.name, post.content, post.created_at, users.username
FROM post
INNER JOIN users
ON post.session_admin = users.id
WHERE publier = '0' AND post.session_admin = $session
ORDER BY post.created_at DESC",
"SELECT COUNT(id) FROM {$this->table}"
);
$post = $paginated->getItems($this->class);
(new CategoryTable($this->pdo))->hydratePost($post);
return [$post , $paginated];

}

// Rechercher les articles avec la pagination

public function getItems($classMapping): array
{if($this->items === null){
$currentPage = Url::getPositiveInt('page', 1);
$page = $this->getPage();
if($currentPage > $page){
throw new \Exception("Cette page n'existe pas");
}
$offset = $this->perPage * ($currentPage -1);
return $this->items = $this->pdo->query(
$this->query .
" LIMIT {$this->perPage} OFFSET $offset")
->fetchAll(PDO::FETCH_CLASS, $classMapping);
}
return $this->items;
}

// Rechercher les categorie a partir d'id des articles trouver

public function hydratePostSess(array $post){
$postById = [];
foreach($post as $posts){
$posts->setCategories([]);
$postById[$posts->getId()] = $posts;
}
$categorie = $this->pdo
->query('SELECT c.*, pc.post_id
FROM post_category pc
JOIN category c ON c.id = pc.category_id
WHERE pc.post_id IN (' . implode(',', array_keys($postById)) . ')
')->fetchAll(PDO::FETCH_CLASS, $this->class); /// elle m'a indiqué que l'erreur se trouve ici

     foreach($categorie as $category){
        $postById[$category->getPostId()]->addCategory($category);
     }
}

Bonjour,

Le problème se situe probablement au niveau de la requête executée via "$this->pdo->query".

Comme dit la doc : "PDO::query() retourne un objet PDOStatement, ou FALSE si une erreur survient. "

Du coup appeler une quelconque methode à partir de FALSE (donc un Bool...) ben ça fonctionne pas trop bien...

Tu me suggères quoi?

J'essaie de remplacer le query() par prepare() mais ça ne marche pas

  1. Est-ce que tu est sur de ta requête ? a tu essayé de la passer avec un éditeur SQL comme celui de phpMyAdmin par exemple ?
  2. A tu essayé de faire un "PDO::errorInfo" ?

Ok, je vais l'essayer dans le phpMyAdmin

Bonjour.
Le plus simple, c'est qu'au lieu de chainer les méthodes query et fetchAll, tu devris plutôt stocker le retour de la méthode query dans une variable, selon sa valeur, soit tu retournes false ou alors tu retournes le résultat de la méthode fetchAll.
Exemple :

$query = $this->pdo->query("{$this->query} LIMIT {$this->perPage} OFFSET $offset");
if ($query !== false) {
    return $query->fetchAll();
}
return $query; // Qui dans ce cas là vaut false