Partage
  • Partager sur Facebook
  • Partager sur Twitter

Checkbox à choix multiples gestion traitement SQL

peut on faire une itération ? ou doit on tout écrire ?

Sujet résolu
8 novembre 2017 à 16:22:36

Bonjour

Je propose à mes utilisateurs de cocher ou non des checkbox et la liste est longue car je mets à disposition un large choix d'option possible.

Je voudrais qu'à chaque profile corresponde les checkbox qu'il a coché. Pour ça j'imagine que je dois créé une nouvelle table sql que je vais appeler "choix" et où l'ID d'un utilisateur correspondra à un id.choix (je pense que jusque là tout va bien).

Ma question est la suivante. Dans la table que je créé, dois-je faire un champs par choix disponible ? De quel type il doit être (Booléen, Charset)?

lorsque mon formulaire est envoyé à mon fichier traitement_formulaire.php. Est ce que je dois créer autant de variable $_POST pour chaque checkbox présentent dans mon formulaire ? Ou bien puis-je faire une sorte de boucle qui parcours toutes les checkbox et vérifie si elles ont été cochées ?

Si oui comment faire ensuite pour intégrer les checkbox cochées à la table "choix" ?

JE sais pas si j'ai été clair... Je continue de plancher de mon coté, merci à tous

  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2017 à 16:48:00

Bonjour,

Tout dépend à quoi correspondent ces choix. Mais une solution naturelle serait d'avoir une table choix, avec un id et une "description" au moins.

Ensuite une autre table de "liaison" où figurera à chaque ligne l'id de l'utilisateur et l'id du choix.

Pour le formulaire, tu peux simplement avoir des checkboxes avec le même nom du style name="choix[]".

Tu obtiendras ainsi un array $_POST['choix'] avec uniquement les id des checkboes cochées.

Il te reste à le parcourir pour alimenter la table de liaison.

  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2017 à 12:20:44

Dans mon array $_POST j'ai les value de mes checkbox et pas l'id, j'en suis pas encore à la table de liaison mais voici ce que j'ai pour le moment :

///////////FORM

<input type="checkbox" name="ins[]" value="accordion"/><label for="accordion">Accordion</label><br/>
                <input type="checkbox" name="ins[]" value="bass"/><label for="bass">Bass</label><br/>
                <input type="checkbox" name="ins[]" value="drums"/><label for="drums">Drums</label><br/>

/////////action.php

if (isset($_POST['ins']))
{
	foreach ($_POST['ins'] AS $instrument)
	{
		echo '<li>' . $instrument . '</li>';
		$req = $bdd->query('SELECT * FROM instrument WHERE name_instru = "'.$instrument.'"');
		$donnees = $req->fetch();
		print_r($donnees);
	}
}

en resultat j'obtiens ceci si je coche accordion et drums

  • accordion
Array ( [id] => 1 [0] => 1 [name_instru] => accordion [1] => accordion )


  • drums

Array ( [id] => 3 [0] => 3 [name_instru] => drums [1] => drums )

Est ce que c'est bon jusque là ? À quoi correspond le 1[0] et 3[0] ?

-
Edité par TruffierAxel 9 novembre 2017 à 12:42:42

  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2017 à 12:39:32

Inutile de faire plusieurs requêtes :

if (isset($_POST['ins']))
{
   $instr = '"'.implode('","',$_POST['ins']).'"';
      
        $req = $bdd->query('SELECT name_instru FROM instrument WHERE name_instru IN('.$instr.')');
        $donnees = $req->fetch();
        print_r($donnees);
    
}



  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2017 à 12:48:12

Bon j'ai copié bêtment

$instr = '"'.implode('","',$_POST['ins']).'"';


sans comprendre ce qu'elle veut dire ni comment elle fonctionne...

À l'essai ça marche mais par contre je n'en tire que la première checkbox qui a été cochée et pas les suivantes. Normal non ? c'est pour ça que j'avais bouclé

-
Edité par TruffierAxel 9 novembre 2017 à 12:48:36

  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2017 à 14:06:50

Alors :

	$instrument = '"'.implode('","',$_POST['ins']).'"';//echo '<li>' . $instrument . '</li>';
		$req = $bdd->query('SELECT * FROM instrument WHERE name_instru IN ('.$instrument.')');
		$donnees = $req->fetch();
		print_r($_POST['ins']);
		print_r($donnees);
}

print_r($_POST['ins']) => Array ( [0] => accordion [1] => bass )

print_r($donnees) => Array ( [id] => 1 [0] => 1 [name_instru] => accordion [1] => accordion )

  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2017 à 18:44:35

Oui, désolé, il faut bien sûr parcourir l'array ou utiliser un fetchAll

    $instrument = '"'.implode('","',$_POST['ins']).'"';//echo '<li>' . $instrument . '</li>';
        $req = $bdd->query('SELECT * FROM instrument WHERE name_instru IN ('.$instrument.')');
        $donnees = $req->fetchAll();
        print_r($_POST['ins']);
        print_r($donnees);

Pour le fonctionnement, ce n'est pas très compliqué. L'implode sert à constituer une chaîne d'après ton array pour l'intégrer à ta requête.

WHERE  colonne IN("toto","tata","titi")

revient à écrire

WHERE colonne="toto" OR colonne="tata" OR colonne="titi"

  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2017 à 13:57:30

Super c'est bon j'y suis parvenu merci philodick
  • Partager sur Facebook
  • Partager sur Twitter