Affiché le nombre total de vote par note

Mammouth du PHP | 643 Messages

28 oct. 2019, 12:29

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

Eléphant du PHP | 176 Messages

28 oct. 2019, 21:41

Bonsoir,

Regarde du côté de la fonction count en plus de ton group by
Cordialement
Naroth

Mammouth du PHP | 643 Messages

30 oct. 2019, 11:33

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>';

                                } 

                                ?>

Eléphant du PHP | 176 Messages

30 oct. 2019, 16:36

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 ?
Cordialement
Naroth

Mammouth du PHP | 643 Messages

31 oct. 2019, 10:43

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....

Mammouth du PHP | 1967 Messages

31 oct. 2019, 14:37

tu dois descendre un cran en plus dans $result.

fais un var_dump() pour en connaitre la structure
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

31 oct. 2019, 14:47

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

Mammouth du PHP | 1967 Messages

31 oct. 2019, 15:52

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 643 Messages

31 oct. 2019, 17:46

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

Eléphant du PHP | 53 Messages

31 oct. 2019, 23:28

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+
Pourquoi faire simple quand on peut faire compliqué ?

Mammouth du PHP | 643 Messages

01 nov. 2019, 12:30

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 />';
                                    
                                  }
                                }
                                ?>

Eléphant du PHP | 53 Messages

01 nov. 2019, 15:20

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
Pourquoi faire simple quand on peut faire compliqué ?

Mammouth du PHP | 643 Messages

02 nov. 2019, 17:34

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

Eléphant du PHP | 53 Messages

02 nov. 2019, 18:27

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+
Pourquoi faire simple quand on peut faire compliqué ?

Mammouth du PHP | 643 Messages

02 nov. 2019, 19:26

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