[PHP] tri affichage par lettre

tri affichage par lettre [PHP] - Programmation

Marsh Posté le 28-06-2002 à 16:33:21    

'lo
Je suis en train de faire un script de lyrics, et j'ai donc trier le nom des artistes par lettre.
le code ressemble à ça:
 

Code :
  1. <?
  2. $req_chanson=mysql_query("SELECT * FROM artistes WHERE nom LIKE \"$letter%\"" );
  3. echo "<B><font color=white><a href=index.php?p=scriptsphp3/lyrics/detail&letter=A>A</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=B>B</a> - <a href=index.php?etc..[...]</a></b>";
  4. ?>


 
tout marche bien mais j'aurais besoin de votre aide car j'aimerai le develloper.  
 
1) Deja, comment avoir le tri par chiffre ? j'ai essayé

Code :
  1. <a href=index.php?p=scriptsphp3/lyrics/detail&letter=#>0 - 9</a>

mais ça ne marche pas :/
 
2) pour le moment, j'ai ça: A - B - C etc...
J'aimerai mettre à cote une liste deroulante avec "artiste" et "chansons" c'est a dire que si on selectionne "artiste" ça va trier les lettres d'artistes et si je selectionne "chansons" ça va trier par chansons...
 
pour le select bon ça va:
 

Code :
  1. echo "<select name=cat>";
  2. echo "<option value='artistes'>artistes</option>";
  3. echo "<option value='chansons'>chansons</option>";
  4. echo "</select>";

mais c apres
Je sais pas trop comment faire au niveau du php, si vous pouviez m'aider!
 
 voila je vous remercie d'avance  :hello:


Message édité par ludo2604 le 28-06-2002 à 16:35:05

---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 28-06-2002 à 16:33:21   

Reply

Marsh Posté le 28-06-2002 à 16:48:44    

1) En utilisant les expressions régulières de MySQL ?
 
SELECT * FROM artistes WHERE nom REGEXP "^[0-9].*" ORDER BY nom
 
cf http://www.mysql.com/doc/R/e/Regexp.html


Message édité par gm_superstar le 28-06-2002 à 16:50:46
Reply

Marsh Posté le 28-06-2002 à 17:43:57    

oula merci si il y a plus simple (sans requete!) si possible


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 28-06-2002 à 18:42:24    

Je pige pas, tu fais bien un requête pour récupérer les artistes dont le nom commence par une lettre ? Pourquoi tu n'en ferais pas une pour pour ceux qui commencent par un chiffre ?
 
 
PS: met plutôt le code entre les balises [ fixed] ou [ code]. [ cpp] -> C++

Reply

Marsh Posté le 28-06-2002 à 18:46:02    

Un autre truc aussi, si ton lien c'est : index.php?p=scriptsphp3/lyrics/detail&letter=# c'est normal que ça marche pas, le # sert à positionner la page au niveau d'une ancre  html.
 
Essaye ça : index.php?p=scriptsphp3/lyrics/detail&letter=%23
 
23 code ascii pour #

Reply

Marsh Posté le 28-06-2002 à 18:46:13    

oui dak mais ny a til pas un autre moyen plus simple !!?
Si non ok je te remercie je vais essayer ;)


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 28-06-2002 à 19:47:01    

pour le 2 on m'adit dutiliser le switch c bien ça ?


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 29-06-2002 à 10:16:15    

gm_superstar a écrit a écrit :

1) En utilisant les expressions régulières de MySQL ?
 
SELECT * FROM artistes WHERE nom REGEXP "^[0-9].*" ORDER BY nom
 
cf http://www.mysql.com/doc/R/e/Regexp.html




 
ok j'ai donc mis ça.
Mais pour le lien detail<etter= ??


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 29-06-2002 à 11:14:30    

ludo2604 a écrit a écrit :

ok j'ai donc mis ça.
Mais pour le lien detail<etter= ??



Par exemple pour les nombres (0-9) tu fais un lien comme ça : detail<etter=0 (zéro)
 
Puis dans ton code :  

