Intégration des multi checkbox à la Bdd

Eléphant du PHP | 333 Messages

20 mars 2008, 05:09

Bonjour j'ai un problème pour envoyer mes données "checkBox" à ma base de données, lorsque j'envois la requête, il en enregistre qu'un seul et non pas tout ceux qui ont été sélectionner, Pouvez-vous m'aider.... voici la partie concerné de mon code:
<?
$nom = $_POST['nom']; 
		$user = $_POST['user'];	
		$pass = $_POST['pass'];	
		$email = $_POST['email'];  
		$site = $_POST['site'];
		$niveau = $_POST['niveau'];
		$secur_key = $_POST['secur_key'];
		$block = $_POST['block'];
		$dvd_acces = $_POST['dvd_acces'];

		mysql_query("UPDATE acces SET nom='" . $nom . "', 
		  									user='" . $user . "', 
											pass='" . $pass . "', 
											email='" . $email . "',
											site='" . $site . "',
											niveau='" . $niveau . "',
											secur_key='" . $secur_key . "',
											block='" . $block . "',
											dvd_acces='" . $dvd_acces . "'
											WHERE user='". $loanuserid."'") or die(mysql_error());	

?>

<input type="checkbox" name="dvd_acces[]" value="dvd-00"> Ouverture de session<br>
     			<input type="checkbox" name="dvd_acces[]" value="dvd-01"> Activer l'ouverture sans clef<br>
     			<input type="checkbox" name="dvd_acces[]" value="dvd-02"> Droit à la gestion<br>
     			<input type="checkbox" name="dvd_acces[]" value="dvd-03"> Ajout de DVD<br>
     			<input type="checkbox" name="dvd_acces[]" value="dvd-04"> Modification de DVD<br>
     			<input type="checkbox" name="dvd_acces[]" value="dvd-05"> Gestion des près<br>
     			<input type="checkbox" name="dvd_acces[]" value="dvd-06"> Effectuer des retours<br>
     			<input type="checkbox" name="dvd_acces[]" value="dvd-07"> Gestion des accès<br>
Merci encore de votre aide
Ce n'est pas toujours facile d'essayer, mais c'est toujours vallorisant lorsqu'on y arrive !!!

Apprenez, ne le faite pas faire par les autres.

Mammouth du PHP | 881 Messages

20 mars 2008, 06:55

J'ai observé des troubles semblables avec IE jusqu'à ce que je m'aperçusse que IE et Firefox différaient sur ce point: Les éléments de formulaires dont l'indice est déterminé par le navigateur ne sont pas pris en compte par IE s'il sont restés vides. Par exemple, si tu as

Code : Tout sélectionner

<input type="checkbox" name="banane[]">Choix 1 (sélectionné) <input type="checkbox" name="banane[]">Choix 2 <input type="checkbox" name="banane[]">Choix 3 <input type="checkbox" name="banane[]">Choix 4 (sélectionné) <input type="checkbox" name="banane[]">Choix 5 <input type="checkbox" name="banane[]">Choix 6 (sélectionné) <input type="checkbox" name="banane[]">Choix 7
On s'entend pour dire que l'indice attribué par le navigateur, dans le cas ci-haut, sera de 1 inférieur à l'appellation "Choix". Les indices seront donc de 0 à 6 et dans l'analyse des résultats obtenus, il faudrait programmer ainsi:
for ($x=0; $x<7; $x++) {
       
}
Voilà que IE ne donnera que les résultats suivants:

$_POST["banane"][0] = Choix 1
$_POST["banane"][1] = Choix 4
$_POST["banane"][2] = Choix 6


Ce doit être pour sauver de la mémoire, va savoir!

Pour contrer cela, je n'ai trouvé mieux de donner une valeur traitable au champ, par exemple:

Code : Tout sélectionner

<input type="checkbox" name="banane[]" value=1>Choix 1 (sélectionné) <input type="checkbox" name="banane[]" value=2>Choix 2 <input type="checkbox" name="banane[]" value=3>Choix 3 <input type="checkbox" name="banane[]" value=4>Choix 4 (sélectionné) <input type="checkbox" name="banane[]" value=5>Choix 5 <input type="checkbox" name="banane[]" value=6>Choix 6 (sélectionné) <input type="checkbox" name="banane[]" value=7>Choix 7
Travaillant alors sur la valeur plutôt que sur le fait d'être choisi ou non, je ne travaile donc qu'avec les éléments choisis et en retire instantanément la valeur. D'une pierre deux coups.

Si ça peut t'aider. :wink:
Soyez artisans de paix

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

20 mars 2008, 09:38

Le problème vient surtout du fait que quand tu ajoutes des crochets dans le nom d'un champ de formulaire, php interprète celui-ci comme un tableau. Donc à moins qu'une seule case n'ait été cochée, ta variable $_POST['dvd_acces'] est un tableau que tu ne peux donc pas utiliser telle quel dans une requête.

Selon le besoin tu peux utiliser des fonctions comme implode() pour transformer le tableau en chaine, ou parcourir les éléments du tableau avec un for, voire encore plus simplement avec un foreach. (En l'occurence, lorsque tu as une relation 1..N, c'est à dire qu'un enregistrement de ta table peut être associé à N autres élément, plutôt qu'un champ texte dans lequel tu ne retrouveras rien de manière relationnelle, il vaut mieux faire une nouvelle table ou chaque enregistrement correspondra à une association).


@Patriboom : en fait seules les cases qui ont été cochées sont envoyées au serveur. La numérotation (qui n'est pas spécifique à IE) est un bête tableau indexé, donc qui commence à 0 et qui contient uniquement les cases cochées. Pour savoir si une case est cochée il suffit donc de tester sa présence avec isSet().

Pour en faire un tableau associatif, il faut mettre un identifiant entre les crochets du formulaire :

Code : Tout sélectionner

<input type="checkbox" name="banane[1]" value="valeur1">Choix 1 (sélectionné) <input type="checkbox" name="banane[2]" value="valeur2">Choix 2 <input type="checkbox" name="banane[3]" value="valeur3">Choix 3 <input type="checkbox" name="banane[4]" value="valeur4">Choix 4 (sélectionné) <input type="checkbox" name="banane[5]" value="valeur5">Choix 5 <input type="checkbox" name="banane[6]" value="valeur6">Choix 6 (sélectionné) <input type="checkbox" name="banane[7]" value="valeur7">Choix 7
Tu récupères alors le tableau :
$_POST["banane"] = array (
  1 => valeur1, 
  4 => valeur4,
  6 => valeur6
)
la valeur n'ayant pas réellement d'intérêt, seule la présence compte

Quant à la boucle, il vaut mieux utiliser un foreach qui traitera chacun des éléments du tableau (et uniquement ceux là), plutôt qu'un for de 0 à 7, qui va tenter d'accéder à tous les index sans se soucier de savoir s'ils existent ou non, provoquant à chaque fois des avertissement. (Bon, c'est vrai qu'on peut les planquer sous le tapis pour ne pas les voir, mais c'est pas ce qu'on appelle développer proprement ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 333 Messages

20 mars 2008, 19:01

je suis pas certain de bien comprendre...
Ce n'est pas toujours facile d'essayer, mais c'est toujours vallorisant lorsqu'on y arrive !!!

Apprenez, ne le faite pas faire par les autres.

ViPHP
AB
ViPHP | 5818 Messages

20 mars 2008, 22:19

Pour mieux comprendre essaye ça dans une page séparée
<?php
if (isset($_POST['dvd_acces'])) {

foreach ($_POST['dvd_acces'] as $value) {
echo 'valeur cochée = '.$value.'<br />';
}

}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>


</head>
<body>
<form action='' method="post">
<input type="checkbox" name="dvd_acces[]" value="dvd-00"> Ouverture de session<br>
<input type="checkbox" name="dvd_acces[]" value="dvd-01"> Activer l'ouverture sans clef<br>
<input type="checkbox" name="dvd_acces[]" value="dvd-02"> Droit à la gestion<br>
<input type="checkbox" name="dvd_acces[]" value="dvd-03"> Ajout de DVD<br>
<input type="checkbox" name="dvd_acces[]" value="dvd-04"> Modification de DVD<br>
<input type="checkbox" name="dvd_acces[]" value="dvd-05"> Gestion des près<br>
<input type="checkbox" name="dvd_acces[]" value="dvd-06"> Effectuer des retours<br>
<input type="checkbox" name="dvd_acces[]" value="dvd-07"> Gestion des accès<br>
<input type="submit" value= "ok"/>
</form>
</body>
</html>
A part ça si tu veux enregistrer un tableau dans un champ de ta bdd il faut utiliser utiliser serialize()

Eléphant du PHP | 333 Messages

06 avr. 2008, 00:20

Ok ca fonctionne pour les faire afficher à la page, mais là j'essais de l'intégrer à la Bdd, et la ca ne fonctionne pas.....

j'ai essayer plein de combinaison, et il me met qu'un seul champ cocher, et toujours le dernier.

voici ce que j'ai
if(isset($_POST['ajouter']))
		{													
		$nom = $_POST['nom']; 
		$user = $_POST['user'];	
		$pass = $_POST['pass'];	
		$email = $_POST['email'];  
		$site = $_POST['site'];
		$niveau = $_POST['niveau'];
		$secur_key = $_POST['secur_key'];
		$block = $_POST['block'];
	
		foreach ($_POST['dvd_acces'] as $value1)
		{
		$value3 = "".$value1." ,";
		}
	
		
	
		
	

		mysql_query("UPDATE acces SET nom='" . $nom . "', 
		  									user='" . $user . "', 
											pass='" . $pass . "', 
											email='" . $email . "',
											site='" . $site . "',
											niveau='" . $niveau . "',
											secur_key='" . $secur_key . "',
											block='" . $block . "',
											dvd_acces='" . $value3 . "'
											WHERE user='". $loanuserid."'") or die(mysql_error());	
		}	
Ce n'est pas toujours facile d'essayer, mais c'est toujours vallorisant lorsqu'on y arrive !!!

Apprenez, ne le faite pas faire par les autres.