[MYSQL]Recherche dans la base de donnée - like %% moteur de recherche internet |
|---|
[MYSQL]Recherche dans la base de donnée - like %% moteur de recherche internetNote : 2.9/5 (6 votes) Derniéres modifications : 12/07/2010 à 00:17:21 Mots-Clés : recherche base de donnée mysql like sql moteur de recherche internet php bdd like%% tutoriel script fonction chercher dans la base de donnée mysql operateur recherche moteur mysql tutoriel like not like mysql regex mysql dans ce tutoriel, je vais vous montrer comment simplement effectuer une recherche dans une base de donnée mysql en utilisant le php. Au cours de ce tutoriel, nous allons utiliser la table utilisateurs: Code: SQL
Voici à quoi ressemble la table utilisateurs:-- -- Structure de la table `utilisateurs` -- CREATE TABLE `utilisateurs` ( `id` bigint(20) NOT NULL, `pseudo` varchar(255) NOT NULL, `nom` varchar(255) NOT NULL, `genre` varchar(255) NOT NULL, `infos` text NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Contenu de la table `utilisateurs` -- INSERT INTO `utilisateurs` VALUES (1, 'ybouane', 'Yassine', 'homme', 'j''aime le php et le mysql'); INSERT INTO `utilisateurs` VALUES (2, 'utilisateur01', 'Mon nom', 'homme', 'je fait du php mysql css javascript'); INSERT INTO `utilisateurs` VALUES (3, 'utilisateur02', 'Utilisateur', 'femme', 'je suis un exemple'); INSERT INTO `utilisateurs` VALUES (4, 'utilisateur03', 'L''utilisateur 3', 'femme', 'Je sais programmer en php.'); ![]() Pour effectuer une recherche, il faut utiliser l'operateur de comparaison LIKE. Comme vous le savez sûrement, dans le langage SQL, il ya la possibilité de filtrer les résultats selon certains critères. Pour cela, il faut utiliser la clause WHERE. Pour par exemple filtrer la liste des utilisateur qui sont des hommes, il suffit de faire: Code: SQL SELECT * FROM utilisateurs WHERE genre="male" Dans ce cas, nous avons utilisé l'opérateur de comparaison = (égale). Cet opérateur permet de filtrer les résultats ayant une valeur éxacte. Pour effectuer une recherche dans les informations des membres, on ne peut pas se limiter à des comparaison éxactes. Si nous voulons par exemple filtrer les résultats pour n'avoir que les personnes ayant dans leur informations l'expression "php MYSQL", on doit passer par l'opérateur de comparaison LIKE et notre code SQL sera: Code: SQL SELECT * FROM utilisateurs WHERE infos LIKE "%php MYSQL%" Vous remarquerez qu'il ya des %(pourcent) ce caractère remplace n'importe quel nombre de caractères, y compris aucun. Vous pouvez aussi utiliser le caractère _ qui remplace exactement un caractère. Si vous désirez rechercher le caractère % ou _ il vous suffit de les échapper en utilisant \% ou \_ Dans notre script, nous allons utiliser trois possibilités de recherche:
Voici le script pour faire un moteur de recherche: Code: PHP
<?php mysql_connect('hote','utilisateur','mot_de_passe'); mysql_select_db('base_de_donnee'); //On determine l'expression a rechercher if(isset($_GET['recherche'])) { $rec = htmlentities($_GET['recherche']); } else { $rec = 'php MYSQL'; } //On determine le type de recherche if(isset($_GET['type'])) { if($_GET['type']=='un')//Un des mots { $type = 1; } elseif($_GET['type']=='tout')//Tout les mots { $type = 2; } else//L'expression exacte { $type = 3; } } else { $type = 1;//type par defaut: L'expression exacte } //On determine si on doit surligner les mots dans les resultats if(!isset($_GET['surligner']) or $_GET['surligner']!='true') { $surligner = false; } else { $surligner = true; } //On dertermine les identifiants, les noms et les informations des utilisateur $req = 'SELECT id, nom, infos FROM utilisateurs WHERE '; if($type==1) {//ayant un des mots dans leurs informations $mots = explode(' ',$rec);//En separre lexpression en mots cles foreach($mots as $mot) { $req .= ' infos LIKE "%'.$mot.'%" OR'; } $req .= ' 1=0'; } elseif($type==2) {//ayant tout des mots dans leurs informations $mots = explode(' ',$rec);//En separre lexpression en mots cles foreach($mots as $mot) { $req .= ' infos LIKE "%'.$mot.'%" AND'; } $req .= ' 1=1'; } else {//ayant l'expression exacte dans leurs informations $req .= 'infos LIKE "%'.$rec.'%"'; } //Les utilisateur seront ranges par identifiant en ordre croissant $req .= ' order by id asc'; $requete = mysql_query($req); //Le formulaire de recherche ?> <form action="" method="get"> Expression à rechercher: <input type="text" name="recherche" value="<?php echo $rec; ?>" /><br /> Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="tout"<?php if($type==2){echo 'checked="checked"';} ?> /> Tout les mots <input type="radio" name="type" value="exacte"<?php if($type==3){echo 'checked="checked"';} ?> /> Expression exacte<br /> Mettre en gras les mots recherchés: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br /> <input type="submit" value="Rechercher" /> </form> <h2>Résultats</h2> <table> <tr> <th>Identifiant</th> <th>Nom</th> <th>Informations</th> </tr> <?php //On affiche les resultats while($dnn = mysql_fetch_array($requete)) { ?> <tr> <td><?php echo $dnn['id']; ?></td> <td><?php echo $dnn['nom']; ?></td> <td><?php if($surligner)//Si il faut surligner les mots, on les surligne { if($type==3) { echo preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['infos']);//On surligne l'expression exacte } else { echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['infos']);//On surligne les mots cles de la recherche } } else { echo $dnn['infos'];//On ne surligne pas } ?></td> </tr> <?php } ?> </table> Vous pouvez maintenant adapter cet exemple à votre site. Merci et j'espère que ce tutoriel vous sera utile. Scripts et tutoriaux similaires à celui ci:
CommentairesAjouter un commentaireLes commentairesEnvoyé par aglzime le 13/07/2010 à 00:49:16
Magnéfique travaille Maitre!!!!
;) Envoyé par samwebo le 02/08/2010 à 12:43:58
cool
Envoyé par cocola le 03/08/2010 à 17:15:38
bravo, it's a good one!!
Envoyé par UNLITOPAVAITO le 10/09/2010 à 11:03:55
Hi Iam Prabhu from chennai,joined today in this forum... :)
Envoyé par PPPP le 07/10/2010 à 12:43:04
Bonjour merci pour le tuto, il est tres clair et ouvre sur l'exploitation d'une BDD. Cependant ce script fonctionne avec le moteur MyISAM or dans mon projet je souhaite utiliser innoBD pour créer des relation entre différentes table . Peut on utiliser ce script avec innoDB ou doit on faire des modifications.
Merci encore Envoyé par Luky_VJ le 10/12/2010 à 10:55:19
Bonjour, j'ai essayé votre code, qui bizarrement me ressors cette erreur :"
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\php form\lebontest.php on line 225 " mon code est celui ci : " <?php mysql_connect('localhost','root',''); mysql_select_db('tests'); //On determine l'expression a rechercher if(isset($_GET['recherche'])) { $rec = htmlentities($_GET['recherche']); } else { $rec = 'php MYSQL'; } //On determine le type de recherche if(isset($_GET['type'])) { if($_GET['type']=='un')//Un des mots { $type = 1; } elseif($_GET['type']=='tout')//Tout les mots { $type = 2; } else//L'expression exacte { $type = 3; } } else { $type = 1;//type par defaut: L'expression exacte } //On determine si on doit surligner les mots dans les resultats if(!isset($_GET['surligner']) or $_GET['surligner']!='true') { $surligner = false; } else { $surligner = true; } //On dertermine les identifiants, les noms et les informations des utilisateur $req = 'SELECT id, username, email FROM forumusers WHERE '; if($type==1) {//ayant un des mots dans leurs informations $mots = explode(' ',$rec);//En separre lexpression en mots cles foreach($mots as $mot) { $req .= ' infos LIKE "%'.$mot.'%" OR'; } $req .= ' 1=0'; } elseif($type==2) {//ayant tout des mots dans leurs informations $mots = explode(' ',$rec);//En separre lexpression en mots cles foreach($mots as $mot) { $req .= ' infos LIKE "%'.$mot.'%" AND'; } $req .= ' 1=1'; } else {//ayant l'expression exacte dans leurs informations $req .= 'infos LIKE "%'.$rec.'%"'; } //Les utilisateur seront ranges par identifiant en ordre croissant $req .= ' order by id asc'; $requete = mysql_query($req); //Le formulaire de recherche ?> <form action="" method="get"> Expression à rechercher: <input type="text" name="recherche" value="<?php echo $rec; ?>" /><br /> Type de recherche: <input type="radio" name="type" value="un"<?php if($type==1){echo 'checked="checked"';} ?> /> Un des mots <input type="radio" name="type" value="tout"<?php if($type==2){echo 'checked="checked"';} ?> /> Tout les mots <input type="radio" name="type" value="exacte"<?php if($type==3){echo 'checked="checked"';} ?> /> Expression exacte<br /> Mettre en gras les mots recherchés: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br /> <input type="submit" value="Rechercher" /> </form> <h2>Résultats</h2> <table> <tr> <th>Identifiant</th> <th>Nom</th> <th>Informations</th> </tr> <?php //On affiche les resultats while($dnn = mysql_fetch_array($requete)) { ?> <tr> <td><?php echo $dnn['id']; ?></td> <td><?php echo $dnn['nom']; ?></td> <td><?php if($surligner)//Si il faut surligner les mots, on les surligne { if($type==3) { echo preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['infos']);//On surligne l'expression exacte } else { echo preg_replace('#('.str_replace(' ','|',preg_quote($rec)).')#i', '<strong>$1</strong>', $dnn['infos']);//On surligne les mots cles de la recherche } } else { echo $dnn['infos'];//On ne surligne pas } ?></td> </tr> <?php } ?> </table> " Envoyé par sniffle83 le 10/01/2011 à 22:54:14
luky-Vj:
ton probleme ne viendrai til pas tu fai que tu fais $req = 'SELECT id, username, email FROM forumusers WHERE '; et que plus bas on retouve 'infos' $req .= ' infos LIKE "%'.$mot.'%" OR'; echo preg_replace('#('.preg_quote($rec).')#i', '<strong>$1</strong>', $dnn['infos']);//On surligne et a d'autre endroit encore, infos été un champs dans l'exemple du site toi tu a les champs id, username, email... Envoyé par Sana le 20/01/2011 à 23:55:03
Merci pour le tuto ca marche
Envoyé par Claude le 31/07/2011 à 14:00:42
Comment modifier pour que la recherche se fasse sur le mot entier ?
Par exemple une recherche sur le sortira leçon, mirabelle, pleuvoir... Très bon code que j'essaye d'adapter pour l'utilisation sur deux tables jointes Envoyé par atmoner le 13/09/2011 à 18:33:28
Euuhhh... je trouvais le concept intéressant... mais après avoirs regarder le code, rien n'est sécuriser...!! si vous ne voulez pas faire de votre site un vrai gruyère, éviter d'utiliser ce script... ou alors repasser tout en revue ;)
Envoyé par jzbjzb le 15/11/2011 à 15:31:23
Merci Ybouane pour ce superbe moteur de recherche !
Envoyé par keunene le 10/12/2011 à 22:58:35
merci frère. j'ai utilisé ce code pour faire un dictionnaire biblique tout en l'améliorant Envoyé par ubtic le 15/12/2011 à 00:57:48
J'ai essayé votre code voici l'erreur que la machine retourne
Expression à rechercher: Type de recherche: Un des mots Tout les mots Expression exacte Mettre en gras les mots recherchés: Résultats Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /opt/lampp/htdocs/moteurdeRecherche.php on line 86 Identifiant Nom Informations.Comment je peux la corriger j'utilise ubuntu 10.04 avec xampp Envoyé par rmoxgxqb le 24/01/2012 à 12:28:30
20
Envoyé par Unmarked le 28/02/2012 à 08:59:40
1 semaine de recherche sur plein de forum, rien trouvé d'aussi fonctionnel. on peut améliorer mais la base est la et ca fonctionne !
Bravo Envoyé par Pharme717 le 07/04/2012 à 21:52:27
Hello! fakcedc interesting fakcedc site! I'm really like it! Very, very fakcedc good!
Envoyé par Pharme929 le 07/04/2012 à 21:53:34
Very nice site!
Envoyé par Papon le 12/05/2012 à 13:15:52
Merci beaucoup pour tous ces scripts
Envoyé par au plus simple le 05/06/2012 à 16:21:08
Une solution par une fonction incluse dans le langage MySQL
SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); Envoyé par alphaconde le 03/07/2012 à 21:17:57
Et si on veut étendre la recherche sur plusieurs tables et sur plusieurs champs????
Envoyé par alphaconde le 03/07/2012 à 21:46:39
Et si on veut étendre la recherche sur plusieurs tables????
Envoyé par alphaconde le 03/07/2012 à 21:47:27
Et si on veut étendre la recherche sur plusieurs tables????
Envoyé par tWTdDhku le 08/09/2012 à 07:27:26
Bizarre les mots cle9s 0_b0Ce sont pour la plupart, des noms de sites.Les gens seaneirt-ils trop faine9ant pour les taper dans la barre d'adresse ? Ou peut eatre, n'utilisent-ils pas de favoris ?
Envoyé par flatmind le 19/12/2012 à 17:11:32
le like ne trouve pas les phrases avec des () dans la base
"truc en tecte(un truc)pour tester si ca trouve bein(3712)truc" la solution est de savoir quoi faire dans une fonction de traitement de caractère pour que le like fonctionne. $out_text = preg_replace("[^a-z0-9]",'',$text); replace quoi par quoi??? Envoyé par neoboz le 15/03/2013 à 05:02:34
nikel fonctionnel bien ^^ merci mon pote
Envoyé par jack le 05/04/2013 à 11:23:46
super ca marche
maintenant je voudrais encoder en json le résultat qui pour m'aider en vous remerciant jack |