Page 1 sur 2
Affiché le nombre total de vote par note
Posté : 28 oct. 2019, 12:29
par yoann38
Salut tout le monde,
Voilà j'ai une table dans laquelle je stock les avis des entreprises.
J'aimerais maintenant pouvoir affiché le nombre total de vote pour la note 3 par exemple et faire de la sortie pour les notes de 1 à 5.
J'ai donc fait ma requete ainsi qu'une boucle pour trouver tous les votes de l'entreprise
<?php
$note_avis = $bdd->prepare("SELECT * FROM bars LEFT JOIN avis ON bars.id = avis.id_bar WHERE id=:id GROUP BY note ORDER by note");
$note_avis->bindValue(':id', $bar_id, PDO::PARAM_INT);
$note_avis->execute();
while($nbr_par_note = $note_avis->fetch(PDO::FETCH_ASSOC)){
echo $nbr_par_note['note'].'<br>';
}
?>
Je cherche maintenant à affiché par exemple:
73 votes pour la note 3,
45 votes pour la note 5,
Ainsi de suite, merci pour vos précieux conseils à venir

Re: Affiché le nombre total de vote par note
Posté : 28 oct. 2019, 21:41
par Naroth
Bonsoir,
Regarde du côté de la fonction
count en plus de ton group by
Re: Affiché le nombre total de vote par note
Posté : 30 oct. 2019, 11:33
par yoann38
Le but est d'affiché le nombre de vote par note de 1 à 5
Du coup j'ai fait un count et calculer le pourcentage de votes selon la note.
Mais je souhaite avoir toutes les notes de 1 à 5, dans mon cas si pas de note de 4 alors rien ne s'affiche :
Code actuel:
<?php
// Progresse bar nombre de vote par Note
$count_vote= "SELECT COUNT(*) AS nb_par_note, note AS total FROM `avis` WHERE `id_bar`= $bar_id GROUP BY note ORDER BY note";
$listing_note = $bdd->prepare($count_vote);
$listing_note->bindParam(':id_bar', $bar_id);
$listing_note->execute();
while($listing_by_note = $listing_note->fetch(PDO::FETCH_ASSOC)){
// Pourcentage = Nombre de vote correspond à la note * 100 diviser par le nombre total de vote pour l'établissement
$pourcentage_vote = $listing_by_note['nb_par_note'] * 100 / $avis_note['nb_vote'];
echo '<div class="row">
<div class="col-lg-10 col-9">
<div class="progress">
<div class="progress-bar" role="progressbar" style="width:'.$pourcentage_vote.'%" aria-valuenow="'.$pourcentage_vote.'" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
<div class="col-lg-2 col-3"><small><strong>'.$listing_by_note['nb_par_note'].'</strong></small></div>
</div>';
}
?>
Re: Affiché le nombre total de vote par note
Posté : 30 oct. 2019, 16:36
par Naroth
Attend je me suis peut être emballé.
A quoi ressemble la structure de ta table ?
Suite à ton premier message, j'ai déduis que tu avais une table contenant une colonne "note" et une colonne "nb_par_vote" stockant le nombre de votre par note
Ai-je mal compris ?
Re: Affiché le nombre total de vote par note
Posté : 31 oct. 2019, 10:43
par yoann38
Alors pour illustré ce que je souhaite, voilà un célèbre site utilisant ce que je souhaite faire: ( Note attribué )
https://www.tripadvisor.fr/AttractionPr ... rance.html
Pour ce qui est de la table:
http://zupimages.net/viewer.php?id=19/44/206k.jpg
L'idée est d'avoir du coup tous les notes affiché de 1 à 5 et le nombres de votes qu'il y a eu pour chaque notes, même si il y en à pas eu pour certaines....
Coté code:
Je repars de zéro, juste avec ma requete et mon array souhaité:
// Progresse bar nombre de vote par Note
$count_vote= "SELECT COUNT(*) AS nb_par_note, note AS total FROM `avis` WHERE `id_bar`= $bar_id GROUP BY note ORDER BY note";
$listing_note = $bdd->prepare($count_vote);
$listing_note->bindParam(':id_bar', $bar_id);
$listing_note->execute();
$result = $listing_note->fetch(PDO::FETCH_ASSOC);
$arr1 = array("Excellent" =>5, "Bien" => 4, "Moyen" => 3, "Pas terrible" => 2, "Médiocre" => 1);
foreach ($arr1 as $key => $val) {
echo $key.' ('.$result['nb_par_note'].')<br>';
}
Je me retrouve avec:
Excellent (1)
Bien (1)
Moyen (1)
Pas terrible (1)
Médiocre (1)
Mais je n'ai pas qu'uen seule note de chaque....
Re: Affiché le nombre total de vote par note
Posté : 31 oct. 2019, 14:37
par Spols
tu dois descendre un cran en plus dans $result.
fais un var_dump() pour en connaitre la structure
Re: Affiché le nombre total de vote par note
Posté : 31 oct. 2019, 14:47
par yoann38
J'ai fait un dump de résult mais bon ...
array (size=2)
'nb_par_note' => string '1' (length=1)
'total' => string '0' (length=1)
foreach ($arr1 as $key => $val) {
echo $key.' ('.$result['nb_par_note'].')<br>';
}
var_dump($result);
Code actuel:
?php
$count_vote= "SELECT COUNT(*) AS nb_par_note, note AS total FROM `avis` WHERE `id_bar`= $bar_id GROUP BY note ORDER BY note";
$listing_note = $bdd->prepare($count_vote);
$listing_note->bindParam(':id_bar', $bar_id);
$listing_note->execute();
$result = $listing_note->fetch(PDO::FETCH_ASSOC);
$arr1 = array("Excellent" =>5, "Bien" => 4, "Moyen" => 3, "Pas terrible" => 2, "Médiocre" => 1);
foreach ($arr1 as $key => $val) {
echo $key.' ('.$result['nb_par_note'].')<br>';
}
var_dump($result);
?>
J'ai bien les mentions Excellent, bien, médiocre... qui s'afffiche mais le bon nombre total de note par mentions
Re: Affiché le nombre total de vote par note
Posté : 31 oct. 2019, 15:52
par Spols
ta requète n'est pas bonne.
déjà que tu y incorpore ta variable en direct et puis tu utilise quand même bindParam qui ne sert à rien.
Commence par bien préparer ta requète avec phpmyadmin pour être sur d'obtenir le résultat voulu. ensuite incorpore la dans ton php
Re: Affiché le nombre total de vote par note
Posté : 31 oct. 2019, 17:46
par yoann38
Le résultat obtenu est celui attendu, éxécuté sous PMA:
SELECT COUNT(*) AS nb_par_note, note AS total FROM `avis` WHERE `id_bar`= '1' GROUP BY note ORDER BY note
Renvoi:
nb_par_note | total
1 0
2 1
1 2
3 5
Dans l'exemple j'ai bien 3 fois la notes de 3 pour l'établissement 1
Re: Affiché le nombre total de vote par note
Posté : 31 oct. 2019, 23:28
par j_saisrien
Salut yoann38
Il me manque peut-être des informations mais si tu as une table nommée avis avec les colonnes mentionnées dans ton lien, j'obtiens le résultat que tu désires de la manière suivante:
Code : Tout sélectionner
$note = array(0,1,2,3,4,5);
for($i=0; $i<=5; $i++){
$note[$i];
$note_avis = $bdd->prepare('SELECT COUNT(*) as nb_votes FROM avis WHERE note = ?');
$note_avis->execute(array( $note[$i]));
while($dos=$note_avis->fetch()){
$nb_votes= $dos['nb_votes'];
echo $nb_votes . ' votes pour la note ' . $note[$i] . '<br />';
}
}
?>
avec cette formule j'obtiens
2 votes pour la note 0
5 votes pour la note 1
2 votes pour la note 2
3 votes pour la note 3
0 votes pour la note 4
2 votes pour la note 5
a+
Re: Affiché le nombre total de vote par note
Posté : 01 nov. 2019, 12:30
par yoann38
Ca se rapproche beaucoup de ce que je souhaite faire.
Par contre estil possible de changé les valeurs pour l'array,
Exemple : 1= horrible, 2= pas mal, 3= Moyen
<?php
$note = array(0,1,2,3,4,5);
for($i=0; $i<=5; $i++){
$note[$i];
$note_avis = $bdd->prepare('SELECT COUNT(*) as nb_votes FROM avis WHERE note = ? AND id_bar= '.$bar_id);
$note_avis->execute(array( $note[$i]));
while($dos=$note_avis->fetch()){
$nb_votes= $dos['nb_votes'];
echo $nb_votes . ' votes pour la note ' . $note[$i] . '<br />';
}
}
?>
Re: Affiché le nombre total de vote par note
Posté : 01 nov. 2019, 15:20
par j_saisrien
Salut
Il faut que tu fasses des essais. Par exemple, essaie quelque chose comme ça et modifie-le comme tu veux.
Code : Tout sélectionner
<?php
$note = array(0,1,2,3,4,5);
for($i=0; $i<=5; $i++){
$note[$i];
$valeur = array(' Mais c\'est catastrophique', ' quel horreur j\'en suis malade,', ' passable, keep up the good work! ', ' pas fort mais un peu mieux', ' ah là c\'est bon ', 'fantastique, je t\'aime. Tu me rends fou');
for($i=0; $i<=5; $i++){
$valeur[$i];
$note_avis = $bdd->prepare('SELECT COUNT(*) as nb_votes FROM avis WHERE note = ?');
$note_avis->execute(array( $note[$i]));
while($dos=$note_avis->fetch()){
$nb_votes= $dos['nb_votes'];
echo $nb_votes . ' votes pour la note ' . $note[$i] . ' ' . $valeur[$i] . '<br /> ' ;
}
}
}
?>
Bonne journée
Re: Affiché le nombre total de vote par note
Posté : 02 nov. 2019, 17:34
par yoann38
En reprenant ton exemple:
<?php
$note = array(0,1,2,3,4,5);
for($i=0; $i<=5; $i++){
$note[$i];
$valeur = array('A éviter', 'Pas terrible', 'C\'est pas mal', 'Sympa', 'Bien', 'Excellent');
for($i=0; $i<=5; $i++){
$valeur[$i];
$note_avis = $bdd->prepare('SELECT COUNT(*) as nb_votes FROM avis WHERE note = ? AND id_bar= '.$bar_id);
$note_avis->execute(array( $note[$i]));
while($dos=$note_avis->fetch()){
$nb_votes= $dos['nb_votes'];
$pourcentage_vote = $nb_votes * 100 / $avis_note['nb_vote'];
echo '<div class="row">
<div class="col-lg-10 col-9">
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: '.$pourcentage_vote.'%" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
<div class="col-lg-2 col-3"><small><strong>'.$valeur[$i].' ('.$nb_votes.')</strong></small></div>
</div>';
//echo $nb_votes . ' votes pour la note ' . $note[$i] . ' ' . $valeur[$i] . '<br /> ' ;
}
}
}
?>
Par contre exist'il une fonction pour affiché à l'inverse.
C'est dire commencer par Excellent, Bien, ... plutot que l'inverse
Je préfere affiché les bonnes notes avant
Re: Affiché le nombre total de vote par note
Posté : 02 nov. 2019, 18:27
par j_saisrien
Salut
Tu sais je n'ai pas choisi mon pseudo au hasard. Il y a des limites à mes connaissances et à l'aide que je peux offrir.
Je ne pense pas que tu aies besoin d'une fonction pour ça. As-tu essayé d'inverser l'ordre des chiffres dans l'array ? Et aussi l'ordre des commentaires. Tu obtiendrais sans doute le résultat que tu souhaites.
a+
Re: Affiché le nombre total de vote par note
Posté : 02 nov. 2019, 19:26
par yoann38
Effectivement c'est plus de la logique,
<?php
if ($avis_note['nb_vote'] =! 0) {
$note = array(5,4,3,2,1,0);
for($i=0; $i<=5; $i++){
$note[$i];
$valeur = array('Excellent', 'Bien', 'Sympa', 'C\'est pas mal', 'Pas terrible', 'A éviter');
for($i=0; $i<=5; $i++){
$valeur[$i];
$note_avis = $bdd->prepare('SELECT SUM(note) as total_de_note, COUNT(*) as nb_votes FROM avis WHERE note = ? AND id_bar= '.$bar_id);
$note_avis->execute(array($note[$i]));
while($dos=$note_avis->fetch()){
$nb_votes= $dos['nb_votes'];
echo $nb_votes . ' votes pour la note ' . $note[$i] . ' ' . $valeur[$i] . '<br /> ' ;
}
}
}
}
?>
Il me reste plus qu'à calculer le pourcentage de votes selon le nombre de votes total du coup