Methode pour faire un répertoire

Mammouth du PHP | 531 Messages

27 nov. 2007, 16:34

Bonjour,

Je voudrais faire une sorte de répertoire, avoir tout simplement les lettres de l'alphabet (qui peuvent aussi être des chiffres ou des symboles) avec des liens qui permettraient de sortir les entrées de ma base donc la première lettre commence par cette même lettre.

Solution un : Des liens en "dur" et une requête
Solution deux : Une boucle qui liste toutes les premières lettre des entrées avec un DISTINCT. Affichage donc dynamique des liens

Qu'en pensez-vous ? ou que feriez vous ?

Il y a peut être même une fonction PHP que je ne connais pas qui pourrait être utile dans ce cas précis ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 nov. 2007, 17:29

Personnellement quand je dois faire un index sur des données que je ne maitrise pas, ne sachant généralement pas à l'avance par quel caractère abscon elles vont commencer, j'opte effectivement pour une requête qui effectue un distinct et un substring du premier caractère du champ.

L'avantage c'est que l'index se met à jour de manière dynamique, et ne propose que les initiales pour lesquelles il y a au moins un réulstat :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 2937 Messages

27 nov. 2007, 17:56

La fonction mkdir() ? :wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 nov. 2007, 20:31

arf, c'est exactement ce que je m'étais dit quand j'ai cliqué sur le sujet pour y répondre ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

28 nov. 2007, 00:41

J'en était sur qu'on allait me parler de mkdire() :lol:

Bon je vais tester tout ça (enfin pas le mkdir lol) et je repasse plus tard

Mammouth du PHP | 531 Messages

28 nov. 2007, 00:50

Ça aura pas été bien long

Je sais pas pourquoi je pensais à faire un DISTINCT tout à l'heure, mais en même temps Ryle toi aussi tu en parle donc il doit bien en avoir besoin d'un. Mais :

Champs nom :
Toto
Tutu
Titi

Si je fait SELECT DISTINCT nom, ben je récupère tous les noms qui ne sont pas en double, donc toute la liste. Le but et plutôt d'en récupérer un seul dans cette liste et de faire un subsrt dessus.

A moins que le substr se fasse directement dans la requête ? :?

Mammouth du PHP | 19672 Messages

28 nov. 2007, 07:14

Note bien qu'il a parlé d'un DISTINCT non sur le mot complet mais sur un SUBSTRING() à savoir la première lettre des mots : en d'autre terme, tu cherches les initiales, ça devrait donner une requête du genre :

Code : Tout sélectionner

SELECT DISTINCT(SUBSTRING(ta_colonne, 1, 1)) AS initiale FROM ta_table;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 531 Messages

28 nov. 2007, 11:42

Note bien qu'il a parlé d'un DISTINCT non sur le mot complet mais sur un SUBSTRING() à savoir la première lettre des mots : en d'autre terme, tu cherches les initiales, ça devrait donner une requête du genre :

Code : Tout sélectionner

SELECT DISTINCT(SUBSTRING(ta_colonne, 1, 1)) AS initiale FROM ta_table;
Ah je comprends =)
Ceci dit ça ne me retourne aucun résultat. J'ai essayé avec SUBSTR au lieu de SUBSTRING mais c'est pareil. Pourtant après recherche dans google ça à l'air juste cette requête...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 nov. 2007, 12:26

Essayes là dans phpMyAdmin... commence sans le distinct et éventuellement le nom de la colonne à côté, pour vérifier que tu récupères bien les initiales de chaque enregistrement... puis vire le nom, ajoute le distinct, etc. faut procéder par étape quand ça bug pour trouver d'où ça vient :)

Au pire donne nous la structure de ta table, la requête génétée et un bout de code :)

Pour SUBSTRING et SUBSTR, en SQL c'est la même chose ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

28 nov. 2007, 12:43

Code : Tout sélectionner

$req_test= mysql_query("SELECT nom FROM $groupes_tbl");
-> Ca c'est ok

Code : Tout sélectionner

$req_test= mysql_query("SELECT SUBSTR(nom, 1, 1) AS initiale FROM $groupes_tbl");
-> Pas de résultat, pas d'erreur

Code : Tout sélectionner

$req_test= mysql_query("SELECT DISTINCT nom FROM $groupes_tbl");
-> Ca c'est ok

Code : Tout sélectionner

$req_test= mysql_query("SELECT DISTINCT(SUBSTRING(nom, 1, 1)) AS initiale FROM $groupes_tbl");
-> Pas de résultat, pas d'erreur

Code : Tout sélectionner

$req_test= mysql_query("SELECT DISTINCT(SUBSTRING(nom, 1, 1)) FROM $groupes_tbl");
-> pas de résultat, pas d'erreur

J'ai essayé un peu tout

:?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 nov. 2007, 13:19

Quand tu dis pas de résultat, tu as essaye un mysql_num_rows() pour le vérifier ? ou tu as essayé d'afficher le code ?

euh..... une question bête... quand tu utilises l'alias "initiale" pour nommer ta colonne dans ta requête SQL... tu penses bien à récupérer la valeur dans le champ $row['initiale'] et non pas $row['nom']

Sinon quelle est ta version de MySQL ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

28 nov. 2007, 13:25

Quand tu dis pas de résultat, tu as essaye un mysql_num_rows() pour le vérifier ? ou tu as essayé d'afficher le code ?

euh..... une question bête... quand tu utilises l'alias "initiale" pour nommer ta colonne dans ta requête SQL... tu penses bien à récupérer la valeur dans le champ $row['initiale'] et non pas $row['nom']

Sinon quelle est ta version de MySQL ?
$row['initiale'] Arffff ben c'est vrai que ça marche mieux que $row['nom'] :lol: :lol: :lol:

Edit : Par contre c'est sensible à la casse. Bon la faut que je regarde mais mes champs varchar sont en UTF bin c'est peut être le souci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 nov. 2007, 13:28

N'est il pas ? :)

Pour le problemme de casse, tu peux aussi faire appel à la fonction UPPER() de SQL pour mettre tout en majuscule (ou LOWER en minuscule) après le substring et avant le distinct pour n'avoir que l'un des deux :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 531 Messages

28 nov. 2007, 13:40

Ah cool excellent le coup du UPPER. C'est génial tout ce qu'on peut faire avec une requête SQL :P

Je commence en même temps à réfléchir à la requête suivante qui va récupérer les entrées dont ma première lettre correspond à l'initiale.

Déjà une petite idée mais pas encore testé :

SELECT nom WHERE (SUBSTRING(nom, 1, 1)) == $initiale FROM $groupes_tbl

Je risque d'avoir de nouveau le problème de casse puisque cette fois il fut pas en tenir compte

Enfin je vais déjà tester ça
Merci encore pour votre grand aide :wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 nov. 2007, 13:43

La fonction " LIKE '$initiale%' " sera à mon avis plus éfficace ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...