Afficher le contenu d'une table par initiale

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Afficher le contenu d'une table par initiale

Re: Afficher le contenu d'une table par initiale

par Ryle » 02 juin 2010, 22:04

Personnellement, pour ce genre de traitement, je me contente de trier les résultats de la requête et d'utiliser une variable temporaire pour identifier les catégories (pour toi les initiales) :
<?php         
   $initiale = ''; // variable temp pour stocker l'initiale du groupe courrant
   $sql = 'SELECT  id, annee, nomgroupe, nomalbum FROM  musicreviews WHERE lang = \''. $lang .'\' ORDER BY nomgroupe, annee ';
   $req1 = $bdd->query($sql);


   while($donnees1 = $req1->fetch()) // boucle sur tous les enregistrements
      {
      $premiere_lettre = substr($donnees1['nomgroupe'], 0, 1); // premiere lettre du nom du groupe
      if ($initiale != $premiere_lettre) // si différent de l'initiale, on affiche le titre et on met à jour l'initiale courrante
         {
         $initiale = $lettre;
         echo "<h4>- [". $initiale ."]</h4>";
         }

         ?><a style="margin-left:2%;" href="musicreviewspage.php?id=<?php echo $donnees['id']; ?>"><?php
         echo $donnees['nomgroupe']." - ".$donnees['nomalbum']."<br/>";
         ?></a><?php
      }            
?>
Nota : cela t'évite de multiplier les requêtes sql qui seront exécutées. Même si les requêtes préparées sont plus rapide, il faut éviter tant que possible d'avoir une requête dans une boucle, surtout quand tu ne sais pas combien de fois celle-ci sera exécutée :)

Re: Afficher le contenu d'une table par initiale

par visualight » 02 juin 2010, 20:52

Salut

Tu peux travailler de deux manières.
La manière la plus facile est d'utiliser GROUP BY initiale dans ta requete existante. Mais c'est pas très propre : utilisation de 2 requêtes.

Une autre solution consiste à travailler avec un tableau (array) pour éviter de stocker un simple alphabet dans une table.
L'utilisation combinée de l'array et de la boucle foreach évitent une requête mysql.

J'en ai profité pour corriger ton code.
Fais gaffe lorsque tu utilises php, ça ne sert à rien de faire :
<a href="<?php echo $url; ?>"><?php echo $texte; ?></a>
car tu ouvre plusieurs fois l'interprétation <?php et echo ce qui au final est moins rapide et pratique que de faire :
echo '<a href="'.$url.'">'.$texte.'</a>';
mieux vaut englober (faire un echo de toute la ligne) que de répèter et ouvrir l'interprétation php et fonction echo plusieurs fois.

<?php 

// $tableau[0] = A -> $tableau[25] = Z
$tableau = array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z);

foreach ($tableau as $value) {

$req = $bdd->prepare('SELECT id, nomgroupe, nomalbum FROM musicreviews WHERE lettre = :lettre AND lang = :lang ORDER BY annee GROUP BY lettre');
$req->execute(array(':lettre' => $value, ':lang' => $lang));

while ($donnees = $req->fetch(PDO::FETCH_ASSOC)) {
echo '<a style="margin-left:2%;" href="musicreviewspage.php?id='.$donnees['id'].'">'.$donnees['nomgroupe'].' - '.$donnees['nomalbum'].'</a><br/>';
}
}
?>
Bonne prog,
visualight

Afficher le contenu d'une table par initiale

par Oceandrom » 02 juin 2010, 17:02

Bonjour,
Je suis le webmaster d'un webzine musical.
Les chroniques du site sont stockées dans une table (musicreviews), je voudrais que sur la page du site qui les liste, elles apparaissent rangées par initiale.

J'ai deux problèmes :
- si je fais une boucle en prenant les initiales stockées dans "musicreviews" (on renseigne les initiales pour chaque groupe chroniqué, si vous avez une idée de comment récupérer l'initiale directement, n'hésitez pas :) ), ils m'affichent deux fois les initiales si deux groupes ont la même comme par exemple :

- C
Cult of luna
- M
Monolithe
- C
Celeste

- si je fais une table qui contient l'alphabet, il m'affiche tout l'alphabet, y compris les lettres ne correspondant à aucun groupe. Je me retrouve donc avec des espaces vides, ce que je ne veux pas
Voici mon code actuel, correspondant à celui avec la table alphabet :

Code : Tout sélectionner

<?php $req1 = $bdd->query('SELECT lettre FROM alphabet'); while($donnees1 = $req1->fetch()) { echo "<h4>- [".$donnees1['lettre']."]</h4>"; $req = $bdd->prepare('SELECT id, annee, nomgroupe, nomalbum, initiale FROM musicreviews WHERE lettre = :lettre AND lang = :lang ORDER BY initiale, annee'); $req->execute(array('lettre' => $donnees1['lettre'], 'lang' => $lang)); while ($donnees = $req->fetch()) { ?><a style="margin-left:2%;" href="musicreviewspage.php?id=<?php echo $donnees['id']; ?>"><?php echo $donnees['nomgroupe']." - ".$donnees['nomalbum']."<br/>"; ?></a><?php } } ?>