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


SLK
Réponse acceptée

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.

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

Salut,

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

Jenjak
Auteur

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

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

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
Auteur

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 :)

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