Formulaire à choix mustiples et query

hares7293
Invité n'ayant pas de compte PHPfrance

04 sept. 2012, 00:22

Bonsoir,

j'ai un formulaire du genre :
<form>
<select size="2" name="sexe[]" multiple="multiple">
<option value="Homme">Homme</option>
<option value="Femme">Femme</option>
</select>
<select size="3" name="civil[]" multiple="multiple">
<option value="célibataire">Célibataire</option>
<option value="marié">Marié/mariée</option>
<option value="veuf">Veuf/veuve</option>
</select>
</form>
Habituellement je récupère les valeurs par $_POST['sexe'] et $_POST['civil']) mais ici il ya plusieurs valeurs possibles (l'utilisateur peut choisir 0,1 ou plusieurs réponses)

Je souhaite construire une requête mysql du genre

SELECT * FROM matable WHERE (sexe = valeur 1 ou valeur 2) AND (civil = valeur 1 ou valeur 2 ou valeur 3) ...

mais je ne suis pas sûr comment bien prendre en compte toutes les valeurs choisies. J'ai mis des [] pour récupérer des arrays....

Merci par avance pour votre aide

ViPHP
ViPHP | 2577 Messages

04 sept. 2012, 08:06

var_dump($_POST); en début de script te permettra de savoir ce que tu récupères et sous quelle forme.
Ensuite tu pourras faire un traitement adapté.

Pour le select SQL, tu peux faire : sexe in (1, 2) and civil in (1,2,3)

hares7293
Invité n'ayant pas de compte PHPfrance

04 sept. 2012, 16:13

Merci pour la réponse

Je souhaite donc récupérer ('Homme','Femme') par exemple

J'ai fait
$sexe = "'".implode(',',$_POST[sexe])."'" ;
mais il y a une erreur Warning: implode() [function.implode]: Invalid arguments passed

hares7293
Invité n'ayant pas de compte PHPfrance

04 sept. 2012, 16:26

Bon je me suis corrigé
$sexe = "'".implode(',',$_POST['sexe'])."'" ;
mais cela donne 'Homme,Femme' et non 'Homme','Femme'

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 sept. 2012, 20:07

normal tu n'a pas mis de ' dans la chaine glue :)

$sexe = "'".implode('\',\'',$_POST['sexe'])."'" ;

@+
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

04 sept. 2012, 22:25

Oui ou sinon sur un tableau si l'on veut mieux voir les fonctions que l'on applique on peut utiliser array_map pour construire les éléments de la requête par exemple :
function Addquote ($value) {
return  "'".$value."'";
}

$array_post = isset($_POST['array']) && is_array($_POST['array'])? $_POST['array'] : array();

$format_sql = array_map('trim',$array_post);
$format_sql = array_map('mysql_real_escape_string',$format_sql);
$format_sql = array_map('Addquote',$format_sql);

$format_sql = '('.implode(',',$format_sql).')';

$sql = "... WHERE champ IN ".$format_sql." AND ...";
C'est un poil plus long que si l'on avait tout mis dans un foreach mais je trouve ça plus lisible.