Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2007, 11h35   #1
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
Par défaut Recherche FULLTEXT

Re Bonjour tout le monde
Je reviens encore avec mes problèmes (il y en a un autre et se serra fini )

J'ai créer une petit moteur de recherche en FULLTEXT (et LIKE si l'on veut rajouter des critères à la recherche)
Bon bref c'est pas terrible et je suis consient de pas être un pro du PHP.
MAIS et je dis bien mais, un problème persiste.

La recherche fonctionne, SAUF sur un client (et seulement 2 caractère je ne sais pourquoi)

Je vous explique :

Voici ma table :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE TABLE `clients` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `categorie` varchar(200) DEFAULT NULL,
  `nom` varchar(200) DEFAULT NULL,
  `prenom` varchar(200) DEFAULT NULL,
  `profession` varchar(200) DEFAULT NULL,
  `societe` varchar(200) DEFAULT NULL,
  `adresse` varchar(200) DEFAULT NULL,
  `adresse2` varchar(200) DEFAULT NULL,
  `codepostal` varchar(200) DEFAULT NULL,
  `ville` varchar(200) DEFAULT NULL,
  `fixe` varchar(200) DEFAULT NULL,
  `fax` varchar(200) DEFAULT NULL,
  `portable` varchar(200) DEFAULT NULL,
  `fonction` varchar(200) DEFAULT NULL,
  `site` varchar(200) DEFAULT NULL,
  `mail` varchar(200) DEFAULT NULL,
  `commentaire` text,
  `idnom` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `nom` (`categorie`,`nom`,`prenom`,`profession`,`societe`,`adresse`,`adresse2`,`codepostal`,`ville`,`fixe`,`fax`,`portable`,`fonction`,`site`,`mail`,`commentaire`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4267 ;

Et Voici l'endroit ou ça foire :

Code :
1
2
 
(43, 'Particulier', 'Bidddl', 'Mil Ldeuc', NULL, NULL, '2 rue des nouilles patates frite', '', '66600', 'Moulinlaville', '0376564657', NULL, '', NULL, NULL, 'jl.bihll@mangerlesfrite.zo', 'Famille\r\n', 37),
Lorsque je recherche "jl", il ne me trouve pas l'adresse mail (même si l'on remplace "jl" par "yu" ou n'importe quoi qui à 2 caractère) Par contre si je recherche "bihll" ou "mangerlesfrite" il me retourne bien l'adresse mail....
Alors que

Code :
1
2
3
 
(1, 'Particuliers', 'Badouhe', 'Cladee', NULL, NULL, '21 bis nan tu sauras pas', '', '57950', 'Icibas', '0344444444', NULL, '0666666666', NULL, NULL, 'cl.bau
zer@free.fr', 'Famille\r\n', 28),
ici si l'on recherche "cl" il retourne bien l'adresse mail !!!


Au cas ou voici un bout d'mon code php (la partie requete pour la recherche)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
if ($zcrite=='znom'){
$requetemysql = "SELECT *  FROM ".$table." WHERE nom LIKE \"%".$recherche."%\"";
}
elseif ($zcrite=='zprenom') {
$requetemysql = "SELECT *  FROM ".$table." WHERE prenom LIKE \"%".$recherche."%\"";
}
elseif ($zcrite=='zvillez'){
$requetemysql = "SELECT *  FROM ".$table." WHERE ville LIKE \"%".$recherche."%\"";
}
else{
$requetemysql = 'SELECT *  FROM '.$table.' WHERE MATCH (categorie,nom,prenom,profession,societe,adresse,adresse2,codepostal,ville,fixe,portable,fonction,mail,commentaire ) AGAINST(\''.$recherche.'*\'IN BOOLEAN MODE)';
}
Je n'ai vraiment aucune idée pourquoi il ne veut pas chercher dans cette foutu ligne les 2 caratères avant le point de l'adresse mail...

Merci beaucoup à vous tous
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 11h51   #2
Membre actif
 
Inscription : août 2002
Messages : 194
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 194
Points : 194
Points : 194
Envoyer un message via MSN à Léortien
extrait du manuel mysql en ligne dans une partie qui parle de MATCH... AGAINST

Citation:
MySQL utilise un filtre très simple pour séparer le texte en mots. Un "mot" est n'importe quelle chaîne de caractères constituée de lettres, chiffres, ‘'’ et ‘_’. Tout "mot" présent dans la liste des mots à ignorés ou qui est trop court (3 caractères ou moins) est ignoré.

cl est trop court je dirais
Léortien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 12h18   #3
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
La recherche est en BOOLEAN donc pas de problème au niveau du nombre de caractère.

Et si la recherche était trop courte pourquoi alors trouver une autre ligne lorsque je recherche "cl" (regarde mon post de départ tu comprendras mieux)

Merci quand même
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 12h42   #4
Membre actif
 
Inscription : août 2002
Messages : 194
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 194
Points : 194
Points : 194
Envoyer un message via MSN à Léortien
et il te renvoit autre chose?
il se pourrait qu'un autre enregistrement corresponde mieux...


ou alors essaye de mettre dans les autres champs des . histoire de voir si jamais ce ne serait pas le . qui gènerait pour la recherche...
Léortien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 12h49   #5
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
Non le . ne dérange pas puisqu'avec le 2 eme exemple que je vous donne ça marche.
Et même si je change les 2 caractère du premier exemple ça ne marche pas.

Et pour reprendre mon premier post :

(1, 'Particuliers', 'Badouhe', 'Cladee', NULL, NULL, '21 bis nan tu sauras pas', '', '57950', 'Icibas', '0344444444', NULL, '0666666666', NULL, NULL, 'cl.bau
zer@free.fr', 'Famille\r\n', 28),

La recherche avec "cl" fonctionne parfaitement
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 13h27   #6
Membre éprouvé
 
Inscription : février 2004
Messages : 456
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 456
Points : 428
Points : 428
Salut,

jpose toujours la question au cas où.. est-ce que tu fais des echo de tes requêtes pour les tester directement dans phpMyAdmin?
billoum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 13h39   #7
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
Oui bien sur
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 14h17   #8
Membre éprouvé
 
Inscription : février 2004
Messages : 456
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 456
Points : 428
Points : 428
J'ai été relire la doc et ils ne disent nulle part que les mots de 3 lettres ou moins ne sont pas ignorés en mode Boolean...

Ce qui est donc bizarre c'est qu'il te renvoie des résultats pour la recherche 'cl'...
billoum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 14h20   #9
Membre actif
 
Inscription : août 2002
Messages : 194
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 194
Points : 194
Points : 194
Envoyer un message via MSN à Léortien
la requête renvoit quelquechose ou rien?
on sait qu'elle ne renvoit pas ce qu'il faut, mais ça donne quoi ?

un autre enregistrement avec les lettres?
__________________
Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait.
(\ _ /)
(='.'=) Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant.


Spidercochon, spidercochon, il peut marcher au plafond
...MM ......Voici Spidercochon. Aidez le à conquérir le monde
E(....)~....en le reproduisant.
...w
Léortien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 14h30   #10
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
La requete ne renvoie rien.
Non pas d'autre enregistrement apparement (même avec LIKE)

La requête :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
SELECT *
FROM clients
WHERE MATCH (
categorie, nom, prenom, profession, societe, adresse, adresse2, codepostal, ville, fixe, portable, fonction, mail, commentaire
)
AGAINST (
'jl*'
IN BOOLEAN
MODE
)
LIMIT 0 , 30
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 16h20   #11
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
Hum en fait il trouve les autre ligne car "cl" par exemple est présent ailleur que dans le champs mail.

L'opérateur * ne match pas les "."

Y aurait-il une astuce ?

(sans reconfigurer le nombre de caractère minimum admis dans la recherche FULLTEXT svp...)
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 00h12   #12
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Je reformule ta recherche ainsi : "trouver dans une série de colonne si au moins l'une d'entre elle contient un mot commençant par jl et pouvant contenir les divers caractères admis dans une adresse e-mail (donc pas d'espace)".

Si ma définition est bonne, tu peux utiliser une expression régulière :

Code :
1
2
3
4
5
6
WHERE CONCAT_WS(' ',
  categorie, nom, prenom, profession, societe, adresse, 
  adresse2, codepostal, ville, fixe, portable, fonction, 
  mail, commentaire
)
REGEXP '[[:<:]]jl[^[:blank:]]*[[:>:]]'
J'explicite un peu :
  • [[:<:]] : début de mot
  • [^[:blank:]]* : une série de caractères non-blancs (différents de espace, tabulation, retour chariot, etc.)
  • [[:>:]] : fin de mot
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 08h35   #13
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
Merci beaucoup à toi (dommage que je ne maitrise pas REGEXP ça a l'air très puissant !)

J'ai donc reformulé ma requete qui maintenant est :

Code :
1
2
 
SELECT *  FROM '.$table.' WHERE CONCAT_WS (categorie,nom,prenom,profession,societe,adresse,adresse2,codepostal,ville,fixe,portable,fonction,mail,commentaire ) REGEXP \'[[:<:]]jl[^[:blank:]]*[[:>:]]\'  AGAINST(\''.$recherche.'*\'IN BOOLEAN MODE ORDER by prenom DESC LIMIT '.$limite.','.$nombre.'
Mais ça ne marche pas

Citation:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AGAINST('hl*'IN BOOLEAN MODE)' at line 1
Je ne suis pas près à apprendre le REGEXP tout de suite (car je préfère maitriser d'autre chose en PHP et approfondir mes connaissances sur d'autre points) mais je m'y metterais ça c'est sur !

En attendant je te demande un peu d'aide de se côté.
Bien sur je peux comprendre que tu n'ais pas envie de refaire ma requête et te prendre la tête la dessus

Encore une fois merci (à toi et à vous tous ! )
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 08h53   #14
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Les regex n'ont rien à voir avec la recherche FULLTEXT. Il n'y a donc ni AGAINST ni BOOLEAN MODE avec REGEXP, et il faudra que tu isoles le cas hl* de ceux que tu veux traiter avec MATCH.

Pour ce qui est de la syntaxe à utiliser, c'est pile poil celle que je t'ai donnée : CONCAT_WS(' ', colonnes) REGEXP 'expression'.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 10h33   #15
Invité de passage
 
Inscription : décembre 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 26
Points : 3
Points : 3
Envoyer un message via MSN à izbing
Voici ma requête maintenant :

Code :
1
2
3
4
5
6
 if ($nbs_car==2){
 $requetemysql = "SELECT *  FROM ".$table." WHERE CONCAT_WS(' ', categorie, nom, prenom, profession, societe, adresse, adresse2, codepostal, ville, fixe, portable, fonction, mail, commentaire)
REGEXP '[[:<:]]jl[^[:blank:]]*[[:>:]]'";
 }
 
$req = mysql_query(''.$requetemysql.' ORDER by NULL DESC LIMIT '.$limite.','.$nombre.'')or exit(mysql_error());
Il trouve bien les 2 caractère seulement il fait la recherche sur le seul et même résultat maintenant.

Je dis qu'il fait bien la recherche car mon script surligne le résultat...
Et même si les 2 caractère n'apparaisse pas il affiche le même résultat
izbing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 22h41   #16
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par izbing
Il trouve bien les 2 caractère seulement il fait la recherche sur le seul et même résultat maintenant.

Je dis qu'il fait bien la recherche car mon script surligne le résultat...
Et même si les 2 caractère n'apparaisse pas il affiche le même résultat
Euh... ça veut dire que c'est OK ou qu'il reste un problème ? (et dans ce cas, lequel ?)
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 13h58   #17
Invité de passage
 
Inscription : février 2007
Messages : 1
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 1
Points : 1
Points : 1
Bonjour, voici un script en php 5 qui permet de faire ce genre de recherche fulltext, avec résultats par pertinence, sans charger le serveur mysql ni la mémoire allouée aux scripts php (fonctionne avec des regexp).

Moteur de recherche fulltext en php 5

Il faut juste configurer les tables à scanner et quelques autres choses.
Martoclou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h39.


 
 
 
 
Partenaires

Hébergement Web