Code :
  1. if ($HTTP_GET_VARS["letter"] == "0" ) {
  2.   $requete = "SELECT * FROM artistes WHERE nom REGEXP '^[0-9].*' ORDER BY nom";
  3. } else if (ereg("^[a-z]$", $HTTP_GET_VARS["letter"]) {
  4.   $requete = "SELECT * FROM artistes WHERE nom LIKE '{$HTTP_GET_VARS["letter"]}%'";
  5. } else { //au cas où un petit malin envoie une variable lettre invalide, on fait la requête avec la lettre a (par exemple)
  6.   $requete = "SELECT * FROM artistes WHERE nom LIKE 'a%'";
  7. }
  8. $req_chanson = mysql_query($requete);

Reply

Marsh Posté le 29-06-2002 à 12:14:07    

je te remercie beaucoup !!
 
mais il y a une petite erreur, je n'arrive pas à trouver:
 

Citation :

parse error, unexpected '{' in e:\sites internet\ludo project\scriptsphp3\lyrics\lyrics.php on line 39


 
la ligne 39 correspond à:
 

Code :
  1. if ($HTTP_GET_VARS["letter"] == "0" )
  2. {
  3. $requete = "SELECT * FROM artistes WHERE nom REGEXP '^[0-9].*' ORDER BY nom";
  4. }
  5. elseif (ereg("^[A-Z]$", $HTTP_GET_VARS["letter"])
  6. { //ligne 39
  7. $requete = "SELECT * FROM artistes WHERE nom LIKE '{$HTTP_GET_VARS["letter"]}%'";
  8. }
  9. else
  10. { //au cas où un petit malin envoie une variable lettre invalide, on fait la requête avec la lettre a (par exemple)  
  11. $requete = "SELECT * FROM artistes WHERE nom LIKE 'A%'";
  12. }
  13. $req_chanson = mysql_query($requete);


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 29-06-2002 à 12:14:07   

Reply

Marsh Posté le 29-06-2002 à 12:46:58    

Bah j'ai oublié une parenthèse :
 
elseif (ereg("^[A-Z]$", $HTTP_GET_VARS["letter"]))
 
Et puis aussi, rajoute un ORDER BY nom à la deuxième histoire que ça soit trié par ordre alphabétique.
 
$requete = "SELECT * FROM artistes WHERE nom LIKE '{$HTTP_GET_VARS["letter"]}%' ORDER BY nom";
 
 
Sinon pour ta deuxième question, il suffit que le script php appelé par le formulaire du <select> fasse une requête avec la valeur du <option> :
 
$requete = "SELECT * FROM {$HTTP_POST_VARS["cat"]} ...";
 
Comme ça tu sélectionnes la bonne table


Message édité par gm_superstar le 29-06-2002 à 12:48:22
Reply

Marsh Posté le 29-06-2002 à 12:56:42    

oOps ! je pensais que la requete que tu m'as donné concerné l'ensemble des chiffres. car en fait ce que je voulai c'est de faire comme ici:  http://www.hebus.com/cata.php?cat=cinema >> regarde le "0-9 " il rassemble les chiffres de 0 à 9 sur 1 seule page. Est-ce possible ?
 
En tt cas merci de ton aideeeeeee  :hello:  


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 29-06-2002 à 13:25:42    

Ben normalement la requête "SELECT * FROM artistes WHERE nom REGEXP '^[0-9].*' ORDER BY nom" fait ce que tu demandes...
 
L'expression régulière permet de sélectionner tous les 'nom' dont le premier caractère est un chiffre entre 0 et 9.

Reply

Marsh Posté le 29-06-2002 à 13:57:01    

oui, je commence à comprendre le principe...mais quand je click sur le liens de chiffre, il m'affiche que pour 0.
 
Peux tu vérifier une derniere fois si je n'ai pas fait une faute stp  :ange:
 
voila le code entier:
 

Code :
  1. <?
  2. if ($HTTP_GET_VARS["letter"] == "0" )
  3. {
  4. $requete = "SELECT * FROM artistes WHERE nom REGEXP '^[0-9].*' ORDER BY nom";
  5. }
  6. elseif (ereg("^[A-Z]$", $HTTP_GET_VARS["letter"]))
  7. {
  8. $requete = "SELECT * FROM artistes WHERE nom LIKE '{$HTTP_GET_VARS["letter"]}%' ORDER BY nom";
  9. }
  10. else
  11. { //au cas où un petit malin envoie une variable lettre invalide, on fait la requête avec la lettre a (par exemple)  
  12. $requete = "SELECT * FROM artistes WHERE nom LIKE 'A%'";
  13. }
  14. $req_chanson = mysql_query($requete);
  15. echo "<B><font color=white><a href=index.php?p=scriptsphp3/lyrics/detail&letter=A>A</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=B>B</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=C>C</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=D>D</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=E>E</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=F>F</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=G>G</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=H>H</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=I>I</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=J>J</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=K>K</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=L>L</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=M>M</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=N>N</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=O>O</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=P>P</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=Q>Q</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=R>R</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=S>S</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=T>T</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=U>U</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=V>V</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=W>W</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=X>X</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=Y>Y</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=Z>Z</a> - <a href=index.php?p=scriptsphp3/lyrics/detail&letter=0>[0 - 9]</a></b>";
  16. ?>


 
 
et voici la page detail pour afficher le tout:

Code :
  1. <?
  2. $req_chanson=mysql_query("SELECT * FROM artistes WHERE nom LIKE \"$letter%\"" );
  3. echo "$letter<p>";
  4. while ($ligne_chanson=mysql_fetch_object($req_chanson))
  5. {
  6. echo "$ligne_chanson->nom<br>";
  7. }
  8. ?>


 
c peut etre cette page qui pose probleme..
merci pour tout  :hello:


Message édité par ludo2604 le 29-06-2002 à 15:05:09

---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 29-06-2002 à 19:51:27    

Je regarderai demain. Pas le temps ce soir.
 
A+

Reply

Marsh Posté le 29-06-2002 à 22:55:17    

c bon ça marche petite erreur de frappe de ma part mais c nickel now merciiiiiiiiiiiiiiiiiiiiiiiii !!


Message édité par ludo2604 le 30-06-2002 à 22:12:42

---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 30-06-2002 à 22:44:00    

Bon bein entammons le 2) lol nan mais j'aimerai voir quelques précisions en fait.  
tu as dis:  
 

Citation :

Sinon pour ta deuxième question, il suffit que le script php appelé par le formulaire du <select> fasse une requête avec la valeur du <option> :  
 
$requete = "SELECT * FROM {$HTTP_POST_VARS["cat"]} ...";  
 
Comme ça tu sélectionnes la bonne table


 
dak.
deja, je mets ça:
 

Citation :

echo "<select name=cat>";
  echo "<option value='artistes'>artistes</option>";
  echo "<option value='chansons'>chansons</option>";
  echo "</select>";


   
ensuite,il faudra mettre  
 

Citation :

detail&letter=A&cat=$cat


 
pour la page detail, comme tu l'as dis il faut mettre:

Citation :

$requete = "SELECT * FROM {$HTTP_POST_VARS["cat"]} ...";


 
mais il ya un probleme.
c'est que ma requete à la base c ca:
 
$requete = mysql_query("SELECT * FROM artistes WHERE nom LIKE '{$HTTP_GET_VARS["letter"]}%' ORDER BY nom" );  
 
et si je mets:
 

Citation :

$requete = mysql_query("SELECT * FROM {$HTTP_POST_VARS["cat"]}  WHERE nom LIKE '{$HTTP_GET_VARS["letter"]}%' ORDER BY nom" );


 
le champ "nom" de la table artiste lui sera toujours present...
alors que pour chansons, il ne faut pas "nom" mais "titre".
 
Aii, ça pose probleme non ?


Message édité par ludo2604 le 30-06-2002 à 22:55:28

---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 30-06-2002 à 23:23:57    

il est largement préférable de précalculer la première lettre de ton titre et de créer un nouveau champ pour la stocker. ça fait beaucoup moins de calcul pour la requete.

Reply

Marsh Posté le 01-07-2002 à 00:41:20    

comment ça ??
Tu peux detailler stp... une table pour quoi ? :sarcastic:


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le 01-07-2002 à 00:55:21    

1) Donc apparemment, ça marche :)
 
