récupérer valeurs de checkboxs en php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : récupérer valeurs de checkboxs en php

par Ben-J » 30 juin 2006, 14:26

Merci beaucoup tout le monde !!! et un sujet de plus tiré au clair, en espérant que ça serve a d'autres!! lol

par ouckileou » 30 juin 2006, 13:57

Pourtant y'a rien de plus simple que les checkbox c'est bizarre tous ces problèmes...

A propos de ton code sadeq, pourquoi indicer explicitement la deuxième dimension ?

En ayant en première dimension le numéro de ligne, et en laissant PHP se débrouiller pour la deuxième, on obtiendra un tableau sans trous.
Parceque ici du coup le deuxième indice fait doublon avec la valeur (lundi, mardi, mercredi...)

Code : Tout sélectionner

<p>1° ligne <br> <input type="checkbox" name="jour[1][]" value="lendi"> <input type="checkbox" name="jour[1][]" value="mordi"> <input type="checkbox" name="jour[1][]" value="credi"> <input type="checkbox" name="jour[1][]" value="joudi"> <input type="checkbox" name="jour[1][]" value="dredi">
$jour = $_POST["jour"];
                     
foreach($jour as $numLigne => $ligne) { //1° dimension : n° ligne
{      
    foreach($ligne as $nomJour) {  //2° dimension : uniquement les valeurs des cases cochées
    {
        echo $nomJour; 
        echo'<br />';
    }
   echo '<br />';
}
ça change pas radicalement mais c'est plus simple non ?

par Henri » 30 juin 2006, 13:36

Je ne sais pas parce que je suis particulièrement mauvais, mais j'ai toujours eu des problèmes avec les récupérations de checkbox : du style, ne rien récupérer ou récupérer uniquement la dernière valeur cochée. Ou alors ça marche dans un browser et pas dans l'autre ...

bref, j'ai désormais un petit script que j'utilise à chaque fois sans me poser de question et qui balance toutes les valeurs cochées dans un seul champ. C'est bourrin, mais ça marche :)

Code : Tout sélectionner

<script> function concatcheck (the_form, the_col, the_hidden) { var elts = document.forms[the_form].elements[the_col]; var elts_cnt = (typeof(elts.length) != 'undefined') ? elts.length : 0; document.forms[the_form].elements[the_hidden].value = ""; if (elts_cnt) { for (var i = 0; i < elts_cnt; i++) { if (elts[i].checked) { document.forms[the_form].elements[the_hidden].value += elts[i].value; document.forms[the_form].elements[the_hidden].value += "/"; } } } } </script>
Ensuite, dans mon formulaire, j'ai des champs cachés pour chacune des séries de checkbox.

Code : Tout sélectionner

<form action"destination.php" method="post" name="frmselect"> <input type="hidden" name="tabpays"> <input type="hidden" name="tabdepa"> <input type = checkbox name = pays value='FR'>France <input type = checkbox name = pays value='UK'>Angleterre ... <input type = checkbox name = depa value='01'>Ain <input type = checkbox name = depa value='02'>Aisne ... <input name=select type=button value=Valider' onClick="validate(frmselect);"> </form>
Je complète par la méthode de validation

Code : Tout sélectionner

<script> function validate(the_form) { // des tests de champ obligatoire par exemple ... concatcheck (the_form, 'pays', 'tabpays'); concatcheck (the_form, 'depa', 'tabdepa'); my_form = eval(the_form) my_form.submit(); } </script>
et dans ma fenêtre destination, je récupère les variables tabpays et tabdepa. Il suffit d'un explode en PHP pour retrouver un array

par sadeq » 30 juin 2006, 13:02

Oui je vois, mais c'est normal puisque tu as répété le même tableau jour 2 fois dans HTML. pour PHP il s'agit d'un seul c'est pourquoi il retient les dernières modifications effectuées tout au long des lignes :
Dans la ligne1 tu as coché 1 et 3 et dans la 2° ligne tu as coché 2 et recoché 3, pour PHP $jour contient alors les case cochées : 1, 2 et 3
Et puisque tu les affiche 2 fois dans la boucle $j, hé bien ça ce répéte.

Pour résoudre le problème il faut utiliser un tableau jour à 2 dimensions :
1. la 1° dimension est celle des lignes
2. la 2° dimension est celle des 5 jours

Ce qui donne un HTML comme ça :

Code : Tout sélectionner

<p>1° ligne <br> <input type="checkbox" name="jour[1][1]" value=lendi> <input type="checkbox" name="jour[1][2]" value=mordi> <input type="checkbox" name="jour[1][3]" value=credi> <input type="checkbox" name="jour[1][4]" value=joudi> <input type="checkbox" name="jour[1][5]" value=dredi> <p>2° ligne <br> <input type="checkbox" name="jour[2][1]" value=lendi> <input type="checkbox" name="jour[2][2]" value=mordi> <input type="checkbox" name="jour[2][3]" value=credi> <input type="checkbox" name="jour[2][4]" value=joudi> <input type="checkbox" name="jour[2][5]" value=dredi> ...
Et un PHP de récupération du tableau 2D comme ça:
$jour = $_POST["jour"]; 
                     
for($i = 1; $i <= 2 ; $i++) //1° dimension : n° ligne
{      
    for($j = 1; $j <= 5 ; $j++)  //2° dimension : 1..5 jours
    { 
        echo'<br>'; 
        print_r($jour[$i][$j]); 
        echo'<br>'; 
    } 
}

par Ben-J » 30 juin 2006, 10:15

merci beaucoup pour ce cours sadeq

la suite de mon problème:
maintenant j'ai:

Code : Tout sélectionner

<input type="checkbox" name="jour[1]" value=lendi> <input type="checkbox" name="jour[2]" value=mordi> <input type="checkbox" name="jour[3]" value=credi> <input type="checkbox" name="jour[4]" value=joudi> <input type="checkbox" name="jour[5]" value=dredi>
et
$jour = $_POST["jour"];
					
for($i = 1; $i < count($selectsemaine) ; $i++)
{ 	
	for($j = 0; $j < 5 ; $j++)
	{
		echo'<br>';
		print_r($jour[$j]);
		echo'<br>';
	}
}
où $i fais défiler les lignes du tableau tant que des lignes y sont ajoutées, et $j les 5 checkbox pour chaque ligne;
le problème est donc qu'il m'affiche le cumul, càd:
ligne 1: lendi et credi coché;
ligne 2: mordi et credi coché;
submit

il me renvoi:

lendi
mordi
credi

lendi
mordi
credi

au lieu de:

lendi
credi

mordi
credi

vous voyez où je veux en venir?
quelqu'un peut-il m'éclairer de nouveau?
merci d'avance !

par sadeq » 29 juin 2006, 14:33

un Checkbox non coché n'est même pas envoyé à PHP, par contre s'il est coché il est envoyé.
Mais s'il est coché et n'a pas eu de clause value il retourne le mot "on" sinon si une clause value portant une valeur lui est assignée, il retourne cette valeur
Exemple:

Code : Tout sélectionner

<input type=checkbox name=case1>
si cette case est cochée elle retourne un $_GET["case1"] = "on"
sinon le $_GET["case1"] n'existe pas

Code : Tout sélectionner

<input type=checkbox name=case1 value="toto">
si cette case est cochée elle retourne un $_GET["case1"] = "toto"
sinon le $_GET["case1"] n'existe pas

Maintenant si on a un tableau de checkbox (même nom suivi de []) seuls les checkbox alors cochés constituent le tableau reçu par PHP
exemple:

Code : Tout sélectionner

<input type=checkbox name='case1[]' value='a'> <input type=checkbox name='case1[]' value='b'> <input type=checkbox name='case1[]' value='c'> <input type=checkbox name='case1[]' value='d'>
Seules les cases cochées constituent le tableau case1 reçu par PHP sans respecter la séquence d'origine des checkbox. En l'occurence,
$_GET["case1"] contiendra les cases [0] => 'a' et [1] => 'd' si les checkbox 1 et 4 sont cochés

Pour éviter de perdre la séquence d'origine des cases d'un tableau de checkbox il faut inclure les index dans le nom du checkbox
exemple:

Code : Tout sélectionner

<input type=checkbox name='case1[0]' value='a'> <input type=checkbox name='case1[1]' value='b'> <input type=checkbox name='case1[2]' value='c'> <input type=checkbox name='case1[3]' value='d'>
Puisque les cases sont indexées le tableau case1 reçu par PHP retiendra les index d'origine des cases cochées. En l'occurence, si les checkbox 1 et 4 sont cochés
$_GET["case1"] contiendra les cases [0] => 'a' et [3] => 'd' où 0 et 3 sont les index d'origine

par Ben-J » 29 juin 2006, 13:30

of course, quand même ^^:
$lundi = $_POST["lendi"];
$mardi = $_POST["mordi"];
$mercredi = $_POST["credi"];
$jeudi= $_POST["joudi"];
$vendredi = $_POST["dredi"];
sinon, qu'entends-tu par "jouer sur les valeurs"? a base de isset dans un if peut-être? la checkbox renvoie 0 ou 1? (pas true/false, etc), dans l'indice ou la valeur?
merci de ton aide qui m'est précieuse ^^

par Ryle » 29 juin 2006, 12:07

Question bête mais, ton $lundi (et ses p'tits compagnons) sont bien égaux à $_POST['lendi'] ?

Sinon juste une remarque vis à vis des case à cocher : les valeurs ne sont envoyées que si les cases sont cochées, sinon il ne les envois pas. Tes tableaux ne seront donc pas cohérents si tu coches le premier et le 3ème lundi, tu récupereras un tableau avec deux index (0 et 1) et donc tu ne pourras pas s'avoir qu'il s'agit du 1er et du 3ème si tu ne joues pas sur les valeurs...

récupérer valeurs de checkboxs en php

par Ben-J » 29 juin 2006, 11:58

bonjour! ben voila j'ai un bête problème, càd dans un formulaire de saisie dans un tableau dynamique avec ajout de ligne, 5 checkbox :

Code : Tout sélectionner

<td width = 175> <div align="center"> <input type="checkbox" name="lendi[]" > <input type="checkbox" name="mordi[]" > <input type="checkbox" name="credi[]" > <input type="checkbox" name="joudi[]" > <input type="checkbox" name="dredi[]" > </div> </td>
que je récupère dans mon script en $_POST et fait
for($i = 1; $i < count($selectsemaine) ; $i++)
{
$requete="INSERT INTO resavehic VALUES (' ',  '$lundi[$i]', '$mardi[$i]', '$mercredi[$i]', '$jeudi[$i]', '$vendredi[$i]');";
mysql_query($requete);
}
pensant naïvement que cela ferait défiler la valeur de chacune pour chaque enregistrement dans ma base; mais (il en faut toujours un) mon problème est que dans ma base tous ces champs la sont a zéros, et les print_r m'affiche "on" uniquement lorsque la checkbox est "chekée" dans plusieurs ligne (sa se cumule quoi)

s'a ma l'air tout c** comme problème mais je solliciterai tout de même volontiers un regard neuf et lucide, merci d'avance !