Recherche sur première lettre avec caractères spéciaux

Eléphant du PHP | 119 Messages

04 févr. 2008, 11:26

Bonjour,

voilà la table:

Code : Tout sélectionner

CREATE TABLE `personnes` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(200) NOT NULL, `prenom` varchar(200) NOT NULL, `pays` varchar(200) NOT NULL, )
j'ai une requête qui doit me sortir toutes les personnes de la base de données qui commence par la lettre demandé par l'utilisateur. Il clique sur un lien qui correspond à sa lettre et moi je lance ça :

Code : Tout sélectionner

select * from personnes where nom like '".$_GET['lettre_debut']."%' order by nom
Ou ça donc:

Code : Tout sélectionner

select * from personnes where nom like 'A%' order by nom_audit
Le souci c'est que quand les nom commence par Ô ou Ö ou Ä etc.... il me sort pas les noms :/

Comment pourrais-je faire svp?

merci.

Mammouth du PHP | 1029 Messages

04 févr. 2008, 12:19

Bonjour,
Est-ce que c'est caractère ont la même formes dans ta Db?
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 119 Messages

04 févr. 2008, 12:22

Dans ma DB les noms apparaissent bien avec des Ö ou des Ä Â etc..

Donc oui oui en base les noms ont bien des signes spéciaux.

Le problème c'est que SQL dis que A est != de Ä et du coup ceux là ne ressortent pas de mon select :/

Mammouth du PHP | 1029 Messages

04 févr. 2008, 12:34

Fais un echo de ton select pour voir ce qu'il retourne quand tu lui passes ce genre de caractère
L'expérience est la somme de toutes nos erreurs.

d0m
Mammouth du PHP | 1141 Messages

04 févr. 2008, 13:02

Il faut d'abord faire 2 chaines d'équivalence :
$avec_accents = 'âäàöô.....';
$sans_accents = 'aaaoo.....'; 
Ensuite tu pourrais essayer d'utiliser la fonction sql translate qui va faire la relation :
$requete = "
select *
from personnes
where translate(nom,'".$avec_accents."','".$sans_accents."') like '%".$_GET['lettre_debut']."'
order by nom"

Eléphant du PHP | 119 Messages

04 févr. 2008, 14:24

ton idée est bonne mais me rend ça :

SELECT * FROM personnes WHERE translate(nom, 'âäàöô', 'aaaoo') LIKE 'A%' ORDER BY nom


Ca me rend :

#1305 - FUNCTION annuaire.translate does not exist :/

Mammouth du PHP | 1029 Messages

04 févr. 2008, 14:42

Le translate,replace ne fonctionne pas que sur le select?
$requete = "
select nom,
     TRANSLATE(nom,'â','a'),
     TRANSLATE(nom,'ä','a'),
     TRANSLATE(nom,'à','a'),
     TRANSLATE(nom,'ö','o'),
     TRANSLATE(nom,'ô','o'),
from personnes
where  nom like '%".$_GET['lettre_debut']."'
order by nom"
L'expérience est la somme de toutes nos erreurs.

d0m
Mammouth du PHP | 1141 Messages

04 févr. 2008, 14:42

il semble que l'équivalent de la fonction translate() en mysql est la fonction replace()

Mammouth du PHP | 1029 Messages

04 févr. 2008, 15:06

a essayer donc
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 119 Messages

04 févr. 2008, 15:11

En fait la bonne syntaxe est celle ci au final:

Code : Tout sélectionner

$requete = " select nom, from personnes where replace(nom,'Ö','O') like '".$_GET['lettre_debut']."%' OR replace(nom,'Ô','O') like '".$_GET['lettre_debut']."%' OR replace(nom_audit,'Ä','A') like '".$_GET['lettre_debut']."%' OR replace(nom_audit,'Â','A') like '".$_GET['lettre_debut']."%' order by nom"
J'ai mis des majuscules car dans ma base les enregistrements sont fait comme ça :)

Donc niquel comme ça :D

Merci encore :)

Mammouth du PHP | 1029 Messages

04 févr. 2008, 16:13

Par acquis de conscience ceci ne fonctionne pas ?

Code : Tout sélectionner

$requete = " select nom, replace(nom,'Ö','O'), replace(nom,'Ô','O'), replace(nom_audit,'Ä','A'), replace(nom_audit,'Â','A'), from personnes where nom like '".$_GET['lettre_debut']."%'' order by nom"
L'expérience est la somme de toutes nos erreurs.

d0m
Mammouth du PHP | 1141 Messages

04 févr. 2008, 16:16

Par acquis de conscience ceci ne fonctionne pas ?

Code : Tout sélectionner

$requete = " select nom, replace(nom,'Ö','O'), replace(nom,'Ô','O'), replace(nom_audit,'Ä','A'), replace(nom_audit,'Â','A'), from personnes where nom like '".$_GET['lettre_debut']."%'' order by nom"
je ne pense pas puisque le remplacement se fait après que la ligne trouvée vérifie la condition.

Mammouth du PHP | 1029 Messages

04 févr. 2008, 16:25

Ha bon, enfin je me le met dans un coin, on ne sait jamais.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 119 Messages

04 févr. 2008, 16:25

Non non ça ne passait pas, pardon de ne pas l'avoir précisé oui :)

Non il faut le faire sur le where et bien séparer chaque possibilité avec un OR