2) Ce que je te conseille de faire, c'est de ne pas faire de <select>, mais plutôt un lien.
 
Si l'URL de la page générée était : index.php?p=scriptsphp3/lyrics/detail&letter=A
 
Tu places ce bout de code :
 

if (isset($HTTP_GET_VARS["cat"])) {
    if ($HTTP_GET_VARS["cat"] == "artistes" ) {
        $catLien = "chansons";
        $catRequete = "artistes";
    } elseif ($HTTP_GET_VARS["cat"] == "chansons" ) {
        $catLien = "artistes";
        $catRequete = "chansons";
    } else {
        $catLien = "chansons";
        $catRequete = "artistes";
    }
} else {
    $catLien = "chansons";
    $catRequete = "artistes";
}
 
Ensuite tu crées un lien :
<a href="index.php?p=scriptsphp3/lyrics/detail&letter={$HTTP_GET_VARS["letter"]}&cat=$catLien">Trier par $catLien</a>


 
En gros ce code crée un lien qui permet de passer à la catégorie 'chansons' si la catégorie en cours est 'artistes' et vice et versa. Si cat n'est pas défini dans l'URL, ou est différent de 'chansons' ou 'artistes', on fait en sorte que le lien permette d'accéder à 'chansons'.
 
Les liens pour choisir la lettre ou les chiffres devront s'écire  avec la catégorie choisie dans l'URL.

