Comment faire une recherche multicriteres?

Comment faire une recherche multicriteres? - PHP - Programmation

Marsh Posté le 21-03-2009 à 23:06:17    

Bonjour,
Je pensais trouver sur Google, mais rien à cette heure ci.
Je veux inclure plusieurs critères,plusieurs mots dans la barre de recherche unique et afficher le résultat trouvé.
Ex:plage cannes Résultat:doit afficher les résultats des champs contenant "plage" et "cannes" de la même table.
Je pensais utiliser "simplement" AND ou OR mais ça n'a pas l'air d'être la bonne formule...
Si quelqu'un peut me guider...
Je suis sur WAMP
Merci
[code]
$table = "resto"; // Table à sélectionner dans la base
$champ = "city"; // Champ de la table à afficher pour tester ce script
$champ2 = "title";
$champ3 = "id";
$sql = "SELECT city, title,id FROM $table WHERE $champ,$champ2 LIKE '%".addslashes($recherche)."%' OR $champ2 LIKE '%".addslashes($recherche)."%' ORDER BY title";
/code
 
...en esperant que ce bout de code soit suffisant
La recherche est en POST
Merci

Reply

Marsh Posté le 21-03-2009 à 23:06:17   

Reply

Marsh Posté le 22-03-2009 à 00:00:57    

Ton sql est incorrect. Commence par écrire un exemple de requête qui marche.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-03-2009 à 19:46:48    

déolé mais la requete fonctionne,sur un mot...
Mais je veux bien savoir où j'ai commis la faute

Reply

Marsh Posté le 22-03-2009 à 21:18:43    

chanteur06 a écrit :

déolé mais la requete fonctionne,sur un mot...

 

à ma connaissance cette syntaxe n'existe pas :

 
Code :
  1. WHERE champ,champ2 LIKE '%toto%'


Message édité par skeye le 22-03-2009 à 21:18:50

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 23-03-2009 à 11:27:58    

je confirme. Au mieux, la "condition" sur champ est ignorée ou renvoie toujours TRUE, au pire, ça lève une erreur de syntaxe. Sur MySQL 5, en tout cas, ça lève une erreur de syntaxe.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-03-2009 à 15:04:13    

Code :
  1. WHERE CONCAT_WS( '~', COALESCE( `champ` , '' ),  COALESCE(`champ2` , '' )) LIKE '%toto%'


Message édité par stealth35 le 23-03-2009 à 15:04:22
Reply

Marsh Posté le 23-03-2009 à 16:00:31    

chanteur06 a écrit :

Bonjour,
Je pensais trouver sur Google, mais rien à cette heure ci.
Je veux inclure plusieurs critères,plusieurs mots dans la barre de recherche unique et afficher le résultat trouvé.
Ex:plage cannes Résultat:doit afficher les résultats des champs contenant "plage" et "cannes" de la même table.
Je pensais utiliser "simplement" AND ou OR mais ça n'a pas l'air d'être la bonne formule...
Si quelqu'un peut me guider...
Je suis sur WAMP
Merci
[code]
$table = "resto"; // Table à sélectionner dans la base
$champ = "city"; // Champ de la table à afficher pour tester ce script
$champ2 = "title";
$champ3 = "id";
$sql = "SELECT city, title,id FROM $table WHERE $champ,$champ2 LIKE '%".addslashes($recherche)."%' OR $champ2 LIKE '%".addslashes($recherche)."%' ORDER BY title";
/code
 
...en esperant que ce bout de code soit suffisant
La recherche est en POST
Merci


Ca m'étonnerait que tu ne trouves rien sur le net, mais bon...
Affiche ta requête avant de la passer, histoire de voir ce qu'elle donne.
Tu pourras voir comment elle est construite, et ce qui peux clocher.
Et tu pourras passer la requête sous phpMyAdmin (ou équivament) pour la peaufiner.

Reply

Marsh Posté le 23-03-2009 à 16:25:54    

Code :
  1. $recherche = strip_tags($_POST["recherche"]);
  2. $ArrayWords = explode(" ", $recherche);
  3. $ArrayFields = array("city", "title", "id" );
  4. $Where = "";
  5. foreach($ArrayWords as w$ => $Word)
  6. {
  7.     $Where .= "(";
  8.     foreach($ArrayFields as $f => $Field)
  9.     {
  10.         if ($f > 0)
  11.         {
  12.             $Where .= " OR ";
  13.         }
  14.         $Where .= "$Field LIKE \"%$Word%\"";
  15.     }
  16.     $Where .= " )";
  17. }
  18. $Sql = "SELECT city, title, id FROM resto WHERE $Where ORDER BY title";


 
Ca devrait faire l'affaire...

Message cité 1 fois
Message édité par rufo le 23-03-2009 à 16:27:34

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-03-2009 à 16:42:57    

rufo a écrit :

Code :
  1. $recherche = strip_tags($_POST["recherche"]);
  2. $ArrayWords = explode(" ", $recherche);
  3. $ArrayFields = array("city", "title", "id" );
  4. $Where = "";
  5. foreach($ArrayWords as w$ => $Word)
  6. {
  7.     $Where .= "(";
  8.     foreach($ArrayFields as $f => $Field)
  9.     {
  10.         if ($f > 0)
  11.         {
  12.             $Where .= " OR ";
  13.         }
  14.         $Where .= "$Field LIKE \"%$Word%\"";
  15.     }
  16.     $Where .= " )";
  17. }
  18. $Sql = "SELECT city, title, id FROM resto WHERE $Where ORDER BY title";


 
Ca devrait faire l'affaire...


 
pas tres optimisé de plus ton code est faux

Reply

Marsh Posté le 23-03-2009 à 16:48:48    

Le but était pas d'optimiser le code, mais de lui montrer une solution pour construire sa requête. Voici la version corrigée (j'avais mis le AND puis retiré, je savais bien que je l'avais pas mis par hasard :D )

Code :
  1. $recherche = strip_tags($_POST["recherche"]);
  2. $ArrayWords = explode(" ", $recherche);
  3. $ArrayFields = array("city", "title", "id" );
  4. $Where = "";
  5. foreach($ArrayWords as w$ => $Word)
  6. {
  7.     if ($w > 0)
  8.     {
  9.         $Where .= " AND ";
  10.     }
  11.     $Where .= "(";
  12.     foreach($ArrayFields as $f => $Field)
  13.     {
  14.         if ($f > 0)
  15.         {
  16.             $Where .= " OR ";
  17.         }
  18.         $Where .= "$Field LIKE \"%$Word%\"";
  19.     }
  20.     $Where .= " )";
  21. }
  22. $Sql = "SELECT city, title, id FROM resto WHERE $Where ORDER BY title";


Message édité par rufo le 23-03-2009 à 16:49:06

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-03-2009 à 16:48:48   

Reply

Marsh Posté le 23-03-2009 à 16:57:39    

ligne 5 t'as inversé le $ avec le w,
 
sinon attention a la syntaxe, c'est pas tres propre, de mettre des majuscule pour les variable, c'est plus réserver au Class
 

Code :
  1. <?php
  2. $recherche = mysql_escape_string($_POST["recherche"]);
  3. $arrayWords = explode(" ", $recherche);
  4. $where = array();
  5. foreach($arrayWords as $word)
  6. {
  7.     array_push($where, "CONCAT_WS( '~', COALESCE( `champ` , '' ),  COALESCE(`champ2` , '' )) LIKE '%$word%'" );
  8. }
  9. $where = implode(" AND ", $where);
  10. $sql = "SELECT `city`, `title`, `id` FROM `resto` WHERE $where ORDER BY `title`";
  11. echo $sql;
  12. ?>


Message édité par stealth35 le 23-03-2009 à 17:04:28
Reply

Marsh Posté le 23-03-2009 à 17:46:56    

Voilà le résultat de vos propositions....
 

Code :
  1. SELECT `city`, `title`, `id` FROM `resto` WHERE CONCAT_WS( '~', COALESCE( `champ` , '' ), COALESCE(`champ2` , '' )) LIKE '%antibes%' ORDER BY `title`
  2. Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Program Files\wamp\www\rech4\pagination.php on line 75
  3. Résultats: il y a restaurants sur 0 pages.
  4. Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Program Files\wamp\www\rech4\pagination.php on line 94
  5. Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in C:\Program Files\wamp\www\rech4\pagination.php on line 103

Reply

Marsh Posté le 23-03-2009 à 17:48:41    

t'a quoi aussi ligne 75 ? aisin que les autres lignes

Reply

Marsh Posté le 23-03-2009 à 17:53:39    

d'ailleur t'as juste copié sans regardé ou t'as vraiement   des champs 'champ' et 'champ2'


Message édité par stealth35 le 23-03-2009 à 17:55:03
Reply

Marsh Posté le 23-03-2009 à 17:58:42    

J'ai dû mal à comprendre ce que ça fait dans le where l'instruction "WHERE CONCAT_WS('~', COALESCE('champ', ''), COALESCE('champ2', '')) LIKE "%plage%" :??:  
Ca concatène le contenu des 2 champs (où une chaîne vide si le champ vaut NULL) séparés par le ~ et on applique le LIKE dessus, c'est ça?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-03-2009 à 18:08:00    

oauai j'ai vraiment des champs nommés "champ" et "champ2"...
sur les lignes en question c le resultat:
........
while ($ligne = mysql_fetch_array($result)) {
  echo "<div class='font'><a href=\"affichage.php?id=".$ligne[$champ3]."\">".$ligne[$champ]."\n\n".$ligne[$champ2]."\n\n".$ligne[$champ4]."/10</a></div><br />\n";
}
 
.......

Reply

Marsh Posté le 23-03-2009 à 18:09:27    

@rufo -> voila, ca evite de faire des OR, et de reecrire a chaque fois la requete du like


Message édité par stealth35 le 23-03-2009 à 18:10:15
Reply

Marsh Posté le 23-03-2009 à 18:11:17    

chanteur06 a écrit :

oauai j'ai vraiment des champs nommés "champ" et "champ2"...
sur les lignes en question c le resultat:
........
while ($ligne = mysql_fetch_array($result)) {
  echo "<div class='font'><a href=\"affichage.php?id=".$ligne[$champ3]."\">".$ligne[$champ]."\n\n".$ligne[$champ2]."\n\n".$ligne[$champ4]."/10</a></div><br />\n";
}

 

.......

 

donne plus de details, y'a pas grand chose la


Message édité par stealth35 le 23-03-2009 à 18:13:25
Reply

Marsh Posté le 23-03-2009 à 18:12:19    

Pourquoi c'est si compliqué de faire accepter plusieurs mots dans la recherche...? je pensais vraiment qu'avec OR ce serait suffisant...

Reply

Marsh Posté le 23-03-2009 à 18:16:27    

c'est pas si compliqué, suffis de faire la bonne requete, mais j'avoue que ca pourrait etre plus simple

Reply

Marsh Posté le 23-03-2009 à 18:24:17    

LOL
je te donne les parties du code qui nous interressent
 
if(isset($_POST['recherche']))
$_SESSION['recherche'] = $_POST['recherche'];
$recherche = $_SESSION['recherche'];
.....................
 
$table = "resto"; // Table à sélectionner dans la base
$champ = "city"; // Champ de la table à afficher pour tester ce script
$champ2 = "title";
$champ3 = "id";
$sql = "SELECT city, title,id FROM $table WHERE $champ LIKE '%".addslashes($recherche)."%' OR $champ2 LIKE '%".addslashes($recherche)."%' ORDER BY title";
 
(.....................)
 
// On affiche le résultat de la requête
// On crée donc ici son propre tableau pour lequel on souhaite une pagination
while ($ligne = mysql_fetch_array($result)) {
  echo "<div class='font'><a href=\"affichage.php?id=".$ligne[$champ3]."\">".$ligne[$champ]."\n\n".$ligne[$champ2]."\n\n".$ligne[$champ4]."/10</a></div><br />\n";
}
 
 
voilà


Message édité par chanteur06 le 23-03-2009 à 18:25:27
Reply

Marsh Posté le 23-03-2009 à 18:34:47    

met entre les 2 parce que la on sait mem pas quelle type de requete tu fais  
entre $sql, et $result on vois pas ce que tu fais

Reply

Marsh Posté le 23-03-2009 à 18:54:45    

voilà entr $sql et $result,c'est la pagination
 
