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

 


Dernière réponse
Sujet : [PHP] tri affichage par lettre
ludo2604 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:

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
ludo2604 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:
gm_superstar

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)

gm_superstar

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.

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

ludo2604 comment ça ??
Tu peux detailler stp... une table pour quoi ? :sarcastic:
siewn 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.
ludo2604 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 ?

ludo2604 c bon ça marche petite erreur de frappe de ma part mais c nickel now merciiiiiiiiiiiiiiiiiiiiiiiii !!
gm_superstar Je regarderai demain. Pas le temps ce soir.
 
A+
ludo2604 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:

gm_superstar 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.
ludo2604 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:  
gm_superstar 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
ludo2604 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);

gm_superstar

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

ludo2604

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

ludo2604 pour le 2 on m'adit dutiliser le switch c bien ça ?
ludo2604 oui dak mais ny a til pas un autre moyen plus simple !!?
Si non ok je te remercie je vais essayer ;)
gm_superstar 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 #
gm_superstar 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++
ludo2604 oula merci si il y a plus simple (sans requete!) si possible
gm_superstar 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
ludo2604 '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:


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)