<a href="index.php?p=scriptsphp3/lyrics/detail&letter=A[g]&cat=$catRequete[/g]>A</a>
<a href="index.php?p=scriptsphp3/lyrics/detail&letter=B[g]&cat=$catRequete[/g]>B</a>
...
<a href="index.php?p=scriptsphp3/lyrics/detail&letter=0[g]&cat=$catRequete[/g]>[0 - 9]</a>


 
Pour cette histoire de champ qui n'est pas le même selon qu'on sélectionne 'chansons' ou 'artistes', il suffit de créer un petit tableau associatif :
 
$champ["chansons"] = "titre";
$champ["artistes"] = "nom";
 
Et la requête s'écrira :  
$requete = mysql_query("SELECT * FROM $catRequete WHERE $champ[$catRequete] LIKE '{$HTTP_GET_VARS["letter"]}%' ORDER BY $champ[$catRequete]" );

Reply

Marsh Posté le 01-07-2002 à 00:57:14    

siewn a écrit a écrit :

il est largement préférable de précalculer la première lettre de ton titre et de créer un nouveau champ pour la stocker. ça fait beaucoup moins de calcul pour la requete.



Tout à fait. Mais il faut voir combien il a d'enregistrements dans sa table.

Reply

Marsh Posté le 01-07-2002 à 01:00:03    

ludo2604 a écrit a écrit :

comment ça ??
Tu peux detailler stp... une table pour quoi ? :sarcastic:




Ce qu'il veut dire c'est que c'est une bonne idée de créer en parralèle de tes noms d'artistes, une colonne qui ne contient que la première lettre du nom de cet artistes, et de faire la requette sur cette colonne. C'est plus rapide car on a pas à extraire le premier caractère des enregistrements existants.
 
Mais ceci se justifie uniquement si tu as beaucoup d'artistes/chansons dans ta base (+ de 1000)

Reply

Marsh Posté le 01-07-2002 à 10:57:21    

merciii pour toutes ces explications je vais voir tt ça et je te tiens au courant.
 
Mais sinon bah dans la base, il y a plus 2000 chansons et une 100e d'artistes, en sachant que ça va bien sur augmenter.
La methode de siewn a quoi de plus que la tienne ?
 
 :hello:


---------------
Make Portraits, Not War!  
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed