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 :

Récupération de valeurs $_POST [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Récupération de valeurs $_POST
    Bonjour à toutes et tous, et par avance merci de votre aide.
    Voici le code HTML(extrait):
    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
    <?php foreach($descriptions as $description): ?>
    			<div class="row">
    				<div class="col col-sm-1">
    					<label for="" class="control-label col-form-label-sm" >Ordre</label>  
    					<input id=""  type="text" class="form-control form-control-sm" value="<?= ($action==2 ? $description['ordre']: '' ); ?>" name="ordre[<?= $description['id_local'];  ?>]">
    				</div>
    				<div class="col col-sm-3">
    					<label for="" class="control-label col-form-label-sm" >Titre</label>  
    					<input id="" type="text" class="form-control form-control-sm" value="<?= ($action==2 ? $description['titre']: '' ); ?>" name="titre[<?= $description['id_local'];  ?>]">
    				</div>
     
    				<div class="col">
    					<label class="control-label col-form-label-sm" for="">Description</label>  
    					<textarea id="" class="form-control form-control-sm" rows="5" name="description[<?= $description['id_local'];  ?>]"><?= ($action==2 ? $description['description']: '' ); ?></textarea>
    				</div>
    				<div class="col col-sm-1">
    					<label for="" class="control-label col-form-label-sm">Supprimer</label>
    					<button type="submit" class="form-control form-control-sm btn btn-primary btn-sm" name="supprimer_description[<?= $description['id_local'];  ?>]" ><i class="fa fa-minus-square"></i></button>
    				</div>
    				<input type="hidden" name="id_local[]" value="<?= $description['id_local'];  ?>">
    			</div>
    			<?php endforeach; ?>
    et le traitement (extrait / sur une page distincte)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Descriptions
    		if (isset($_POST['id_local']) && is_array($_POST['id_local'])) :
    			foreach($_POST['id_local'] as $id_local=>$element):
    				$options['ordre'.$element] = array('filter' => FILTER_VALIDATE_INT, 'options' => array('min_range' => 0 )) ; 				
    				$options['titre'.$element] = FILTER_SANITIZE_STRING ;				
    				$options['description'.$element] = FILTER_SANITIZE_STRING ;	
    			endforeach;
    		endif;
    $resultat = filter_input_array(INPUT_POST, $options);
    Et enfin le retour de var_dump($_POST)
    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
    ["ordre"]=>
      array(4) {
        [126]=>
        string(1) "1"
        [127]=>
        string(1) "2"
        [128]=>
        string(1) "3"
        [129]=>
        string(1) "4"
      }
      ["titre"]=>
      array(4) {
        [126]=>
        string(12) "Bâtiment BE"
        [127]=>
        string(11) "Communs TBE"
        [128]=>
        string(10) "Hôtel TBE"
        [129]=>
        string(7) "Travaux"
      }
      ["description"]=>
      array(4) {
        [126]=>
        string(218) "blablabla"
        [127]=>
        string(307) "blablabla"
        [128]=>
        string(334) "blablabla"
        [129]=>
        string(278) "blablabla."
      }
      ["id_local"]=>
      array(4) {
        [0]=>
        string(3) "126"
        [1]=>
        string(3) "127"
        [2]=>
        string(3) "128"
        [3]=>
        string(3) "129"
      }
    et celui de var_dump($resultat)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ["ordre126"]=> NULL ["titre126"]=> NULL ["description126"]=> NULL ["ordre127"]=> NULL ["titre127"]=> NULL ["description127"]=> NULL ["ordre128"]=> NULL ["titre128"]=> NULL ["description128"]=> NULL ["ordre129"]=> NULL ["titre129"]=> NULL ["description129"]=> NULL
    Donc, je ne comprends pas pourquoi j'obtiens NULL. J'ai essayé aussi $options['ordre['.$element].']] pour le même résultat. Un peu d'aide sera bienvenu.

  2. #2
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    je ne suis pas un expert, mais il me semble que par exemple, c'est la variable $_POST["ordre[126]"] qui devrait exister...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Bonjour, merci de intéresser au sujet. en fait, je teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (isset($_POST['id_local']) && is_array($_POST['id_local'])) :
    et si id_local existe ordre existe aussi car ils sont issus de la même table...

    Je pense que c'est la valeur que j'envoie au filtre (ordre126 par exemple) qui fait planter mon script. Mais j'ai bien $_POST['ordre126'], $_POST['titre126'], $_POST['description126'] envoyés par le formulaire...

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    et que vaut $_POST["ordre"]["126"] ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Oui tu as raison, je tope 1. mais avec le filtre j'obtiens soit NULL soit BOOL(false)
    Avec les filtres lorsque je veux tester $_POST['ordre'] : je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $options['ordre'] = array('filter' => FILTER_VALIDATE_INT, 'options' => array('min_range' => 0 )) ;
    La question est donc si je veux tester $_POST['ordre']['126'] Que dois je écrire?... je reprends le manuel ;-)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Tableau multidimentionnel et filtrage des valeurs récupérées.
    Bonjour,
    je relance le sujet, n'ayant pas trouvé la solution.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 831
    Points
    5 831
    Billets dans le blog
    1
    Par défaut
    désolé mais je ne connais rien à ces filtres et n'ai pas le temps d'étudier...
    J'espère que quelqu'un de plus calé pourra t'aider.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Oui, merci LaurentSc de ton aide.

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 453
    Points : 4 978
    Points
    4 978
    Par défaut
    Bonjour,

    Essaies ça :
    Code php : 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
     
    function filter(array &$array){
        array_walk($array, function (&$value,&$key) {
    	foreach($value as &$v){
    		$v=filter_var(trim($v), $key=="ordre"?FILTER_VALIDATE_INT:FILTER_SANITIZE_STRING,$key=='ordre'?["options"=>array('min_range' => 0 ,'default' => 0)]:[]);
    	}
        });
       return $array;
    }
    if (isset($_POST['id_local']) && is_array($_POST['id_local'])) :
       filter($_POST);
    endif;
     
    //affichage 
    echo "<pre>".
    print_r($_POST,1);
    echo "</pre>";
     
    //résultat :
    Array
    (
        [ordre] => Array
            (
                [126] => 1
                [127] => 2
                [128] => 3
                [129] => 4
            )
     
        [titre] => Array
            (
                [126] => Bâtiment BE
                [127] => Communs TBE
                [128] => Hôtel TBE
                [129] => Travaux
            )
     
        [description] => Array
            (
                [126] => blablabla
                [127] => blablabla
                [128] => blablabla
                [129] => blablabla.
            )
     
        [id_local] => Array
            (
                [0] => 126
                [1] => 127
                [2] => 128
                [3] => 129
            )
     
    )

    L'option default dans le filtre est la valeur retourné quand le filtre correspondant échoue.
    Je l'ai appliqué seulement sur le filtre de la clé ordre, tu peux le faire aussi sur les autres filtres en retournant une chaine vide quand le filtre échoue.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Bonjour Toufik83 et merci de ton aide,

    J'ai un "Warning: Invalid argument supplied for foreach()" qui correspond à la ligne 4 dans la fonction / foreach($value as &$v).

    Pour ton information, je débute juste avec les filtres et j'essaie d'adapter les nouveautés PHP7 à un (très) vieux code.
    Je me suis servi de ce tuto. https://pub.phyks.me/sdz/sdz/les-fil...ilisateur.html
    La difficulté que je rencontre porte sur une séquence:
    J'affiche les données issues d'une table id_local[], ordre[], titre[] et description[] et les postent via un formulaire.
    En reprenant le tuto cité plus haut, j'essaie de boucler avec l'id_local pour obtenir les "options".(aucune difficulté avec les $_POST['valeur'] "simples")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (isset($_POST['id_local']) && is_array($_POST['id_local'])) :
    			$tableau=array();
    			foreach($_POST['id_local'] as $cle=>$id):
    				$options['ordre['.$id.']'] = array('filter' => FILTER_VALIDATE_INT, 'options' => array('min_range' => 0 )) ; 				
    				$options['titre['.$id.']'] = FILTER_SANITIZE_STRING ;				
    				$options['description['.$id.']'] = FILTER_SANITIZE_STRING ;	
    			endforeach;
    		endif;
    C'est ce tableau $options que je filtre ensuite $resultat = filter_input_array(INPUT_POST, $options);

    concernant les résutats,
    j'obtiens 1 si je fais echo $_POST[ordre][126] ce qui est normal
    Par contre ma valeur $resultat vaut NULL pour [ordre126] donc après le filtrage, par contre aucune erreur n'est levée.Je pense donc que je ne filtre pas la bonne valeur quand j'écris
    $options['ordre['.$id.']']=....
    Le var_dump ($ options) renvoit
    ["ordre[126]"]=> array(2) { ["filter"]=>int(257) ["options"]=> array(1) { ["min_range"]=> int(0)} }
    et celui de $resultat
    ["ordre[126]"]=>NULL
    Donc à priori je passe dans le filtre une mauvaise valeur car ordre[126] vaut 1.

    bref, j'y suis depuis un moment ...

  11. #11
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 453
    Points : 4 978
    Points
    4 978
    Par défaut
    Bonjour,

    Citation Envoyé par jmtrivia Voir le message
    Le var_dump ($ options) renvoit
    ["ordre[126]"]=> array(2) { ["filter"]=>int(257)}
    1-Justement, c'est la raison pour laquelle que j'ai remplacé filter_input_array par filter_var, car la première renvoi la somme de (128+129=257, que j'ai mis en gras plut haut) alors qu'on devrait avoir 126, et donc c'est erroné.

    2-Pour l'avertissement, il faut simplement que $value soit un tableau, tu peux donc vérifier son type avant de le parcourir et ne filtrer que les colonnes importantes "ordre","titre","id_local","description" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function filter(array &$array){
        array_walk($array, function (&$value,&$key) {
    		if(is_array($value) && in_array($key,["ordre","titre","id_local","description"]))
    		foreach($value as &$v){
    			$v=filter_var(trim($v), $key=="ordre"?FILTER_VALIDATE_INT:FILTER_SANITIZE_STRING,$key=='ordre'?["options"=>array('min_range' => 0 ,'default' => 0)]:[]);
    		}
        });
        return $array;
    }

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut
    Merci toufik83,
    Je n'avais pas remarqué le '257' et il faudra que je creuse pour comprendre pourquoi, mais c'est une autre histoire.
    Effectivement ta solution fonctionne.
    et donc, voilà le code modifié.
    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
     
    ...// je filtre tous les champs 'simples' puis
    $resultat = filter_input_array(INPUT_POST, $options);	
    		function filter(array &$array)
    		{
    		    array_walk($array, function (&$value,&$key) {
    				if(is_array($value) && in_array($key,["ordre","titre","id_local","description"]))
    				foreach($value as &$v){
    					$v=filter_var(trim($v), $key=="ordre"?FILTER_VALIDATE_INT:FILTER_SANITIZE_STRING,$key=='ordre'?["options"=>array('min_range' => 0 ,'default' => 0)]:[]);
    				}
    		    });
    		    return $array;
    		}
    		$resultat[]=filter($_POST['ordre']);
    		$resultat[]=filter($_POST['titre']);
    		$resultat[]=filter($_POST['id_local']);
    		$resultat[]=filter($_POST['description']);
    ....
    Var_dump($resultat); renvoit bien le tableau des valeurs filtrées souhaitées.
    Donc encore merci à toi.

  13. #13
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 453
    Points : 4 978
    Points
    4 978
    Par défaut
    Bonjour,

    Sauf qu'il faudrait supprimer $resultat = filter_input_array(INPUT_POST, $options); et appeler la fonction filter une seule fois et pas 4, car array_walk parcourt tout le tableau $_POST.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resultat=filter($_POST);

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

Discussions similaires

  1. Récupération des valeurs d'input dans iframe par $_POST
    Par corentinparent dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 26/11/2010, 19h43
  2. Mauvaise récupération des valeurs avec $_POST
    Par Trebor_ dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2008, 11h33
  3. Récupération de valeurs de Formulaire via $_POST
    Par GarGamel55 dans le forum Langage
    Réponses: 5
    Dernier message: 10/10/2005, 09h38
  4. récupération de valeur de lien
    Par sex-sansbol dans le forum ASP
    Réponses: 3
    Dernier message: 07/06/2004, 11h43
  5. Récupération de valeurs d'un tableau
    Par leeloo076 dans le forum ASP
    Réponses: 12
    Dernier message: 25/03/2004, 11h59

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