probleme de recherche dans une base de données avec l'opérateur LIKE

nass
Invité n'ayant pas de compte PHPfrance

14 mai 2008, 15:00

Bonjour,

Je débute en PHP et je réalise actuellement un petit moteur de recherche en PHP/MySQL avec plusieurs critères de recherche. Mais j'ai un petit souci, avec ma requête : quand l'un des champs du formulaire est null, il m'affiche le contenu entier de ma base de données.

SGBD : MySQL5.0

Voici le shema de la table en question:

Code : Tout sélectionner

CREATE TABLE `animations` ( `anim_id` int(10) NOT NULL auto_increment, `anim_nom` varchar(100) character set utf8 collate utf8_bin NOT NULL, `anim_contenu` varchar(1000) character set utf8 collate utf8_bin NOT NULL, `anim_img` varchar(50) character set utf8 collate utf8_bin NOT NULL, `anim_categorie` varchar(30) character set utf8 collate utf8_bin NOT NULL, `anim_genre` varchar(50) character set utf8 collate utf8_bin NOT NULL, `mot_cle` varchar(50) character set utf8 collate utf8_bin NOT NULL, `anim_date` date NOT NULL, PRIMARY KEY (`anim_id`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=5 ;
Voici ma requête:

Code : Tout sélectionner

$req="select* from animations where anim_nom like '%".$nom_anim."%' or anim_date='$date_anim' or anim_categorie='$categorie_anim' or anim_genre='$genre_anim' or mot_cle like '%".$mot_cle."%' order by anim_date";
Voici le echo de ma requête une fois exécutée:

Code : Tout sélectionner

select* from animations where anim_nom like '%%' or anim_date='' or anim_categorie='' or anim_genre='' or mot_cle like '%%' order by anim_date
Je pense que le problème vient des %, il faudrait que je puisse les enlever si le champs est null.

Merci d'avance pour votre aide.

Eléphant du PHP | 422 Messages

14 mai 2008, 16:10

C'est sûr que si tu fais une recherche like '%%', ça va te retourner l'intégralité de ta base. Tu peux essayer un truc dans ce style :
if ($nom_anim) {
  $where_anim = "anim_nom like '%".$nom_anim."%'";
} else {
  $where_anim = "1!=1";
}
$req="select* from animations where ".$where_anim.
   " or anim_date='$date_anim' or anim_categorie='$categorie_anim' or anim_genre='$genre_anim' or mot_cle like '%".$mot_cle."%' order by anim_date";
Attention : tu peux avoir le même problème avec mot-cle.
Note : quand on construit des requêtes en dynamique avec des AND, il faut une clause toujours vraie quand rien n'est renseigné (typiquement 1=1) et avec des OR, une clause toujours fausse.

nass
Invité n'ayant pas de compte PHPfrance

14 mai 2008, 17:32

J'ai testé ce que tu m'a conseillé et ça fonctionne !!! :wink:

Voici le code:

Code : Tout sélectionner

if ($nom_anim) { $where_anim_nom = "anim_nom like '%".$nom_anim."%'"; } else { $where_anim_nom = "1!=1"; } if ($mot_cle) { $where_anim_mot_cle = "mot_cle like '%".$mot_cle."%'"; } else { $where_anim_mot_cle = "1!=1"; } $req="select* from animations where ".$where_anim_nom." or anim_date='$date_anim' or anim_categorie='$categorie_anim' or anim_genre='$genre_anim' or ".$where_anim_mot_cle." order by anim_date";
Merci encore caroube, T'es trop fort

ViPHP
ViPHP | 4039 Messages

14 mai 2008, 23:21

Bonjour,

Je débute en PHP et je réalise actuellement un petit moteur de recherche en PHP/MySQL avec plusieurs critères de recherche. Mais j'ai un petit souci, avec ma requête : quand l'un des champs du formulaire est null, il m'affiche le contenu entier de ma base de données.
Si tu tiens vraiment à approfondir les possibilités de recherche textuelle de MySQL, il faut t'orienter vers la recherche "fulltext" (http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html), qui te permet de vraiment faire de la recherche (sans recherche floue, ceci dit).

En bonus, il y a même la recherche booléenne, et quelques autres subtilités..

(en fait, tu peux pas vraiment faire de "moteur de recherche" avec like.. tout ce que tu fait c'est vérifier l'une ou l'autre présence, mais tu ne génères pas un score qui va te permettre de classer tes résultats.. enfin, sauf avec un traitement vachement complexe en php, mais a quoi bon, puisque fulltext fonctionne déjà et en bien mieux..)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Invité
Invité n'ayant pas de compte PHPfrance

15 mai 2008, 09:58

Si tu tiens vraiment à approfondir les possibilités de recherche textuelle de MySQL, il faut t'orienter vers la recherche "fulltext" (http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html), qui te permet de vraiment faire de la recherche (sans recherche floue, ceci dit).

En bonus, il y a même la recherche booléenne, et quelques autres subtilités..

(en fait, tu peux pas vraiment faire de "moteur de recherche" avec like.. tout ce que tu fait c'est vérifier l'une ou l'autre présence, mais tu ne génères pas un score qui va te permettre de classer tes résultats.. enfin, sauf avec un traitement vachement complexe en php, mais a quoi bon, puisque fulltext fonctionne déjà et en bien mieux..)
Merci de ton conseil Berzemus, je vais étudier tout ça...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

15 mai 2008, 10:50

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute