Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1405 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Comment faire une recherche multicriteres?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment faire une recherche multicriteres?

n°1864424
chanteur06
Posté le 21-03-2009 à 23:06:17  profilanswer
 

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

mood
Publicité
Posté le 21-03-2009 à 23:06:17  profilanswer
 

n°1864427
skeye
Posté le 22-03-2009 à 00:00:57  profilanswer
 

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


---------------
Can't buy what I want because it's free -
n°1864553
chanteur06
Posté le 22-03-2009 à 19:46:48  profilanswer
 

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

n°1864583
skeye
Posté le 22-03-2009 à 21:18:43  profilanswer
 

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 -
n°1864686
rufo
Pas me confondre avec Lycos!
Posté le 23-03-2009 à 11:27:58  profilanswer
 

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
n°1864798
stealth35
Posté le 23-03-2009 à 15:04:13  profilanswer
 

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


Message édité par stealth35 le 23-03-2009 à 15:04:22
n°1864818
macgawel
Posté le 23-03-2009 à 16:00:31  profilanswer
 

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.

n°1864850
rufo
Pas me confondre avec Lycos!
Posté le 23-03-2009 à 16:25:54  profilanswer
 

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
n°1864860
stealth35
Posté le 23-03-2009 à 16:42:57  profilanswer
 

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

n°1864868
rufo
Pas me confondre avec Lycos!
Posté le 23-03-2009 à 16:48:48  profilanswer
 

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
mood
Publicité
Posté le 23-03-2009 à 16:48:48  profilanswer
 

n°1864882
stealth35
Posté le 23-03-2009 à 16:57:39  profilanswer
 

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
n°1864912
chanteur06
Posté le 23-03-2009 à 17:46:56  profilanswer
 

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

n°1864913
stealth35
Posté le 23-03-2009 à 17:48:41  profilanswer
 

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

n°1864916
stealth35
Posté le 23-03-2009 à 17:53:39  profilanswer
 

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
n°1864919
rufo
Pas me confondre avec Lycos!
Posté le 23-03-2009 à 17:58:42  profilanswer
 

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
n°1864922
chanteur06
Posté le 23-03-2009 à 18:08:00  profilanswer
 

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";
}
 
.......

n°1864923
stealth35
Posté le 23-03-2009 à 18:09:27  profilanswer
 

@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
n°1864925
stealth35
Posté le 23-03-2009 à 18:11:17  profilanswer
 

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
n°1864926
chanteur06
Posté le 23-03-2009 à 18:12:19  profilanswer
 

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

n°1864927
stealth35
Posté le 23-03-2009 à 18:16:27  profilanswer
 

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

n°1864934
chanteur06
Posté le 23-03-2009 à 18:24:17  profilanswer
 

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
n°1864939
stealth35
Posté le 23-03-2009 à 18:34:47  profilanswer
 

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

n°1864944
chanteur06
Posté le 23-03-2009 à 18:54:45  profilanswer
 

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);
 

n°1864951
stealth35
Posté le 23-03-2009 à 19:03:22  profilanswer
 

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

n°1864952
chanteur06
Posté le 23-03-2009 à 19:22:48  profilanswer
 

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

n°1864953
stealth35
Posté le 23-03-2009 à 19:26:38  profilanswer
 

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

n°1864959
chanteur06
Posté le 23-03-2009 à 19:37:33  profilanswer
 

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...

n°1864978
stealth35
Posté le 23-03-2009 à 20:09:31  profilanswer
 

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

n°1865126
chanteur06
Posté le 24-03-2009 à 10:21:33  profilanswer
 

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

n°1865161
stealth35
Posté le 24-03-2009 à 10:38:18  profilanswer
 

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

n°1865195
chanteur06
Posté le 24-03-2009 à 11:06:59  profilanswer
 

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

n°1865201
chanteur06
Posté le 24-03-2009 à 11:13:39  profilanswer
 

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...

n°1865217
stealth35
Posté le 24-03-2009 à 11:56:43  profilanswer
 

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

n°1865233
rufo
Pas me confondre avec Lycos!
Posté le 24-03-2009 à 12:50:11  profilanswer
 

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
n°1865244
stealth35
Posté le 24-03-2009 à 13:08:07  profilanswer
 

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

n°1865259
rufo
Pas me confondre avec Lycos!
Posté le 24-03-2009 à 13:28:50  profilanswer
 

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
n°1865336
chanteur06
Posté le 24-03-2009 à 15:12:00  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Comment faire une recherche multicriteres?

 

Sujets relatifs
Recherche dev Cyber Plus Banque populairevbs script recherche User sous-domaine
recherche commandes PCLfaire une recherche de donnees et les afficher /access /vb6
Recherche rapide sans rechargement de page avec mysqlRecherche : CODEUR / INGENIEUR super projet
recherche d'un CMSrecherche multicritères multitables
script php de recherche (multicriteres) , et d'update de tables mysqlrecherche multicriteres
Plus de sujets relatifs à : Comment faire une recherche multicriteres?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR