La recherche par mot clef dans une table mysql avec php

Soyez le premier à donner votre avis sur cette source.

Snippet vu 19 857 fois - Téléchargée 29 fois

Contenu du snippet

Bon, cela est peut-être sans grand interêt pour nombre de personnes, mais j'ai pensé que cela pourrait être intéressant de diffuser ce code puisqu'àprès l'avoir cherché dans tous les recoins du web, j'ai dû constater que personne n'avait fait quelquechose du genre, du moins, personne ne l'avait partagé.

Bref, il s'agit (simplement) d'un petit script dont je me sert en inclusion d'ordinaire, mais libre à vous de l'adapter à votre site... et il a la particularité de récupérer le nom des champs de la table MA_TABLE et de garder ceux qui correspondent aux champs Varchar, Text et Date et qui récupère le terme de recherche qui est contenu dans la variable $Recherche et qui en fait une requête prête à être envoyée à Mysql. Bon, je n'ai pas encore trouvé le moyen d'ordonner les résultats selon le nombre d'occurences, mais j'imagine que des âmes charitables sauront me donner un petit coup de pouce à ce sujet... Je conseille, si vous utilisez ce script de mettre ceci en option dans votre module de recherche car je n'ai pas pris en compte le fait que les recherches entre guillemets ne doivent pas être scindées et pas mal d'autre choses qui nous seraient bien utiles... Bref, un script surtout fait pour les curieux tant que je ne l'ai pas terminé comme un webmaster se doit de le faire.

Alors, pour l'exemple, voici ce que j'obtiens avec l'une des tables de mon site :
$Recherche= "PHP MYSQL";
Sur la table Article :

SELECT * FROM Article WHERE (Titre LIKE '%PHP%' OR Titre LIKE '%MYSQL%' OR Contenu LIKE '%PHP%' OR Contenu LIKE '%MYSQL%' OR Auteur LIKE '%PHP%' OR Auteur LIKE '%MYSQL%' OR Date LIKE '%PHP%' OR Date LIKE '%MYSQL%')

Source / Exemple :


<?
$MaTable="NOM_DE_MA_TABLE";
$Requete="SELECT * FROM $MaTable WHERE ";
$MotClef = explode(" ", $Recherche);
$NbMotClef = count($MotClef);
$Requete.= "(";
$RequeteTri=mysql_query("SHOW COLUMNS From $MaTable");
$I="0";
while ($Row = mysql_fetch_array($RequeteTri))
{
$Type = eregi_replace("[^a-z]", "", $Row['Type']);
$I2="0";
	if((($Type=="varchar")||($Type=="text")||($Type=="date")))
	{
	if($I!="0") { $Requete.= " OR "; }
	reset($MotClef);
	foreach($MotClef as $V)
		{
		$I2++;
		$Requete.= $Row['Field'] . " LIKE '%$V%'";
		if($I2!=$NbMotClef) { $Requete.= " OR "; }
		}
	$I++;
	}
}
mysql_free_result($RequeteTri);

$Requete.= ")";
echo $Requete;
?>

Conclusion :


Voilà, bonne utilisation, et sachez que tout cela sera dispo sur mon autre code source, celui où je met tout mon site, car je suis actuellement dans une complète rénovation et automatisation de ce dernier. Nottament, je peux faire tourner mon site en laissant le register_global off et le signalement des erreurs du type Notice car l'utilisation de ces options devient déprécated alors, va nous falloir nous y faire et je pense que c'est un gain sérieux en rapidité et en sécurité. Bref, tout cela sera bientôt mis sur le code source en question.

@++++ Hell

A voir également

Ajouter un commentaire

Commentaires

_klesk
Messages postés
70
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
20 août 2008

Pour ceux que ca interesse, ce source remplis ma demande

http://www.phpcs.com/codes/MOTEUR-RECHERCHE-DANS-BDD-II_38782.aspx

coder pour php5 j'ai commenter pour du compatible php4.

xD
_klesk
Messages postés
70
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
20 août 2008

Bonjour,
j'utilise ton code depuis quelque temps et cela me conveniat au poil, mais maintenant la structure de ma table à changée et le code ne me donne pas les réponses attendues.

-Avant :

Recherche de mot clée sur un colonne qui ne contenait que du text.
Une recherche sur "mémoire ddr2 1024 corsaire" me sortait bien toutes les "mémoires ddr2 1024 corsaire"

-Maintenant :

colonne 1 :
famille : "Mémoire"
colonne 2 :
désignation : ddr2 1024
colonne 3:
Marque : "corsaire"

Le soucis c'est que tout ce qui contient "Mémoire", "ddr", et/ou "corsaire" est affiché.

Je suis tout a fait consient que c'est le but rechercher de cette fonction, mais il y a t'il moyen d'adapter pour avoir le même résultat que avant ??

D'avance merci.
cs_iubito
Messages postés
629
Date d'inscription
mercredi 3 juillet 2002
Statut
Membre
Dernière intervention
9 octobre 2006

ça c'est une question de débutant en SQL.
select * from tableclient where nomclient like 'A%'

Voici des cours et docs qui te seront utils...
--> http://sqlpro.developpez.com : bonne lecture ! y'a de quoi lire :D
--> http://dev.mysql.com/doc/mysql/fr/ : doc officielle MySQL
allylo
Messages postés
4
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
7 juin 2004

SLT je suis entrain de faire une base de donnée avec php mysql et je voulai savoir si on peu faire une recherche dans la table client des nom des client par leurs premiere lettre merci
yakou32
Messages postés
33
Date d'inscription
dimanche 14 mars 2004
Statut
Membre
Dernière intervention
3 avril 2015

OK, merci pour toutes ces infos !

Malheureusement, je crains de ne pas avoir encore le niveau suffisant pour pouvoir en tirer parti...
Bon, je vais me rabattre sur un formulaire avec 1 saisie pour chaque champ. Peut-être sauras-tu alors m'aider avec cette histoire de caractère générique par défaut à ne pas prendre en compte dans la recherche ?

Ceci dit, comme le sujet t'interesse, sache que l'une des dernières versions de phpMyAdmin, (la dernière?) 2.5.6 propose un moteur de recherche sous forme de formulaire, avec une seule saisie, et le choix 1mot/tous les mots/phrase exacte
->voir la capture :
http://www.rocenpognes.com/temp/capture.gif

La solution n'est donc pas très loin, mais le code de phpMyadmin est trop hermétique pour le débutant que je suis :(

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.