Retourner résultat d'un SUM en PDO

Par Jenjak, il y a 9 ans


Salut à tous !

Je suis bloqué depuis un petit moment sur un soucis à savoir l'affichage d'une requête SUM.

Ma requête à l'air OK quand je la test (j'ai bien le bon nombre de points), par contre pour afficher le résultat je reste bloqué, j'ai suivi un peu des tutos sur le net mais rien n'y fait, voici mon code:

$total_points = $DB->query("SELECT SUM(produits.points) AS total FROM commandes JOIN produits WHERE commandes.service=produits.id AND commandes.numero='1486543639'"); $row = $total_points->fetch(); $total = $row['total']; echo "Total : " . $total;

J'ai utilisé plusieurs méthodes mais j'ai toujours une erreur du type:

Fatal error: Call to a member function fetch() on array in C:\XAMPP\htdocs\projets\test.php on line 7

Merci d'avance pour votre aide précieuse ! :)

8 réponses

Thomas Chicheportiche, il y a 9 ans

Salut,
Si tu debug $row, que t'affiche t'il?

betaWeb, il y a 9 ans

Salut,

Es-tu sûr que ta classe PDO est bien instanciée ? A quoi ressemble ta méthode query ?

Jenjak, il y a 9 ans

Bonjour à vous deux,

Comment fait on pour débugger ?

Voici ma fonction query

public function query($sql, $data = array()){ $req =$this->db->prepare($sql); $req->execute($data); return $req->fetchAll(PDO::FETCH_OBJ); }
SLK, il y a 9 ans

Salut,

ah mais tu fais un fetchAll() (dans la fonction 'query'),
puis tu fais un fetch() juste après (hors de la fonction 'query').

Il faut choisir entre les 2.

Tu peux peut-être rajouter un paramètre dans ta fonction 'query' :

public function query($sql, $data = array(), $only_one = false) {

Et vu que ta fonction 'query' lance une requête préparée, autant utiliser le paramètre 'data')

public function query($sql, $data = array(), $only_one = false) { $req = $this->db->prepare($sql); $req->execute($data); if ($only_one) { return $req->fetch(PDO::FETCH_OBJ); } return $req->fetchAll(PDO::FETCH_OBJ); } $row = $DB->query('SELECT SUM(produits.points) AS total FROM commandes JOIN produits WHERE commandes.service = produits.id AND commandes.numero = ?', [1486543639], true); // $only_one à 'true' pour faire un 'fetch' au lieu d'un 'fetchAll' $total = $row['total']; echo "Total : " . $total;

PS :
Pour "débuguer" il y a des outils, au moins ceux du navigateur,
mais une façon "bourrine" pour débuguer est de mettre des echo, ou var_dump(), ou print_r() à différents endroits de ton code (aux endroits intéressants) pour "suivre" l'évolution des variables.

Huggy, il y a 9 ans

Tu as une erreur dans ta requête SQL et du coup la méthode query retourne false et pas un statement
conséquence le fetch ne peut pas marcher car pas d'objet
l'erreur vient de ta requête qui a besoin d'un GROUP BY pour sommer les articles

SLK, il y a 9 ans

Mais l'erreur dit Call to a member function fetch() on array
pas on boolean

la fonction 'query' renvoie un tableau à cause du fetchAll().

Après tu as peut-être raison en disant que la requête est mal écrite,
moi je suis trop mauvais en SQL pour dire si c'est vrai ou pas xD

Jenjak, il y a 9 ans

Génial merci à vous tous !

Ca fonctionne parfaitement, j'ai juste changé le $req->fetchAll(PDO::FETCH_OBJ); en $req->fetch(PDO::FETCH_ASSOC) dans la condition $only_one

Vous m'aidez à progresser et à comprendre mes erreurs, encore un grand merci :)

Huggy, il y a 9 ans

Ah ok j'avais pas remarqué qu'il y avait 2 méthodes query
du coup c'est clair, il y a appel de fetch sur le résultat d'un fetchAll (Array)
c'est une très mauvaise idée de réutiliser les mêmes noms de méthodes lorsqu'on Wrappe