IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Transmission $_POST - CheckBox - Comportement étrange


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Transmission $_POST - CheckBox - Comportement étrange
    Bonjour,

    Désolé pour le titre pas très original ni forcément explicite mais je n'ai pas trouvé mieux.

    J'ai un formulaire que je génère en php :
    - je stock dans un champ d'une base les caractéristiques des champs à afficher sous la forme suivante : Nomduchamp-typeduchamp-soustype/choix1-choix2-choixX#NomduchampSuivant-typeduchampSuivant etc. . .

    Sachant que le sous-type n'est présent que si le type du champ n'est pas radio,text,textarea. . . bref le problème n'est pas là.

    Avec quelques "explode" je construis mon formulaire et tout bien comme il faut. (code à venir un peu plus bas n'vous inquietez pas)

    Le problème est que . . . pour les champs n'ayant qu'une valeur possible (input text,radio,textarea, select non-multiple) tout va bien. Mais lorsqu'il s'agit d'un champ Checkbox ou Select Multiple, c'est là que tout se complique.

    J'ai évidemment lu ceci : http://julp.developpez.com/php/formulaires/

    J'ai évidemment compris. J'ai évidemment testé.

    Et il s'avère une chose plus qu'étonnante. Lorsque le code est exécuté (formView.php) et généré avec le php (if et tout se qui s'en suit), un var_dump($_POST) m'indique que mon champ de checkbox est de type String comportant "Array". Losque que je fais un copier/coller du code HTML généré par le navigateur (fichier Test.php), ça fonctionne comme attendu : mon champ de checkbox est de type Array comportant évidemment le contenu coché dans le formulaire.

    J'ai essayé de généré mon code via des echo uniquement au lieu de fermer/rouvrir php à chaque fois pour voir si ça venait d'ici > Niet. J'ai viré mes commentaires (sait-on jamais) > Niet. J'ai essayé de comprendre la différence entre test.php et formView.php : l'un contient l'entete d'encodage utf8 et l'autre aucune > j'ai donc mis l'entete sur les deux : rien ne change non plus.

    Je poste très très rarement ici mais je suis à court de propositions.

    Voici le code :

    formView.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    <?php
     
    	//$message="";
     
     
    if (isset($_POST['permispossedes'])) {
    	var_dump($_POST);
        echo "Vous avez choisi :";
        for ($i = 0, $c = count($_POST['permispossedes']); $i < $c; $i++) {
            echo "<br/><b>" . $_POST['permispossedes'][$i] . "</b>";
        }
    }
     
    /*			for($i=0;$i<sizeof($_POST)-1;$i++){
    
    					
    					if(is_array($value)){
    					
    						echo "<br/>";
    						$value=implode('-',$value);
    						echo $value."<br/>";
    					}
    					$message.=$key." : ".$value."\n";
    				
    			}
    					$subject = "Pré-inscription - ".$_POST['nom'].' '.$_POST['prenom'];
    
    				/*	$from = "From: ".$_POST['nom'].' '.$_POST['prenom']."<".MAIL.">";
    					if(mail('fougerascarl@gmail.com', $subject, $message,$from)){ $alert="<p class='valid'>Votre e-mail a bien été envoyé</p>";  }
    					else { $alert= "<p class='error'>Une erreur est survenue et votre message n'a pu être envoyé. Nous vous invitons à nous contacter par téléphone afin d'effectuer votre demande et de nous notifier le dysfonctionnement.</p>"; }*/
     
     
     
    echo $alert;
    ?>
    <h2><span><?php echo utf8_encode($content->name); ?></span></h2>
     
    <form method="POST">
     
    <?php
    $contenu=explode("#",$content->content); // chaque champ est enregistré et séparé des les autres dans la variable content->content avec le caractère " # "
    foreach($contenu as $cont){
     
    	$form=explode("/",$cont); // à l'intérieur de chaque "champ" les caractéristiques (nom et type du champ) et les données sont séparées par le caractère " / "
    	$formU[0]=explode("-",$form[0]); // chaque partie est séparée par des tirets " - "
    	$formU[1]=explode('-',$form[1]);
     
    	// formU[0][0] = Nom du champ
    	// formU[0][1-2] = Caractéristiques du champ (radio, checkbox, ...)
    	// formU[1] = Données du champ séparées par des tirets " - "
     
    	// Valeurs possibles de formU[0][1-2]
    		//	formU[0][1] = radio
    		//	formU[0][1] = checkbox
     
    		//	formU[0][1] = text
    		//	formU[0][1] = textarea
     
    		//	formU[0][1] = select
    			//	formU[0][2] = unique
    			//	formU[0][2] = multiple
     
    	// h4 > label de chaque champ de formulaire
    	?>
        <h4><?php  echo utf8_encode($formU[0][0]); ?></h4>
        <p class="formU">
    <?php
    			if(sizeof($formU[0])<3 && $formU[0][1]!='textarea'){ // si formU[0] > 3 alors le champ ne peut-être ni radio ni checkbox alors on fait une balise INPUT sauf dans le cas d'un textarea
    				for($i=0;$i<sizeof($formU[1]);$i++){
    ?>
    	<input type="<?php echo $formU[0][1]; ?>" name="<?php echo strtolower(str_replace(" ","",stripAccents(utf8_encode($formU[0][0])))); if($formU[0][1]=='checkbox'){ echo '[]'; }?>" value="<?php echo utf8_encode($formU[1][$i]); ?>" id="<?php if($formU[0][1]=='text'){ echo $formU[0][0].$i.'" />'; } else { echo utf8_encode($formU[1][$i]); ?>" /><label for="<?php echo utf8_encode($formU[1][$i]); ?>"><?php echo utf8_encode($formU[1][$i]); ?></label>
    <?php } ?>
    <?php
                    }
    			}
    			elseif(sizeof($formU[0])<3 && $formU[0][1]=='textarea'){ // sinon si formU[0] > 3 et que ce coup-ci c'est un textarea alors on fait un textarea
    				?>
    	<textarea rows="3" cols="10" name="<?php echo utf8_encode($formU[0][0]); ?>"></textarea>
                    <?php
    			}	// sinon c'est un select et on déroule le select/option
    			elseif($formU[0][1]=='select'){
    				switch($formU[0][2]){
    						case 'multiple':
    							$msg=' multiple="multiple"';
    						break;
    						default:
    							$msg='';
    						break;
    					}?>
    <select name="<?php echo str_replace(" ","",stripAccents(utf8_encode($formU[0][0]))); ?>[]" size="<?php echo sizeof($formU[1]); ?>"<?php echo $msg; ?>>
    				<?php
                    for($j=0;$j<sizeof($formU[1]);$j++){
                        ?>
    	<option value="<?php echo $formU[1][$j]; ?>"><?php echo $formU[1][$j] ?></option>
                        <?php
                    }
                    ?>
    </select>
    			<?php
    			}
    		?>
    	</p>
        <?php
    }
     
    ?>
     
    <p><input type="submit" id="submito" name="submito" value="Pré-inscription" /></p>
    </form>
    Test.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="description" content="essai" />
    <meta name="keywords" content="essai" />
    <title>ABC Conduite - Accueil</title>
    <link rel="stylesheet" href="http://www.abc-conduite.fr/css/reset.css" type="text/css"/>
    <link rel="stylesheet" href="http://www.abc-conduite.fr/css/style.css" type="text/css"/>
    <link rel="shortcut icon" type="image/x-icon" href="http://www.abc-conduite.fr/images/favicon.ico" />
    </head>
     
    <body>
     
    <div id="header">
     
    </div>
     
    <div id="corps">
        <div id="menu">
            <ul id="menu_1">
            <li id="item_1" class=" first current"><a href="/1/2-7-Accueil">Accueil</a></li>
    		        <li id="item_5" class=""><a href="/5/3-6-Permis-B">Formations</a></li>
    		        <li id="item_6" class=""><a href="/6/4-Horaires">Horaires</a></li>
    		        <li id="item_7" class=""><a href="/7/5-Tarifs">Tarifs</a></li>
     
    		        <li id="item_2" class=" last"><a href="/2/1-Contact">Contact</a></li>
    		</ul>    </div>
     
     
     
        <div id="contenu">
            <h2><span>Essai</span></h2>
     
    <form method="POST">
     
        <h4>Genre</h4>
     
        <p class="formU">
    	<input type="radio" name="genre" value="Mme" id="Mme" /><label for="Mme">Mme</label>
    	<input type="radio" name="genre" value="Mlle" id="Mlle" /><label for="Mlle">Mlle</label>
    	<input type="radio" name="genre" value="M" id="M" /><label for="M">M</label>
    	</p>
            <h4>Permis possédés</h4>
        <p class="formU">
     
    	<input type="checkbox" name="permispossedes[]" value="B" id="B" /><label for="B">B</label>
    	<input type="checkbox" name="permispossedes[]" value="EB" id="EB" /><label for="EB">EB</label>
    	<input type="checkbox" name="permispossedes[]" value="C" id="C" /><label for="C">C</label>
    	<input type="checkbox" name="permispossedes[]" value="D" id="D" /><label for="D">D</label>
    	<input type="checkbox" name="permispossedes[]" value="E" id="E" /><label for="E">E</label>
    	</p>
     
            <h4>Nom</h4>
        <p class="formU">
    	<input type="text" name="nom" value="" id="Nom0" />	</p>
            <h4>Commentaires</h4>
        <p class="formU">
    	<textarea rows="3" cols="10" name="Commentaires"></textarea>
                    	</p>
     
     
    <p><input type="submit" id="submito" name="submito" value="Pré-inscription" /></p>
    </form>
     
    <script src="http://www.abc-conduite.fr/js/jquery-1.3.2.min.js" type="text/javascript"></script>
    <link rel="stylesheet" href="http://www.abc-conduite.fr/includes/prettyPhoto3.0/css/prettyPhoto.css" type="text/css" media="screen" title="prettyPhoto main stylesheet" charset="utf-8" />
    <script src="http://www.abc-conduite.fr/js/jquery.prettyPhoto.js" type="text/javascript" charset="utf-8"></script>
     
    </ul>
    <script type="text/javascript" charset="utf-8">
    		$(document).ready(function(){
    			$("a[rel^='prettyPhoto']").prettyPhoto();
    		});
    </script>    </div>
    </div>
     
    <div id="footer"><p><a href="http://www.couleur-favorite.fr/" target="_blank"><img src="http://www.abc-conduite.fr/images/logoCF.png" width="30" height="30" alt="logo Couleur Favorite" /> <span>&copy; Couleur Favorite 2011</a></span></p></div>
     
     
    </body>
    </html>
    l'adresse de la page incriminée : http://www.abc-conduite.fr/1/8-Accueil

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    J'ai pas capté un broc de ta diatribe

    Alors je suis allé tester: Sur les données post effectivement envoyées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Commentaires	
    nom	
    permispossedes[]	B
    permispossedes[]	EB
    permispossedes[]	C
    permispossedes[]	D
    permispossedes[]	E
    submito	Pré-inscription
    On voit que la soumission du formulaire est correcte. En revache, le dump affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(4) { ["permispossedes"]=> string(5) "Array" ["nom"]=> string(0) "" ["Commentaires"]=> string(0) "" ["submito"]=> string(16) "Pré-inscription" }
    Donc, je pense tout simplement que tu fais (probablement involontairement) une conversion de tableau en chaine de caractères.

    Au passage, change-moi cette horreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 0, $c = count($_POST['permispossedes']); $i < $c; $i++) {
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($_POST['permispossedes'] as $value)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    diatribe?

    le charabia pour gérer mon formulaire ^^? c'est une ptite "combine" que j'ai "inventé" pour ne pas avoir à changer la structure de ma base de donnée gérée par mon pti cms perso.

    en fait je re-vérifié ma structure et j'ai trouvé le coupable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($_POST as $key => $value) { $_POST[$key] = mysql_prep($value); }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function mysql_prep($value) {
            if(get_magic_quotes_gpc()) {
                $value = stripslashes($value);
            } else {
                $value = addslashes($value);
            }
            return $value;
    }
    Ça fait parti d'une ptite partie pompée, si d'aventure tu pouvais m'expliquer pourquoi ce traitement transforme les arrays en string "array" je voudrais bien comprendre au passage ^^.

    Pour l'horreur, ça vient pas de moi et je n'aurais pas codé ça tout seul >>> http://julp.developpez.com/php/formulaires/#L4

    De toutes façons ça ne me servait que de test, je ne vais pas m'en servir par la suite.

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    si d'aventure tu pouvais m'expliquer pourquoi ce traitement transforme les arrays en string "array" je voudrais bien comprendre au passage ^^.
    C'est tout simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $a = array(1,2,3);
    var_dump((string)$a);
    Vu que mysql_prep utilise des fonctions de manipulation de chaines de caractères, ton array est casté en string en passant dedans

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    bon eh bien merci, au moins la démarche de venir écrire un sujet ici m'aura ouvert les yeux sur mon erreur

    si t'as besoin d'explications sur mon charabia de gestion de formulaire ^^ je peux t'en donner ^^

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est sympa mais j'ai mes propres classes de génération de formulaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [E-00] Transmission de dates ByRef - comportement étrange
    Par Laestic dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/12/2008, 21h08
  2. Comportement étrange de $_SESSION[""] & $_POST[""]
    Par Kotik dans le forum Langage
    Réponses: 3
    Dernier message: 17/07/2008, 14h38
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo