Effectuer une recherche à l'aide d'un array

Résolu/Fermé
salimdrame Messages postés 70 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 juin 2011 - 28 déc. 2009 à 19:46
salimdrame Messages postés 70 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 juin 2011 - 29 déc. 2009 à 12:39
Bonjour,

Je bloque sur un code depuis un bout de temps déjà et je commence à me demander si ce que je veux faire est possible. Voici le topo. En résumé j'ai un formulaire sur mon site qui récupère la recherche du visiteur et la transforme en tableau (array) dans le but de rechercher une correspondance mot par mot dans la base de données.

---------------------------- Code Html ---------------------

<form action="search.php" method="post">
<input type="text" name="recherche" maxlength="75" value="un mot ou un terme" onclick="if(this.value=='un mot ou un terme')this.value='';" />
< select name="area">
<option value="repertoire">Répertoire</option>
<option value="formations">Formations</option>
<option value="forum">Forum</option>
</select>
<input type="image" src="../img/search.png" style="vertical-align:middle;" />
</form>

----------------------------- PHP ---------------------------------

//On stock la chaine dans une variable
$recherche = $_POST['recherche'];

//On filtre les caractères et remplace les espaces et les caractères indésirables par un +
$recherche = preg_replace('/([^.a-zA-Z_0-9\'.šÐØÞßðŠúÚÛÙÜýÝŸÿžŽóÓÔÒøØõÕÖœŒÇÉÊÈËíÍÎìÌÏñÑ$€¢£¥ƒåÅÄÂãÃÁÀæÆçàåâäéèêëîìïòôöùûü,;:"!()\\-]+)/i', '+', $recherche);

//On crée un tableau
$array_chaine = explode('+', $recherche);

Et à partir de là j'aimerais que si la chaine "recherche" comprends 3 mots par exemple, que la requête sql qui se charge de sonder la table à la recherche de correspondances prenne en compte chaque mot séparément de sorte en afficher tout les résultat qui comprennent au moins 1 des 3 mots que contient la chaine.

Pensez vous que c'est possible en PHP? Si oui comment?

Merci d'avance

5 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
29 déc. 2009 à 10:35
la soluc:

au lieu de rechercher mot par mot dans la boucle foreach avec une query à chaque passage, tu cree une seule query et dans ta boucle tu genres la condition avec des OR pour chaque mot

$condition=""; //init
foreach ($array_chaine as $index=> $keyword){
	if($index==0){
		$condition.=" champ_xxxxx LIKE '%".$keyword."%'";
  }elseif($index>0{
	$condition.=" OR champ_xxxxx LIKE '%".$keyword."%'"; //attention ne pas oublier l'espace avant OR !
  }
 }
 
 $query="SELECT DISTINCT champ_xxxxxx FROM tatable WHERE ".$condition." ";
 mysql_query($query);
 etc...
1
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 259
28 déc. 2009 à 20:25
Salut,
la suite ressemblerait à ça :
//On crée un tableau
$array_chaine = explode('+', $recherche); 

//On effectue la recherche pour chacun des éléments du tableau
foreach ($array_chaine as $ $keyword){
  $result = mysql_query('SELECT machin IN truc WHERE condition="'.$keyword.'"');
  //...suite du traitement des résultats
}
0
salimdrame Messages postés 70 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 juin 2011 1
28 déc. 2009 à 22:03
Super! Ça marche mais j'ai un nouveau problème.

J'aimerais afficher un résultat pour plusieurs mots correspondants. Je m'explique : Lorsque dans une suite de mots j'ai trois mots qui font référence au même résultat, ce même résultat apparait 3 fois. Comment faire pour afficher le résultat une fois et ignorer le ou les doublons?

Merci encore
0
salimdrame Messages postés 70 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 juin 2011 1
29 déc. 2009 à 10:19
Quelqu'un aurait une idée? Un suite de solution? Vu que le début a été donné :-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
salimdrame Messages postés 70 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 24 juin 2011 1
29 déc. 2009 à 12:39
Merci à tous !

Ça marche à merveille !
0