Requete à choix multiples non obligatoires

axelandre Messages postés 37 Statut Membre -  
NookZ Messages postés 2376 Statut Membre -
Bonjour à tous,

Je viens de créer un formulaire permettant d'afficher des résultats en fonction des champs renseignés.

Tous les champs sont des select.

Le fait est que je ne sais pas comment m'y prendre pour attaquer ma base de données car en fonction de ce qu'à sélectionné l'utilisateur, il y a des champs qui sont soit non renseigné soit renseigné et que donc ma requete doit changer en conséquence.

En gros, voici les champs du formulaire :

date du (3 champs pour jour mois année) au (3 champs jour mois année)
nom
docc
secteur
raison sociale
type

Ensuite en fonction de ce que sélectionne l'utilisateur la requete va chercher dans les critères sélectionnés.

Par défaut, tous les champs ont pour valeur "-".

Donc si quelqu'un pouvait m'orienter vers la solution ce serait plus que sympa !

Merci à tous

7 réponses

NookZ Messages postés 2376 Statut Membre 514
 
Vous faites un test sur le champ et si sa valeur = "-", vous faites la requête en conséquence, je ne vois pas trop le problème :s
0
axelandre Messages postés 37 Statut Membre
 
Bonjour,

Le problème c'est qu'il peut y avoir un certain nombre de possibilité de requete.

Exemple :

Si le nom, et la date sont sélectionnés, je ne vais attauqer la base que sur ces deux champs.

Si la date, le secteur, le type et la raison sociale sont sélectionnés, attaque sur ces 4 champs.

etc...

Donc du coup comment faire pour automatiser cela en fonction des champs sélectionnés ou non ?

Il faudrait faire une requete avec des variables pour chaque champ du genre :

SELECT date, nom, docc, raisonSociale, secteurActivite, type FROM table WHERE date="$date" AND docc="$docc" AND raisonSociale="$raisonSociale" AND secteurActivite="$secteurActivite" AND type="$type";

Mais le soucis, c'est que si un champ est vide, c'est à dire égale à "-", il ne faut pas qu'il soit pris en compte.

J'espère être suffisament claire.

Merci
0
NookZ Messages postés 2376 Statut Membre 514
 
en reprenant votre exemple, personnellement je ferais une construction de requête :

$requete= "SELECT date, nom, docc, raisonSociale, secteurActivite, type FROM table WHERE";
$premiereOK = False;
if($date!="-") {
$requete= $requete." date='$date'";
$premiereOK = True;
}
if ($docc != "-") {
if($premiereOK)
$requete= $requete."AND docc='$docc'";
else {
$requete= $requete." docc='$docc'";
$premiereOK = True;
}
}

etc
0
axelandre Messages postés 37 Statut Membre
 
Ok

Mais si une valeur est null, donc "-", la requete va planter du faite que le champs soit indiqué dans la requete mais que la valeur n'existe pas ! non ?

Et avec ce type de construction, les résultats trouvés seront ceux correspondant à l'ensemble des champs sélectionnés par l'utilisateur ou alors sont-ils indépendant les uns des autres ?

Merci
0
NookZ Messages postés 2376 Statut Membre 514
 
Dans le cas où l'un des champs sera non rempli (à "-"), il ne figurera pas dans la requête.
Exemple :
SI date n'est pas défini :
SELECT date, nom, docc, raisonSociale, secteurActivite, type FROM table WHERE docc="$docc" AND raisonSociale="$raisonSociale" AND secteurActivite="$secteurActivite" AND type="$type";

par contre je ne suis pas sûre d'avoir suivi votre besoin.
Est-ce que vous voulez affichés uniquement les résultats renseignés?
Si tel est le cas il faut ajouter ceci :
$requete= "SELECT date, nom, docc, raisonSociale, secteurActivite, type FROM table WHERE";
$premiereOK = False;
if($date!="-") {
$requete= $requete." date='$date'";
$premiereOK = True;
}
else
str_replace("date, ", "", $requete);

if ($docc != "-") {
if($premiereOK)
$requete= $requete."AND docc='$docc'";
else {
$requete= $requete." docc='$docc'";
$premiereOK = True;
}
}
else
str_replace("docc, ", "", $requete);
0
axelandre Messages postés 37 Statut Membre
 
Ok,

En fait au final, je veux que les résultats qui s'affichent soient ceux qui remplissent les conditions fixées par l'utilisateur.

Exemple :

Si date compris entre "01/06/08" et "12/08/08", docc = "paris", nom = "durand", type = "client" alors les résultats qui devront s'afficher devront correspondre à ces critères.

Les champs qui s'afficheront à l'écran sont : date, docc, nom, nom fichier, piece jointe et statut

Merci
0
NookZ Messages postés 2376 Statut Membre 514
 
alors c'est cette solution :

$requete= "SELECT date, nom, docc, raisonSociale, secteurActivite, type FROM table WHERE";
$premiereOK = False;
if($date!="-") {
$requete= $requete." date='$date'";
$premiereOK = True;
}
if ($docc != "-") {
if($premiereOK)
$requete= $requete."AND docc='$docc'";
else {
$requete= $requete." docc='$docc'";
$premiereOK = True;
}
}
0

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

Posez votre question
axelandre Messages postés 37 Statut Membre
 
Ok super mercie,

je vais essayer tout cela !

Je vous tiens au courant pour la suite

Merci mille fois pour votre aide.
0
axelandre Messages postés 37 Statut Membre
 
Bonjour,

Je viens de terminer la construction de ma requete à choix multiple en m'appuyant sur votre code.

Mais bien sur, un problème persiste !

Lorsque la date ne fait pas partie des critères de recherches, et bien la requête se construit mal.

Voici mon code : (par avance désolé pour le formatage mais sinon une partie du code ne se voyait pas !)

$nom2 = "date";
$champ1 = $date_deb;
$champ2 = $date_fin;
$nom3 = "nom";
$champ3 = $_POST['nom'];
$nom4 = "docc";
$champ4 = $_POST['docc'];
$nom5 = "raisonSociale";
$champ5 = $_POST['raisonSociale'];
$nom6 = "secteurActivite";
$champ6 = $_POST['secteur'];
$nom7 = "type";
$champ7 = $_POST['type'];

$requete = 0;

$premierOk = false; //permet de vérifier si la requete est commencée ou non


for($i=2; $i<8; $i++){
$nom = "nom".$i; //Variable qui va contenir la variable nom.$i
$champ = "champ".$i; //Variable qui va contenir la variable champ.$i
//Si c'est date alors on controle que les deux dates soient remplies
if($$nom == "date"){ //$$nom affiche le contenu de la variable $nom.$i contenu dans la variable $nom
if(strlen($champ1) == 10 && strlen($champ2) != 10 || strlen($champ2) 
== 10 && strlen($champ1) != 10){
echo 'Vous devez renseigner les deux dates';
break;
}
else if((strlen($champ1) == 10) && (strlen($champ2) == 10)){
$requete = "SELECT date, docc, nom, fichierUpload, statut, pdf 
FROM success_story_".$marche." WHERE ".$$nom." >= ".$champ1." 
AND ".$$nom." <= ".$champ2."";
$premierOk = true;//donne vri à premier ainsi on sait que la requete est déjà commencé
}
else{
//sinon rien
}
}
else{
if($$champ != "-"){//si le champ est renseigné
if($premierOk == true){//si la requete est commencée alors on concatenne
$requete = $requete." AND ".$$nom." = ".$$champ."";	
echo '<br /><br />'.$champ.' = '.$nom.' = '.$$champ;
}
else{//sinon on commence à érire le début de la requete
$requete = mysql_query("SELECT date, docc, nom, fichierUpload, statut, pdf 
FROM success_story_".$marche." WHERE ".$$nom." = ".$$champ."");
$premierOk = true;
}	
}
else{
//si champ non renseigné alors ne rien faire et continuer la boucle
}
}
if($i == 7){	//Si i=7 alors on arrive à la fin de la requete et il faut donc la fermer
$requete = $requete.";";
}
}


J'espère que vous pourrez le visualiser dans sa totalité.

merci pour votre aide
0
axelandre Messages postés 37 Statut Membre
 
Bonjour bonjour,

La requete fonctionne niquel mais sous php, elle ne l'accepte pas !

En effet, j'ai une erreur mysql : "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource ".

Le truc c'est que lorsque je fais un echo de la variable contenant la requete générée, et bien elle est correcte et fonctionne très bien sous phpMyAdmin !

Voyez-vous d'où cela peut-il venir ?

Merci encore pour votre aide
0
NookZ Messages postés 2376 Statut Membre 514
 
oui le problème a été soulevé de nombreuses fois. Montrez-moi le code contenant le mysql_fetch_array et je vous corrige ça :)
0