Vous êtes ici: Support du web > Scripts et tutoriaux > PHP / MYSQL > [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 internet

[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 internet
Note : 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

Bonjour,
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
--
-- 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.');
Voici à quoi ressemble la table utilisateurs:

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:
  • Trouver l'expression éxacte
  • Trouver un des mots
  • Trouver tout les mots


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 &agrave; 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&eacute;s: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br />
<input type="submit" value="Rechercher" />
</form>
<h2>R&eacute;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:

Commentaires

Ajouter un commentaire





Vous n'êtes actuellement pas connecté, certaines de vos informations(tel que votre Adresse IP) seront enregistrées pour éviter du spam.
Votre message ne doit pas contenir certains mots ou une adresse internet, sinon, il ne sera pas envoyé.

Les commentaires

Envoyé 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 &agrave; 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&eacute;s: <input type="checkbox" name="surligner" value="true" <?php if($surligner){echo 'checked="checked"';} ?> /><br />
<input type="submit" value="Rechercher" />
</form>
<h2>R&eacute;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


Il y a actuellent 11 personne(s) connecté(es)
Page générée en 0.003948 secondes
Retour en haut
Règlements - Nous contacter - Aider le site - RSS News
Copyright © Support du web - Toute copie partielle ou complète de nos créations est interdite sans l'accord de ses auteurs.
Toutes les marques citées appartiennent à leurs compagnies respectives.