Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/06/2007, 15h14   #1
Membre actif
 
Inscription : septembre 2004
Messages : 555
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 555
Points : 155
Points : 155
Par défaut [SQL] Recherche mutli critère

Bonjour.

J'aimerai avoir un petit eclaircissement.
Je possède un formulaire possédant 9 champs possibles.

AU minimum un champs doit être rempli et après le reste est optionnel.
Quel est le meilleur moyen de s'y prendre?

J'avais penser à faire comme ceci

Citation:
$query="SELECT * FROM prospects";


$query.=" WHERE nom LIKE '$choixrechercher_nom' AND adresse1 LIKE '$choixrechercher_adresse' AND cp LIKE '$choixrechercher_cp' AND type_base LIKE '$choixrechercher_typebase' AND datecreation_base LIKE '$choixrechercher_datebase' AND profession LIKE '$choixrechercher_profession' AND societe LIKE '$choixrechercher_societe' AND CSP LIKE '$choixrechercher_CSP' ORDER BY nom";
Et les champs n'étant pas rempli vallait donc %.
Seul hic c'est lorsque il y a des champs non remplis dans la BDD et qu'ils valent donc NULL ben l'histoire du % ne marche plus.

Au final quel est la meilleure solution pour faire une recherche mutli critère sachant que 8 champs sur 9 sont optionnels.

Cordialement
masseur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h28   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Il y a pas mal d'exemples de ce genre de problemes dans le forum.
Le mieux déjà est de constuire ta requete au fur et a mesure pour chaque critère indépendemment les uns des autres, exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
$req = "SELECT * FROM matable ";
$cond = " WHERE " ;
 
if(isset($_POST['critere1']))
{
$req .= $cond . " critere1 = '" . $_POST['critere1'] . "' ";
$cond = " AND ";
} 
 
if(isset($_POST['critere2']))
{
$req .= $cond . " critere2 = '" . $_POST['critere2'] . "' ";
$cond = " AND ";
}
etc.
tu notes que $cond permet de savoir quelle condition utiliser (par défaut WHERE et ensuite AND)

sinon il me semble que Asmodean (mais je confonds peut etre) utilise un WHERE 1 = 1 comme première condition, du coup tu sais que tu as toujours des AND et tu n'as pas de probleme de conditions.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h32   #3
Membre Expert
 
Avatar de guigui5931
 
guillaume defrain
Inscription : avril 2006
Messages : 1 667
Détails du profil
Informations personnelles :
Nom : guillaume defrain
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2006
Messages : 1 667
Points : 2 099
Points : 2 099
ce que je fais dans ce cas la c'est que si le champs n'est pas rempli je ne le met pas dans la requete SQL. Je te fais un exemple avec 2 champs optionnel et un obligatoire
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
$obligatoire = $_POST['obligatoire'];
$optionnel1= $_POST['optionnel1'];
$optionnel2= $_POST['optionnel2'];
if (!empty($obligatoire  ))
{
$param1 = "obligatoire = '" .$obligatoire. "'";
}
else
{
$param1 = "1";
}
if (!empty($optionnel1))
{
$param2 = "optionnel1= '" .$optionnel1. "'";
}
else
{
$param2 = "1";
}
if (!empty($optionnel2))
{
$param3 = "optionnel2= '" .$optionnel2. "'";
}
else
{
$param3 = "1";
}
$sql="SELECT $ FROM table WHERE $param1 AND $param2 AND $param3"
Si tu as besoin de plus d'explication demande
__________________
autant l'hiver éclate que l'hétéroclite
le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre
guigui5931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h34   #4
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
Ouais et si ton deuxieme critiere y a rien il me semble que la requete finissant par AND plante non?
Donc pas tres malin

Pour reprendre l'exemple precedent :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
if(isset($_POST['obligatoire'])){
$param1 = "obligatoire = ".$obligatoire. "'";
}
else{
 $param1 = 1;
}
if(isset($_POST['option1'])){
 $param2 = ' AND param2='.$_POST['option1'];
}
 
$sql="SELECT * FROM table WHERE $param1 $param2 "
Je trouve plus leger et tu peux mieux gérer les OR ou cas bizzard
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h36   #5
Membre actif
 
Inscription : septembre 2004
Messages : 555
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 555
Points : 155
Points : 155
Merci à vous deux, voila qui m'éclaire bien sur la facon de m'y prendre?
EN cas de besoin je reviendrai.

Merci
masseur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h37   #6
Membre Expert
 
Avatar de guigui5931
 
guillaume defrain
Inscription : avril 2006
Messages : 1 667
Détails du profil
Informations personnelles :
Nom : guillaume defrain
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2006
Messages : 1 667
Points : 2 099
Points : 2 099
Avec le code de koopajah ça ne marchera pas si un champs est vide. Si tu met des 1 quand le champs est vide ça marche à tous les couts puisuqe 1 est interprété comme le boolean vrai (et n'a donc pas d'effet sur les AND)

EDIT : ça ne marchera pas si le dernier champs et vide pardon
__________________
autant l'hiver éclate que l'hétéroclite
le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre
guigui5931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h39   #7
Membre Expert
 
Avatar de guigui5931
 
guillaume defrain
Inscription : avril 2006
Messages : 1 667
Détails du profil
Informations personnelles :
Nom : guillaume defrain
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2006
Messages : 1 667
Points : 2 099
Points : 2 099
Je viens de faire un EDIT mais il me semble que si le dernier de tes paramètres est vide tu vas te retrouver avec un AND puis rien après.
Mais je me trompe peut être
__________________
autant l'hiver éclate que l'hétéroclite
le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre
guigui5931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h40   #8
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
Citation:
Envoyé par koopajah
Dans ma solution le AND n'est ajouté a la requete que si on met bel et bien un critere après donc je pense que mon message bien que pas forcément malin etait largement viable, je l'utilise tous les jours

Dans la solution de guigui c'est parfaitement viable aussi vu qu'on se retrouve avec dans 1 entre chaque AND si le critère n'est pas rempli. Le seul défaut étant qu'il faut connaitre a l'avance le nombre de paramètres.

Par contre j'aimerais savoir quelle est ta solution si intelligente que tu ne daignes meme pas proposer?
Si tu m'avais laissé le temps de modifier mon com
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h41   #9
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par guigui5931
Je viens de faire un EDIT mais il me semble que si le dernier de tes paramètres est vide tu vas te retrouver avec un AND puis rien après.
Mais je me trompe peut être
Et bien relis mon code qui ne fait pourtant que quelques lignes et tu verras bien que ca n'est pas le cas.

Dans chaque if on a deux lignes, la première ajoute a notre requete courante la condition courante (where si c'est le premier critère non vide, and sinon) et ensuite le critère lui meme.
La seconde ligne sert a dire "la condition courante de vient AND vu qu'on a mis un WHERE avant"

donc ce code marche très bien.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h43   #10
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
Citation:
Envoyé par koopajah
Et bien relis mon code qui ne fait pourtant que quelques lignes et tu verras bien que ca n'est pas le cas.

Dans chaque if on a deux lignes, la première ajoute a notre requete courante la condition courante (where si c'est le premier critère non vide, and sinon) et ensuite le critère lui meme.
La seconde ligne sert a dire "la condition courante de vient AND vu qu'on a mis un WHERE avant"

donc ce code marche très bien.
Un code qui marche bien c'est cool, mais un code ou deux personnes se trompe au premier coup d'oeil c'est pas terrible...... Il est donc pas très claire.
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h44   #11
Membre Expert
 
Avatar de guigui5931
 
guillaume defrain
Inscription : avril 2006
Messages : 1 667
Détails du profil
Informations personnelles :
Nom : guillaume defrain
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2006
Messages : 1 667
Points : 2 099
Points : 2 099

J'ai été un poil vite, désolé
__________________
autant l'hiver éclate que l'hétéroclite
le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre
guigui5931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h45   #12
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par zulot
Un code qui marche bien c'est cool, mais un code ou deux personnes se trompe au premier coup d'oeil c'est pas terrible...... Il est donc pas très claire.
Une ou deux personnes qui se trompent parce qu'elles ont survolé le code donné pour montrer LE code auquel elles se sont habituées.
Ca ne prouve en rien que mon code est faux surtout que c'était expliqué dans le message donc franchement je vois pas l'intéret de rabaisser ma solution juste parce que vous l'avez à peine lue.

Maintenant il a l'embarras du choix, il suffit qu'il utilise la plus pratique pour lui c'est tout.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h47   #13
Membre actif
 
Inscription : septembre 2004
Messages : 555
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 555
Points : 155
Points : 155
J'ai utilisé la méthode de koopajah plus ou moins qui me convenait mieux et ca marche nickeL

Merci
masseur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 15h47   #14
Membre Expert
 
Avatar de guigui5931
 
guillaume defrain
Inscription : avril 2006
Messages : 1 667
Détails du profil
Informations personnelles :
Nom : guillaume defrain
Âge : 25
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : avril 2006
Messages : 1 667
Points : 2 099
Points : 2 099
Je ne suis pas d'accord avec toi zulot je pense que son code est le meilleur qui a été donné sur ce thread. Il est plus concit et clair (si on le lit plus de 10 seconde ).
Mais on va pas se battre
__________________
autant l'hiver éclate que l'hétéroclite
le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre
guigui5931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h29.


 
 
 
 
Partenaires

Hébergement Web