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