Effectuer une recherche à l'aide d'un array [Résolu/Fermé]

Signaler
Messages postés
70
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
24 juin 2011
-
Messages postés
70
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
24 juin 2011
-
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

Messages postés
5358
Date d'inscription
dimanche 3 février 2008
Statut
Membre
Dernière intervention
13 février 2017
881
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
2083
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
15 octobre 2020
233
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
}
Messages postés
70
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
24 juin 2011
1
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
Messages postés
70
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
24 juin 2011
1
Quelqu'un aurait une idée? Un suite de solution? Vu que le début a été donné :-)
Messages postés
70
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
24 juin 2011
1
Merci à tous !

Ça marche à merveille !