Simplifier une requete

Mammouth du PHP | 643 Messages

04 déc. 2016, 15:50

Salut à tous.
Voilà maitenant mon code fonctionel j'aimerais le simplifier afin de faire que requete et non 3 fois la meme requete si possible
L'idée est d'afficher en gros 10 villes par colonne.

Le code fonctionne ( mais avec 3 requete )
<section id="section-3">
                    
                    <div class="col-md-3 col-sm-12">
					<div class="row list_hotels_tabs">
                    	<ul>     
                        <?php
                        $classement_ville = " SELECT DISTINCT city, id_departements, count(*) as nombre FROM loisirs WHERE date_fin_sortie >= NOW() AND valide = 1 GROUP BY city ORDER BY nombre DESC LIMIT 0,10";
                        $req = $bdd->query($classement_ville);
                             
                        if($req->rowCount() > 0) {             
                        while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ 
                                    
                         echo '<li>'.$ligne['city'].' -  '.$ligne['nombre'].'</li>';  
                             }  	
                           }
                         ?>
                         </ul>
                     </div>
                    </div>
                    
                    <div class="col-md-3 col-sm-12">
					<div class="row list_hotels_tabs">
                    	<ul>     
                        <?php
                        $classement_ville = " SELECT DISTINCT city, id_departements, count(*) as nombre FROM loisirs WHERE date_fin_sortie >= NOW() AND valide = 1 GROUP BY city ORDER BY nombre DESC LIMIT 10,10";
                        $req = $bdd->query($classement_ville);
                             
                        if($req->rowCount() > 0) {             
                        while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ 
                                    
                         echo '<li>'.$ligne['city'].' -  '.$ligne['nombre'].'</li>';  
                             }  	
                           }
                         ?>
                         </ul>
                     </div>
                    </div>
                    
                    
                    <div class="col-md-3 col-sm-12">
					<div class="row list_hotels_tabs">
                    	<ul>     
                        <?php
                        $classement_ville = " SELECT DISTINCT city, id_departements, count(*) as nombre FROM loisirs WHERE date_fin_sortie >= NOW() AND valide = 1 GROUP BY city ORDER BY nombre DESC LIMIT 20,10";
                        $req = $bdd->query($classement_ville);
                             
                        if($req->rowCount() > 0) {             
                        while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ 
                                    
                         echo '<li>'.$ligne['city'].' -  '.$ligne['nombre'].'</li>';  
                             }  	
                           }
                         ?>
                         </ul>
                     </div>
                    </div>
</section>

Mammouth du PHP | 688 Messages

04 déc. 2016, 21:16

$i = 0;
while(...){
if($i == 10){
echo "...";
}
if($i == 20){
echo "...";
}
$i++;
echo '<li>'.$ligne['city'].' - '.$ligne['nombre'].'</li>';
}

Mammouth du PHP | 643 Messages

04 déc. 2016, 21:44

Bonjour,
J'ai donc ma premiere requete ainsi:
<?php
						$i = 0;
                        $classement_ville = " SELECT DISTINCT city, id_departements,id_region, count(*) as nombre FROM loisirs WHERE date_fin_sortie >= NOW() AND valide = 1 GROUP BY city ORDER BY nombre DESC LIMIT 10,10";
                        $req = $bdd->query($classement_ville);
                             
                        if($req->rowCount() > 0) {             
                        while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ 
                                    
                         echo '<li><div class="col-md-6"><a href="sortie/region-'.simplification($aRegion[$ligne['id_region']]).'/ville-de-'.simplification($ligne['city']).'.html">'.ucfirst(strtolower($ligne['city'])).' </a></div><div class="col-md-6"><span class="badge">'.$ligne['nombre'].'</span></div></li>';  
                             } 	
                           }
                         ?>
