tri affichage par lettre [PHP] - Programmation
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
Marsh Posté le 28-06-2002 à 17:43:57
oula merci si il y a plus simple (sans requete!) si possible
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++
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 #
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
Marsh Posté le 28-06-2002 à 19:47:01
ReplyMarsh 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= ??
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 :
|
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 :
|
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
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
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.
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
voila le code entier:
Code :
|
et voici la page detail pour afficher le tout:
Code :
|
c peut etre cette page qui pose probleme..
merci pour tout
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 !!
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> : |
dak.
deja, je mets ça:
Citation : echo "<select name=cat>"; |
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 ?
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.
Marsh Posté le 01-07-2002 à 00:41:20
comment ça ??
Tu peux detailler stp... une table pour quoi ?
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"])) { |
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> |
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]" );
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.
Marsh Posté le 01-07-2002 à 01:00:03
ludo2604 a écrit a écrit : comment ça ?? Tu peux detailler stp... une table pour quoi ? |
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)
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 ?
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:
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é
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:
mais c apres
Je sais pas trop comment faire au niveau du php, si vous pouviez m'aider!
voila je vous remercie d'avance
Message édité par ludo2604 le 28-06-2002 à 16:35:05
---------------
Make Portraits, Not War!