Afficher le contenu d'une table par initiales

Résolu/Fermé
helpme - Modifié par jipicy le 2/06/2010 à 16:57
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 - 11 juin 2010 à 13:06
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 :

<?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 
   } 

  }     
?>

A voir également:

6 réponses

Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
2 juin 2010 à 17:43
Salut, j'ai l'impression que tu te prends pas mal la tête pour cette histoire de lettre, voilà comment je le ferai à ta place :
<?php
$req = $bdd->prepare('SELECT id, annee, nomgroupe, nomalbum, initiale FROM musicreviews WHERE lang = :lang ORDER BY nomgroupe, annee ASC'); 
$req->execute(array('lang' => $lang));
$sFirstLetter = '';
while ($donnees = $req->fetch()) 
{ 
    $sGroupeFirstLetter = strtoupper(substr($donnees['nomgroupe'],0, 1));
    
    if( $sGroupeFirstLetter != $sFirstLetter){
    ?>
        <br/><strong><? echo $sGroupeFirstLetter;?></strong>
    <?php
    }
    
?>
    <a style="margin-left:2%;" href="musicreviewspage.php?id=<?php echo $donnees['id']; ?>">
<?php 
    echo $donnees['nomgroupe']." - ".$donnees['nomalbum']."<br/>"; 
?>
    </a>
<?php 
    $sFirstLetter = $sGroupeFirstLetter;
} 
?>


Plus la peine de stocker la première lettre en BDD ;)

Bon courage !
0
Salut,
Merci, ton code m'aide beaucoup !
Mais il reste deux problèmes :
- comment faire une catégorie pour regrouper les chiffres et les caractères spéciaux (#'_...) ?
- comment faire pour que dans le cas où l'initiale serait É ou À (ou autre), il la mette respectivement dans "E" ou "A" et pas dans une autre catégorie ?
Merci d'avance ;)
A+

EDIT : excuse les fautes, je ne m'étais pas relu ;)
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
Modifié par Zep3k!GnO le 2/06/2010 à 18:52
Re, voici le code modifié,
j'ai rajouté la fonction stripAccent qui comme son nom l'indique vire les accents et j'ai fait une petite modif la catégorie "numérique et autres" on va dire :

<?php 
private function stripAccents($sString){ 
 return strtr($sString,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ', 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY'); 
} 


$req = $bdd->prepare('SELECT id, annee, nomgroupe, nomalbum, initiale FROM musicreviews WHERE lang = :lang ORDER BY nomgroupe, annee ASC');  
$req->execute(array('lang' => $lang)); 
$sFirstLetter = ''; 
while ($donnees = $req->fetch())  
{  
    $sGroupeFirstLetter = strtoupper(stripAccents(substr($donnees['nomgroupe'],0, 1))); 
     
    if(!ctype_alpha($sGroupeFirstLetter)){ 
        $sGroupeFirstLetter = '0 - 9 #'; //Mets ici le titre de ta catégorie foure-tout 
    } 
         
    if( $sGroupeFirstLetter != $sFirstLetter){ 
    ?> 
        <br/><strong><? echo $sGroupeFirstLetter;?></strong> 
    <?php 
    } 
     
?> 
    <a style="margin-left:2%;" href="musicreviewspage.php?id=<?php echo $donnees['id']; ?>"> 
<?php  
    echo $donnees['nomgroupe']." - ".$donnees['nomalbum']."<br/>";  
?> 
    </a> 
<?php  
    $sFirstLetter = $sGroupeFirstLetter; 
}  
?> 


EnJoY !

P.S:code non testé ecrit de tête, mais ça devrait le faire ;)
0
M-E-R-C-I !!
Il y a une légère erreur au niveau du "private function" par contre, si on met le "private" il affiche "Parse error", si on l'enlève et qu'on ne laisse que "function" c'est bon. Normal ?
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gremy87 Messages postés 352 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 19 mars 2014 38
3 juin 2010 à 10:12
oui normal =>RESOLU
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
11 juin 2010 à 13:06
oui, dsl, copier/coller d'une classe.
0