Comment envoyé valeur checkbox mêm si aucune est coché

Eléphant du PHP | 135 Messages

14 févr. 2007, 15:38

J'ai essayé 'être cours et précis dans le titre j'espère que c'est bon
However...

J'ai un petit problem de checkbox. sur une première page j'ai une boucle qui génère des checkbox.
	for ($men2=0;$men2<$numlines;++$men2){
		echo '<dd class="block"><input type="checkbox" name="check[]" value="'.$tabmenu[$men2].'">' . $tabmenu[$men2]. '</dd>';
		}
à l'envoie du formulaire il transmet les données à:
$check=$_POST["check"];
jusque là tout est normale, Mais si aucun checkbox n'est coché il renvoie automatiquement un message d'erreur genre undefined index: check patati patata ligne tant.
Comment est-il possible d'incrémenter la variable check par défault. ou un truc comme ça ???

Merci
D'avance. :)
Des noeuds au cerveau!

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

14 févr. 2007, 16:45

Si la case n'est pas cochée, elle n'est pas envoyée.. si tu l'envoi quand même, comment sauras tu si elle a été cochée ou pas ? :)

Ce qu'il faut faire, c'set simplement tester si la valeur a été envoyée :
if(isSet($_POST["check"])) // la valeur existe on l'utilise
  $check = $_POST['check'];
else // sinon
  $check = ''; // on peut coller une valeur par défaut.
la même chose sous forme ternaire (ce qui prend moins de place quand tu as 15 champs ;)) :
$check = (isSet($_POST["check"])) ? $_POST['check'] : '';
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 135 Messages

14 févr. 2007, 17:49

Merci Ryle

POur la valeur par défaut de check j'eu un petit problem,
car j'utilise un peu plus loin cette valeur avec foreach dans une fonction,
et comme ilm'indiquait une erreur à la ligne même du foreach,
j'ai fait l'essai sans donner de valeur par défaut et de mettre un isset avec l'instruction if dans la fonction et ça marche.
c'est pas très honête mais ça marche.
if (isset ($_POST["check"])){
	$check=$_POST["check"];
	}
function reConcatenCheck ($rcc){
	$rescheck="";
	if (isset ($rcc)){
	foreach ($rcc as $f) {
    	$rescheck .= splitchars ($f,3);
		}}
 	return $rescheck;
	}
	
si quelqu'un avait une idée pour simplifié ce que j'ai fait. je serais enchanté comme Merlin.

Merci David.
Des noeuds au cerveau!

ViPHP
AB
ViPHP | 5818 Messages

15 févr. 2007, 03:04

Bonjour,

On ne peut guère faire plus simple, mais si tu souhaites avoir une valeur par défaut pour $check, ce qui est recommandé dans la plupart des cas:

en considérant que si $_POST["check"] existe, c'est un tableau (d'après ce que j'ai compris de ton code):
$check = (isset($_POST["check"]) && is_array($_POST["check"]))? $_POST["check"] : '';
  
function reConcatenCheck ($rcc){ 
    $rescheck=""; 
    if (!empty($rcc)){ 
    foreach ($rcc as $f) { 
        $rescheck .= splitchars ($f,3); 
        }} 
     return $rescheck; 
    } 
ainsi ta boucle ne devrait plus renvoyer d'erreur même si $_POST["check"] n'existe pas.

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

15 févr. 2007, 13:12

Ou tu dois aussi simplement pouvoir mettre un tableau vide en valeur par défaut :)
$check = array();
if (isset ($_POST["check"]))
    $check=$_POST["check"]; 
si $_POST est renseigné, $check contiendra sa valeur, sinon ce sera un tableau vide et tu ne rentreras normalemebt pas dans le foreach. La solution d'AB fonctionne également, mais je pense qu'il vaut mieux prendre l'habitude de respecter les types de variables (même si php s'en moque) et ne pas mélanger tableau et chaine ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

15 févr. 2007, 18:47

Merci Ryle, merci AB,

Donc Ryle si je te suis bien je pourrais en utilisant l'expression "$check=array();" , il serait possible d'enlever la condition "if" de la fonction?

David.

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

15 févr. 2007, 18:57

Il me semble... c'est à vérifier, je ne sais plus comment se comporte le foreach devant un tableau vide. Mais en théorie tu devrais pouvoir te passer du test dans la fonction (en fait, c'est implicitement le test du foreach qui vérifie si le prochain élément du tableau existe, qui devrait être effectué) :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
AB
ViPHP | 5818 Messages

15 févr. 2007, 18:57

Bonjour,

Effectivement en suivant les conseils de Ryle tu devrais pouvoir éviter le test à l'intérieur de ta fonction.

EDIT après vérif, tu peux. Ton code optimisé devrait donc ressembler à
$check = (isset($_POST["check"]) && is_array($_POST["check"]))? $_POST["check"] : array() ; 
   
function reConcatenCheck ($rcc){  
    $rescheck="";  
  
    foreach ($rcc as $f) {  
        $rescheck .= splitchars ($f,3);  
        }

     return $rescheck;  
    } 
je te conseille la syntaxe ci-dessus car elle permet de t'assurer que $_POST["check"] est un tableau, donc aucun risque de générer une erreur dans ta boucle dans le cas contraire.

Eléphant du PHP | 135 Messages

15 févr. 2007, 19:58

Cool en effet ça marche en enlevant la condition if.
ça rend le code plus claire. enfin pour moi.

Merci encore
David.
Des noeuds au cerveau!