$parpage = 20; // Nombre d'enregistrements par page à afficher
 
//==============================================================================
// Déclaration et initialisation des variables (ici ne rien modifier)
//==============================================================================
 
// On définit le suffixe du lien url qui affichera les pages
// $_SERVEUR['PHP_SELF'] donne l'arborescence de la page courante
$url = $_SERVER['PHP_SELF']."?limit=";
 
$total = mysql_query($sql); // Résultat total de la requête $sql
$nblignes = mysql_num_rows($total); // Nbre total d'enregistrements
 
// On calcule le nombre de pages à afficher en arrondissant
// le résultat au nombre supérieur grâce à la fonction ceil()
$nbpages = ceil($nblignes/$parpage);
//==============================================================================
// Exemple d'affichage HTML
//==============================================================================
// On teste en affichant la valeur des variables (facultatif)
echo "<p align=right>Résultats: il y a ".$nblignes." restaurants ";
echo "sur <b>".$nbpages." pages</b>.</p></right>\n";
 
// Si une valeur 'limit' est passée par url, on vérifie la validité de
// cette valeur par mesure de sécurité avec la fonction validlimit()
// cette fonction retourne automatiquement le résultat de la requête
$result = validlimit($nblignes,$parpage,$sql);
 

Reply

Marsh Posté le 23-03-2009 à 19:03:22    

apres faut voir ce que renvoie ta fonction validlimit...
 
change la ligne  
 
$result = validlimit($nblignes,$parpage,$sql);  
 
par  
 
$result = mysql_query($query) or die (mysql_error());
 
apres t'a pas obligé d'afficher tout ta requete pour avoir le nombre  total de resultat meme avec une LIMIT , tu pourra faire ca en ajoutant SQL_CALC_FOUND_ROWS dans ta requete

Reply

Marsh Posté le 23-03-2009 à 19:22:48    

voilà ce que renvoie le chgt
 
Notice: Undefined variable: query in C:\Program Files\wamp\www\rech4\pagination.php on line 80
Query was empty
 
La ligne 80 est vide et correspond à cette requette

Reply

Marsh Posté le 23-03-2009 à 19:26:38    

bah faut mettre $sql a la place de $query,

Reply

Marsh Posté le 23-03-2009 à 19:37:33    

je perds la pagination correcte , mais surtout les liens de paginations ne sont plus renseignés,ils deviennent vides!
 
donc je garde ma requete,mais sans multirecherches....je crois que je vais faire une requete à choix multiples...mais c'est vraiment dommage...

Reply

Marsh Posté le 23-03-2009 à 20:09:31    

donc c'est que l'erreur vient de ta fonction validlimit

Reply

Marsh Posté le 24-03-2009 à 10:21:33    

et là je nage car je vois pas quelle fonction mettre...suis dejà pas tres doué....

Reply

Marsh Posté le 24-03-2009 à 10:38:18    

mais le code il est de toi ? ou alors c'est un truc que t'as recopié ?

Reply

Marsh Posté le 24-03-2009 à 11:06:59    

c'est une recup.... :ange:

Reply

Marsh Posté le 24-03-2009 à 11:13:39    

mais c'est un vrai probleme car je peut pas entrer de nom composés comme st damien ou autre st klk chose...
si tu te sens pret à refondre le code pour un qui fonctionne; je te paies...

Reply

Marsh Posté le 24-03-2009 à 11:56:43    

bah st damien ca devrai marcher puisque ca fait %st% + %damien%

Reply

Marsh Posté le 24-03-2009 à 12:50:11    

sauf que si dans un champ on trouve la chaîne "c'est bien lui damien", ça va sortir comme résultat, alors que c'est pas bon :D


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-03-2009 à 13:08:07    

exact, mais le but d'une recherche multi-critères, c'est d'etre le plus générale possible, sinon dans se cas la on mete un champs select avec ne nom de toutes les villes

Reply

Marsh Posté le 24-03-2009 à 13:28:50    

ou alors, on fait un moteur de recherche sémantique, mais là, c'est un autre niveau ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-03-2009 à 15:12:00    

 "bah st damien ca devrai marcher puisque ca fait %st% + %damien%"
 
et pourtant ça marche pas...je suis ouvert à vos propositions

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed