Page 1 sur 1

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

Posté : 04 févr. 2008, 11:26
par saebakun
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.

Posté : 04 févr. 2008, 12:19
par Maitrepylos
Bonjour,
Est-ce que c'est caractère ont la même formes dans ta Db?

Posté : 04 févr. 2008, 12:22
par saebakun
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 :/

Posté : 04 févr. 2008, 12:34
par Maitrepylos
Fais un echo de ton select pour voir ce qu'il retourne quand tu lui passes ce genre de caractère

Posté : 04 févr. 2008, 13:02
par d0m
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"

Posté : 04 févr. 2008, 14:24
par saebakun
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 :/

Posté : 04 févr. 2008, 14:42
par Maitrepylos
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"

Posté : 04 févr. 2008, 14:42
par d0m
il semble que l'équivalent de la fonction translate() en mysql est la fonction replace()

Posté : 04 févr. 2008, 15:06
par Maitrepylos
a essayer donc

Posté : 04 févr. 2008, 15:11
par saebakun
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 :)

Posté : 04 févr. 2008, 16:13
par Maitrepylos
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"

Posté : 04 févr. 2008, 16:16
par d0m
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.

Posté : 04 févr. 2008, 16:25
par Maitrepylos
Ha bon, enfin je me le met dans un coin, on ne sait jamais.

Posté : 04 févr. 2008, 16:25
par saebakun
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