Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
791 connectés 

  FORUM HardWare.fr
  Programmation

  [PHP] tri affichage par lettre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] tri affichage par lettre

n°168142
ludo2604
kitsch' me if u can
Posté le 28-06-2002 à 16:33:21  profilanswer
 

'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!  
mood
Publicité
Posté le 28-06-2002 à 16:33:21  profilanswer
 

n°168150
gm_superst​ar
Appelez-moi Super
Posté le 28-06-2002 à 16:48:44  profilanswer
 

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
n°168170
ludo2604
kitsch' me if u can
Posté le 28-06-2002 à 17:43:57  profilanswer
 

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


---------------
Make Portraits, Not War!  
n°168197
gm_superst​ar
Appelez-moi Super
Posté le 28-06-2002 à 18:42:24  profilanswer
 

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

n°168199
gm_superst​ar
Appelez-moi Super
Posté le 28-06-2002 à 18:46:02  profilanswer
 

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 #

n°168200
ludo2604
kitsch' me if u can
Posté le 28-06-2002 à 18:46:13  profilanswer
 

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!  
n°168213
ludo2604
kitsch' me if u can
Posté le 28-06-2002 à 19:47:01  profilanswer
 

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


---------------
Make Portraits, Not War!  
n°168343
ludo2604
kitsch' me if u can
Posté le 29-06-2002 à 10:16:15  profilanswer
 

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!  
n°168350
gm_superst​ar
Appelez-moi Super
Posté le 29-06-2002 à 11:14:30  profilanswer
 

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

n°168369
ludo2604
kitsch' me if u can
Posté le 29-06-2002 à 12:14:07  profilanswer
 

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!  
mood
Publicité
Posté le 29-06-2002 à 12:14:07  profilanswer
 

n°168377
gm_superst​ar
Appelez-moi Super
Posté le 29-06-2002 à 12:46:58  profilanswer
 

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
n°168380
ludo2604
kitsch' me if u can
Posté le 29-06-2002 à 12:56:42  profilanswer
 

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!  
n°168386
gm_superst​ar
Appelez-moi Super
Posté le 29-06-2002 à 13:25:42  profilanswer
 

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.

n°168393
ludo2604
kitsch' me if u can
Posté le 29-06-2002 à 13:57:01  profilanswer
 

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!  
n°168465
gm_superst​ar
Appelez-moi Super
Posté le 29-06-2002 à 19:51:27  profilanswer
 

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

n°168495
ludo2604
kitsch' me if u can
Posté le 29-06-2002 à 22:55:17  profilanswer
 

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!  
n°168654
ludo2604
kitsch' me if u can
Posté le 30-06-2002 à 22:44:00  profilanswer
 

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!  
n°168662
siewn
Posté le 30-06-2002 à 23:23:57  profilanswer
 

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.

n°168695
ludo2604
kitsch' me if u can
Posté le 01-07-2002 à 00:41:20  profilanswer
 

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


---------------
Make Portraits, Not War!  
n°168702
gm_superst​ar
Appelez-moi Super
Posté le 01-07-2002 à 00:55:21  profilanswer
 

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

n°168703
gm_superst​ar
Appelez-moi Super
Posté le 01-07-2002 à 00:57:14  profilanswer
 

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.

n°168706
gm_superst​ar
Appelez-moi Super
Posté le 01-07-2002 à 01:00:03  profilanswer
 

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)

n°168782
ludo2604
kitsch' me if u can
Posté le 01-07-2002 à 10:57:21  profilanswer
 

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!  
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [PHP] tri affichage par lettre

 

Sujets relatifs
[PHP] Probleme de concatenation .... URGENTInterroger une base Oracle 7.x en PHP c'est possible ???
PHP, ASP, XML, JSP, ...URGENT : comment connaître la lettre du lecteur CD-ROM ????
[PHP] script "membres" questionsOnMousOver OnMouseOut et PHP
[PHP] Replace insensible à la casse?[PHP] Forum - prévenir d'un nouveau post ...
[Php] virer les \n d'une $var[Cookies/PHP] Je vais devenir timbré :D
Plus de sujets relatifs à : [PHP] tri affichage par lettre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR