Requête MySQL avec conditions en fonction du formulaire envoyé

GrifOli Messages postés 2111 Date d'inscription   Statut Membre Dernière intervention   -  
cyril1982 Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai conçu un formulaire assez simple qui permet à un utilisateur de faire une recherche dans une base de données MySQL. Il y a 2 champs avec une liste déroulante que l'utilisateur peut choisir, disons les champs A et B. Ce que je souhaite, c'est que si l'utilisateur choisi seulement le champ A, la requête cherche tous les résultats parmi le champ sélectionné. Même chose pour le champ B. Et si les deux champs sont laissés vides, la requête renvoie tous les résultats.

Pour l'instant, la seule façon que j'ai trouvée de faire, c'est de créer des conditions PHP pour chacune des possibilités (A et B choisis, A choisi, B choisi, aucun choisi) avec la requête MySQL appropriée pour chacune des possibilités... Voir le code ci-dessous:

if (($_POST['a']=='Tous') && ($_POST['b']=='Tous')) {
 $req = $bdd_stats->prepare('SELECT * FROM stats');
 $req->execute(array()) or die(print_r($bdd_stats->errorInfo()));
...
}
elseif (($_POST['a']=='Tous')) {
 $req = $bdd_stats->prepare('SELECT * FROM stats WHERE b = :b');
 $req->execute(array('b' => $_POST['b'])) or die(print_r($bdd_stats->errorInfo()));
...
}
elseif (($_POST['b']=='Tous')) {
 $req = $bdd_stats->prepare('SELECT * FROM stats WHERE a = :a');
 $req->execute(array('a' => $_POST['a'])) or die(print_r($bdd_stats->errorInfo()));
...
}
else {
 $req = $bdd_stats->prepare('SELECT * FROM stats WHERE a = :a AND b = :b');
 $req->execute(array('a' => $_POST['a'], 'b' => $_POST['b'])) or die(print_r($bdd_stats->errorInfo()));
...
}


Cela fonctionne, mais j'imagine qu'il doit y avoir une façon de créer une seule requête dans mon code et que les conditions soient en fonction de ce qui est choisi par l'utilisateur? Mais je n'y parviens pas. Si je veux avoir 4 champs différents éventuellement, cela fait 16 possibilités...

Merci pour votre aide!
A voir également:

1 réponse

cyril1982 Messages postés 110 Date d'inscription   Statut Membre Dernière intervention   12
 
Bonjour,

Tu pourrais reformater ton code de cette façon :

$where = '';
if ($_POST['a']!='Tous') 
{
	if ($where == '') $where .= ' where a = :a ';
	else $where .= ' and a = :a ';
}
if ($_POST['b']!='Tous') 
{
	if ($where == '') $where .= ' where b = :b ';
	else $where .= ' and b = :b ';
}
$req = $bdd_stats->prepare('SELECT * FROM stats'.$where);
$req->execute(array('a' => $_POST['a'], 'b' => $_POST['b'])) or die(print_r($bdd_stats->errorInfo()));


Ou encore :

$where = '';
$params = array('a', 'b');
$paramValues = array();
foreach ($params as $param)
{
	if ($_POST[$param]!='Tous') 
	{
		if ($where == '') $where .= ' where '.$param.' = :'.$param.' ';
		else $where .= ' and '.$param.' = :'.$param.' ';
		$paramValues[$param] = $_POST[$param];
	}
}
$req = $bdd_stats->prepare('SELECT * FROM stats'.$where);
$req->execute($paramValues) or die(print_r($bdd_stats->errorInfo()));
0