Page 1 sur 1

Enregistrer array dans BD

Posté : 12 déc. 2008, 16:13
par tibious
Bonjour à tous, j'ai un problème d'enregistrement de case à cocher que je n'arrive pas à résoudre.
Je récupère les valeur de checkbox (il y en a 24) de la façon suivante:

Code : Tout sélectionner

$tab = array(); if(!empty($_POST["type_a"])) $tab[] = $_POST["type_a"]; else {$tab[] = '';} if(!empty($_POST["type_b"])) $tab[] = $_POST["type_b"]; else {$tab[] = '';} if(!empty($_POST["type_c"])) $tab[] = $_POST["type_c"]; else {$tab[] = '';}] if(!empty($_POST["type_d"])) $tab[] = $_POST["type_d"]; else {$tab[] = '';}] et ainsi de suite...
J'enregistre dans la base par:

Code : Tout sélectionner

$sql = "INSERT INTO pw_type_eff(champ1, champ2, champ3) VALUES('{$tab[0]}', '{$tab[1]}', '{$tab[2]}')";]
L'utilisateur peut cocher de 1 à 3 cases, donc il y a 24 cases à cocher et 3 champs correspondants.
Comme j'ai écris le script, si je coche les 3 premières cases il enregistre dans les 3 champs.
Si je coche les cases b,c,d, le champ 1 est vide et il enregistre dans les champs 2 et 3.
Si je coche les cases c,d,e, les champs 1,2 sont vide et il enregistre dans le champ 3.

Si bien que si je coche les cases après la 3ème les champs sont vide.

Comment faire pour que quelque soit le nombre et l'emplacement des cases cochées elles soit enregistrées dans les champs de la base.
Encore merci pour votre aide.

Posté : 12 déc. 2008, 17:55
par sadeq
La solution est d'éviter à nommer les cases à cocher dans HTML avec des noms différents, il faut simplement nommer les 24 case avec le même nom suivi de double crochets. Exemple:

Code : Tout sélectionner

<input type="checkbox" name="type_eff[]" value="blabla1" /> Blabla1 <br /> <input type="checkbox" name="type_eff[]" value="blabla2" /> Blabla2 <br /> <input type="checkbox" name="type_eff[]" value="blabla3" /> Blabla3 <br /> <input type="checkbox" name="type_eff[]" value="blabla4" /> Blabla4 <br /> <input type="checkbox" name="type_eff[]" value="blabla5" /> Blabla5 <br /> <input type="checkbox" name="type_eff[]" value="blabla6" /> Blabla6 <br />
Comme ça, PHP reçoit après le post du formulaire un seul paramètre nommé $_POST["type_eff"] qui se comporte comme un tableau et qui contient seulement les cases qui ont été cochées (les cases qui ne sont pas cochées n'y figurent pas) C'est comme cela que fonctionne le postage des cases à cocher ou des radios boutons qui sont nommés comme un tableau [].

Dans PHP, il faut changer donc ton code pour recevoir et traiter le tableau $_POST["type_eff"] en conséquence. Voici, comment :
// récupérer le tableau des cases à cocher si transmis
$type_eff = isset($_POST["type_eff"]) ? $_POST["type_eff"] : array(); // tableau des cases cochées

// si le tableau contient au moins 3 cases cochées, on fait la requête, sinon message d'erreur
if (count($type_eff) < 3) {
   echo "Erreur: Il faut cocher au moins 3 cases!";
}
else
{
    // Requête qui insère toujours les 3 premières cases cochées rencontrées dans le tableau   $type_eff
    $valeur1 = $type_eff[0];
    $valeur2 = $type_eff[1];
    $valeur3 = $type_eff[2];

    // Requête SQL à exécuter
    $sql = "INSERT INTO pw_type_eff(champ1, champ2, champ3) VALUES ('$valeur1', '$valeur2', '$valeur3')";

   // ... suite ...
} 
// fin if count($type_eff)
Remarque:
Avec cette méthode tu peux augmenter ou diminuer le nombre des cases à cocher dans la page HTML, sans toucher à ton code PHP, car ce dernier traite toujours un tableau de cases quelque soit le nombre de cases. Et la requête INSERT ne reçoit que les 3 premières cases.

Posté : 12 déc. 2008, 20:36
par tibious
Alors la, un grand merci. Impeccable, depuis le temps que je cherchais!
Par contre, comme l'utilisateur peut cocher de 1 à 3 cases j'ai modifier comme ça:

Code : Tout sélectionner

if (count($type_eff) < 1 ) { echo "Erreur: Il faut cocher au moins 1 case!"; } elseif(count($type_eff) > 3 ) { echo "Erreur: Il faut cocher au plus 3 cases!"; } else
Tout fonctionne, mais avec un message d'erreur (Notice: Undefined offset: 1 et 2) qui correspond à :

Code : Tout sélectionner

$valeur1 = $type_eff[0]; $valeur2 = $type_eff[1]; $valeur3 = $type_eff[2];
Encore merci pour ton aide.

Posté : 12 déc. 2008, 21:04
par sadeq
C'est normal, puisque tu autorise au moins 1 une case, il faut vérifier l'existence des 2 manquantes avant l'affectation:
    $valeur1 =  isset($type_eff[0]) ? $type_eff[0] : ""; 
    $valeur2 =  isset($type_eff[1]) ? $type_eff[1] : ""; 
    $valeur3 =  isset($type_eff[2]) ? $type_eff[2] : "";  
:wink:

Posté : 12 déc. 2008, 23:52
par tibious
Encore merci et bravo pour l'efficacité et la compétence.

Posté : 13 déc. 2008, 00:01
par sadeq
Merci, le plaisir était pour moi. n'oublie pas un p'tit RESOLU.