Alors, une fois n'est pas coutume, je viens vers vous avec un code qui marche, par contre, je comprends pas trop comment ^^.
Je vous explique:
J'ai une table SQL qui contient les champs relatifs aux entrées d'un formulaire de publication d'annonces (id, titre, categories etc...)
(Juste une petite parenthèse ici, c'est une mauvaise pratique d'écrire les noms de ses champs/tables/bdd avec des accents non ?)
Je voulais sur ma page index, afficher le nombre d'annonces par catégories. Pour obtenir quelque chose du genre:
Chaussures (3000)
Sweat-shirt (500)
Jogging (447)
Du coup, j'ai créé une fonction dont le seul but serait de compter le nombre d'éléments dans les champs en BDD, dont les noms lui seront passés en paramètres:
Le "problème" viens de ce que j'ai du faire dans la fonction PHP, pour qu'elle affiche le résultat attendu
$xCategoryCounted['count(*)'];
J'aurais cru qu'avec un count(*) dans mon SELECT, le résultat de l’exécution de la requête serait un nombre, mais en faisant un print_r sur la variable
$xCategoryCounted
je me suis rendu compte que c'était un tableau associatif, avec une unique clé 'count(*)' dont la valeur était la variable que je voulais atteindre.
Dans mes recherches sur le sujet, après un count(*) les gens utilisaient le résultat de l’exécution de la requête, tel quel: où est-ce que j'ai merdé ? (pardon pour l'expression et merci à tous ceux et toutes celles qui me liront)
You are now about to witness the strength of street knowledge
Yep, fetch renvoie les valeurs des colonnes de la ligne courante sous forme de tableau ou objet.
Si tu veux directement un scalaire (un entier ici), c'est un fetchColumn qu'il aurait fallu faire (return $prepared->fetchColumn();)
Mais au final, ça ne change rien au code : fetchColumn te fait gagner une ligne (encore que tu pourrais écrire return $prepared->fetch(PDO::FETCH_ASSOC)['count(*)'];). Pas de quoi qualifier ce code de crade pour autant.
> les gens utilisaient le résultat de l’exécution de la requête, tel quel
Euh, non, à moins qu'ils n'aient utilisé fetchColumn (voire même bindColumn éventuellement d'ailleurs), tu as dû mal lire leur code. Ou alors c'était des codes mysqli avec un bind_result (c'est l'équivalent du bindColumn de PDO).
Par contre, tu pourrais éventuellement optimiser ton code pour ne faire qu'une requête (SELECT categorie, count(*) FROM annonces /*WHERE categorie IN('Pantalon', 'Chaussure', 'tShirt')*/ GROUP BY categorie). Tu renvoies le résultat d'un fetchAll(PDO::FETCH_KEY_PAIR) pour remplacer les countByCategory('X') par $resultat['X']. Et en profiter pour déplacer le(s) appel(s) de countByCategory de la vue au contrôleur.
$count_by_cat = $bdd->query('SELECT categorie, count(*) FROM annonces /*WHERE categorie IN('Pantalon', 'Chaussure', 'tShirt')*/ GROUP BY categorie')->fetchAll(PDO::FETCH_KEY_PAIR);
echo $count_by_cat['tShirt'];
echo $count_by_cat['Chaussure'];
Merci pour votre participation et pour les indications pour optimiser mon code julp
J'aurais encore 2/3 questions à vous poser svp. Est-ce que vous connaitriez des tutoriels grâce auxquels je pourrai actualiser le nombre d'annonces par catégories sans avoir à recharger la page ? Je suppose que c'est possible de le faire avec de l'Ajax . Et quel est l'impact d'un tel procédé sur les performances de la page ? (Est-ce que la page en est ralenti? Si oui, suffisamment pour que ça puisse causer une gêne à l'utilisateur ?)
You are now about to witness the strength of street knowledge
> Est-ce que vous connaitriez des tutoriels grâce auxquels je pourrai actualiser le nombre d'annonces par catégories sans avoir à recharger la page ?
Pas en PHP, non.
> Je suppose que c'est possible de le faire avec de l'Ajax
L'idéal serait par websocket ou si c'est unidirectionnel (serveur => client) via SSE (Server Sent Event)
> Et quel est l'impact d'un tel procédé sur les performances de la page ?
Pour le client ou le serveur ? Si c'est bien fait, ça pourrait même profiter au serveur par rapport à un spam de F5 de la part des clients et l'impact pour le client serait négligeable. C'est tout de même difficilement estimable/quantifiable, ça dépend du besoin, si c'est bien implémenté/conçu et surtout en adéquation avec ce besoin.
Cela permet de pousser du contenu à interval régulier du serveur vers les navigateurs.Il y a plein de tutos sur le sujet et c'est simple à mettre en oeuvre.
Enfin le websocket ... plus complexe.
Pour tous ces procédés que j'utilise sur mon site, je ne vois pas d'impacts sur les performances mais plus sur la complexité à faire.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Pas d'aide concernant le code par MP, le forum est là pour ça :)