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 ! :)
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,
Es-tu sûr que ta classe PDO est bien instanciée ? A quoi ressemble ta méthode query ?
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
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