Requête pour moteur de recherche REGEXP

Eléphanteau du PHP | 29 Messages

17 oct. 2009, 23:30

Bonsoir, j'essaie de fabriquer une requête pour un moteur de recherche sur mon site, mais elle ne fonctionne pas. La requête à été combiné avec un system de pagination : http://antoine-herault.developpez.com/t ... ue-en-php/
$retour_messages = mysql_query('SELECT identifiant,appreciation_lecteur,nom_article_tronque,description,date_creation_fr,heure_creation,categorie,url FROM articles WHERE description REGEXP '.addslashes($recherche).' ORDER BY id DESC LIMIT '.$premiereEntree.','.$messagesParPage.'');
	
while($data = mysql_fetch_assoc($retour_messages))
{
...
}
ma table articles :
CREATE TABLE IF NOT EXISTS `articles` (
  `identifiant` varchar(20) collate latin1_general_ci NOT NULL,
  `texte` longtext collate latin1_general_ci NOT NULL,
  `date_creation` varchar(10) collate latin1_general_ci NOT NULL,
  `difficulte_realisation` varchar(255) collate latin1_general_ci NOT NULL,
  `puissance_necessaire` varchar(255) collate latin1_general_ci NOT NULL,
  `temps_realisation` varchar(255) collate latin1_general_ci NOT NULL,
  `description` longtext collate latin1_general_ci NOT NULL,
  `nom_article` varchar(255) collate latin1_general_ci NOT NULL,
  `url` varchar(255) collate latin1_general_ci NOT NULL,
  `url_miniature` varchar(255) collate latin1_general_ci NOT NULL,
  `code_article` varchar(255) collate latin1_general_ci NOT NULL,
  `nom_article_tronque` varchar(255) collate latin1_general_ci NOT NULL,
  `categorie_1` varchar(255) collate latin1_general_ci NOT NULL,
  `categorie_2` varchar(255) collate latin1_general_ci NOT NULL,
  `categorie_3` varchar(255) collate latin1_general_ci NOT NULL,
  `categorie_4` varchar(255) collate latin1_general_ci NOT NULL,
  `valideur` varchar(20) collate latin1_general_ci NOT NULL,
  `date_creation_fr` varchar(10) collate latin1_general_ci NOT NULL,
  `categorie` varchar(255) collate latin1_general_ci NOT NULL,
  `processeur` varchar(255) collate latin1_general_ci NOT NULL,
  `memoire` varchar(255) collate latin1_general_ci NOT NULL,
  `graphique` varchar(255) collate latin1_general_ci NOT NULL,
  `valide_le` varchar(10) collate latin1_general_ci NOT NULL,
  `valide_le_fr` varchar(10) collate latin1_general_ci NOT NULL,
  `heure_creation` varchar(8) collate latin1_general_ci NOT NULL,
  `visualisation` varchar(255) collate latin1_general_ci NOT NULL,
  `appreciation_lecteur` varchar(255) collate latin1_general_ci NOT NULL,
  `id` int(11) NOT NULL auto_increment,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `code_article` (`code_article`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1066 ;
Le message d'erreur :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /mnt/159/sdb/6/8/france.webmaster.fr/recherche.php on line 332
:?:
Modifié en dernier par NewDeveloppeur le 18 oct. 2009, 03:13, modifié 1 fois.
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

ViPHP
fab
ViPHP | 2657 Messages

18 oct. 2009, 01:22

En fait là avant de faire ton mysql_fetch_assoc tu ne vérifies pas avoir des résultats or visiblement ta requête ne te retourne rien
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 03:13

J'ai modifier la requête pour savoir d'où vient l'erreur et s'obtient ceci :
$retour_messages = mysql_query("SELECT * FROM articles WHERE texte REGEXP ".addslashes($recherche)." ORDER BY id DESC LIMIT ".$premiereEntree.",".$messagesParPage."") or die ("Erreur : ".mysql_error());
Et le message d'erreur :
Erreur : Unknown column '***' in 'where clause'
Les *** équivaut à la valeur de la variable $recherche, par exemple un mot clefs...
Modifié en dernier par NewDeveloppeur le 18 oct. 2009, 19:35, modifié 1 fois.
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

ViPHP
fab
ViPHP | 2657 Messages

18 oct. 2009, 03:18

Ta variable $recherche elle contient quoi?
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 18:23

La variable $recherche contient le terme de recherche, par exemple un mot clefs... Je réceptionne la valeur du champs de recherche avec un $_POST et je la stock dans $recherche
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

ViPHP
fab
ViPHP | 2657 Messages

18 oct. 2009, 19:43

Et dans ce cas pourquoi utiliser la fonction MySQL REGEXP si ta variable ne contient pas d'expression régulière? :p
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 20:01

Et dans ce cas pourquoi utiliser la fonction MySQL REGEXP si ta variable ne contient pas d'expression régulière? :p
Vous voulez dire par là que ça ne fonctionne pas avec une simple chaine ? Je dit ça parce que j'ai fait un site autrefois en utilisant directement la valeur du champs de recherche... et ça marchais...

Voici une petite image qui illustre tout ça :

Image
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 20:12

Trouvé !!! enfin je pense...

Quand j'utilise des ' ça à l'air de marcher...
$retour_messages = mysql_query("SELECT * FROM articles WHERE texte REGEXP '".addslashes($recherche)."' ORDER BY id DESC LIMIT ".$premiereEntree.",".$messagesParPage."") or die ("Erreur 0001 sur la page recherche.php".mysql_error());
J'ai utiliser :
texte REGEXP '".addslashes($recherche)."'
au lieu de ça :
texte REGEXP ".addslashes($recherche)."
... bizarre non ...
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

ViPHP
fab
ViPHP | 2657 Messages

18 oct. 2009, 20:21

Oh punaise! Oui désolé j'ai joué l'aveugle sur ce coup là et ça m'a couté quelques pages de lecture sur la documentation de regexp! Effectivement tu dois entouré ton expression régulière! Mais au passage REGEXP c'est assez lourd pourquoi n'utilise tu pas LIKE?
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 21:52

J'ai lu ça ici :

http://www.commentcamarche.net/contents/php/phpreg.php3
Cette fonction permet de générer une chaîne non sensible à la casse, pour les expressions régulières dans les bases de données par exemple. Dans MySQL lorsque vous utilisez la fonction REGEXP (au lieu de LIKE) la recherche est sensible à la casse. La solution est donc de générer une chaîne non sensible à la casse à l'aide de sql_regcase.
Et justement je ne comprend pas ce que veut dire " sensible à la case "... Si j'utilise un LIKE au lieu de REGEXP la recherche sera plus varié ?

En fait je suis pas sûr d'avoir compris, mais je pense être pas loin de la réponse... Corrigez-moi si je me trompe ( y a de grande chance )

Avec REGEXP :
Je tappe " test "
La requête me retourne tout les enregistrement comportant la chaine " test "

Avec LIKE :
Je tappe " test "
La requête me retourne tout les enregistrement comportant une chaine ressemblant à " test "
Même " t est ", " t-est ", " t_est ", " t e s t "...

Alors j'ai vrai ou faux ?
Modifié en dernier par NewDeveloppeur le 18 oct. 2009, 22:00, modifié 2 fois.
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

ViPHP
fab
ViPHP | 2657 Messages

18 oct. 2009, 21:58

Oui certes, mais le tout est de savoir si ça convient à TES besoins? Vu que tu dois faire de la recherche de mot cléfs il serait plus intéressant de pas être sensible a la casse car sinon quelqu'un qui va taper PHP et que dans ta base il y a Php le résultat ne sera pas en sortie... Après c'est peut être ce que tu veux ! Dans le cas contraire je te conseille vivement de regarder du côté de LIKE ou de MATCH
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 22:07

Vu que tu dois faire de la recherche de mot cléfs il serait plus intéressant de pas être sensible a la casse car sinon quelqu'un qui va taper PHP et que dans ta base il y a Php le résultat ne sera pas en sortie...
Bon actuellement j'utilise REGEXP...

Quand je tape : mère, Mère, mèRe, MèRE la requête me sort tout les news comportant la chaine mère à croire que les majuscules ne change rien, mais parcontre quand je tape mere ça ne me sort rien... LIKE peut y remédier ? :?: ignorer la présence d'accent par exemple... :?:

Exemple de news :
Propices à l'overclocking, les processeurs AMD ne sont pourtant pas tous débloqués (BE). Quelle est la meilleure technique à adopter dans ce cas (BIOS, AMD Overdrive, utilitaire de la carte mère), et comment procéder ? Réponse avec un Phenom II X3 710.
Si le format Mini-ITX de VIA n’avait jusqu’à présent pas vraiment rencontré un franc succès auprès des différents constructeurs de cartes mères, la situation semble peu à peu évoluer. Pour preuve, Intel a profité de l’IDF pour présenter un modèle de carte mère Mini-ITX destinée aux processeurs Core i5 et Core i7.
Entre nous, Google est vraiment balèze =D>
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

ViPHP
fab
ViPHP | 2657 Messages

18 oct. 2009, 22:21

Code : Tout sélectionner

requête SQL: SELECT description FROM `sf_guard_user_profile` WHERE description LIKE '%mere%' LIMIT 0 , 30;
Résultats :
description
Mère
mere

Code : Tout sélectionner

requête SQL: SELECT description FROM `sf_guard_user_profile` WHERE description LIKE '%mère%' LIMIT 0 , 30;
Résultats :
description
Mère
mere

Ca devrait répondre à ta question? :p
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 22:37

Oh que oui, quelle précision, merci bcp :D
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...

Eléphanteau du PHP | 29 Messages

18 oct. 2009, 22:53

C'est bizzare mais ça me retourne la même chose qu'avec REGEXP...
$retour_messages = mysql_query("SELECT * FROM articles WHERE texte LIKE '%".addslashes($recherche)."%' ORDER BY id DESC LIMIT ".$premiereEntree.",".$messagesParPage."") or die ("Erreur : ".mysql_error());
C'est bien correct ça :
WHERE texte LIKE '%".addslashes($recherche)."%'
:?:
Bienvenue sur :
http://france.webmaster.fr.free.fr
Fabrication en cours...