et au lieu de ma deuxième requete j'ai donc:
<?php	
						while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ 
						if($i == 10){
							echo $i;
						echo '<li><div class="col-md-6"><a href="sortie/region-'.simplification($aRegion[$ligne['id_region']]).'/ville-de-'.simplification($ligne['city']).'.html">'.ucfirst(strtolower($ligne['city'])).' </a></div><div class="col-md-6"><span class="badge">'.$ligne['nombre'].'</span></div></li>';  
                             } 
							 
						}
                         ?>
Rien ne s'affiche même pas un message d'erreur en ce qui concerne la 2 eme partie, le code complet ci dessous:
<div class="col-md-3 col-sm-12">
					<div class="row list_hotels_tabs">
                    	<ul class="list-unstyled">      
                        <?php
						$i = 0;
                        $classement_ville = " SELECT DISTINCT city, id_departements,id_region, count(*) as nombre FROM loisirs WHERE date_fin_sortie >= NOW() AND valide = 1 GROUP BY city ORDER BY nombre DESC LIMIT 10,10";
                        $req = $bdd->query($classement_ville);
                             
                        if($req->rowCount() > 0) {             
                        while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ 
                                    
                         echo '<li><div class="col-md-6"><a href="sortie/region-'.simplification($aRegion[$ligne['id_region']]).'/ville-de-'.simplification($ligne['city']).'.html">'.ucfirst(strtolower($ligne['city'])).' </a></div><div class="col-md-6"><span class="badge">'.$ligne['nombre'].'</span></div></li>';  
                             } 	
                           }
                         ?>
                         </ul>
                     </div>
                    </div>
                    
                    
                    <div class="col-md-3 col-sm-12">
					<div class="row list_hotels_tabs">
                    	<ul class="list-unstyled">      
                        <?php	
						while($ligne = $req->fetch(PDO::FETCH_ASSOC)){ 
						if($i == 10){
							echo $i;
						echo '<li><div class="col-md-6"><a href="sortie/region-'.simplification($aRegion[$ligne['id_region']]).'/ville-de-'.simplification($ligne['city']).'.html">'.ucfirst(strtolower($ligne['city'])).' </a></div><div class="col-md-6"><span class="badge">'.$ligne['nombre'].'</span></div></li>';  
                             } 
							 
						}
                         ?>
                         </ul>
                     </div>
                    </div>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

06 déc. 2016, 09:28

salut,

non évite ce genre de chose, il y a beaucoup plus simple.

vu que le code est identique il suffit de savoir ou tu en es dans le nombre de ligne pour créer une nouvelle colonne.
L'opérateur % va te permettre de savoir s'il faut ou non une nouvelle colonne.
<section id="section-3">  
  <div class="col-md-3 col-sm-12">
    <div class="row list_hotels_tabs">
    	<ul>     
        <?php
        $classement_ville = 'SELECT DISTINCT city, id_departements, count(1) as nombre FROM loisirs WHERE date_fin_sortie >= NOW() AND valide = 1 GROUP BY city ORDER BY nombre DESC LIMIT 0,30';
        $req = $bdd->query($classement_ville);
        $i = 1;
        if($req->rowCount() > 0) {             
          while($ligne = $req->fetch(PDO::FETCH_ASSOC)){
            if($i%10 === 0) {
              echo '<ul></div></div><div class="col-md-3 col-sm-12"><div class="row list_hotels_tabs"><ul>';
            }
            echo '<li>' , $ligne['city'] , ' -  ' , $ligne['nombre'] , '</li>';
            $i++;
          }  	
         }
         ?>
         </ul>
     </div>
  </div>
</section>
taille du code divisé 3 (en gros) et requête SQL un poil moins gourmande (count(1) plutôt que count(*) mais ça tu le verras pas trop ;) ).

Cette solution est la plus courante et permet de façon simple d'organiser une "césure" et d'avoir un affichage en plusieurs section sans dupliquer le code.
si tu veux modifier les colonnes tu peux même sortir en variable les classes css et le diviseur du modulo pour rendre le truc configurable de façon simple :)

@+
Il en faut peu pour être heureux ......