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 :

Appliquer un filter_input sur un tableau de champs de formulaire


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Appliquer un filter_input sur un tableau de champs de formulaire
    Bonjour,
    J'ai un formulaire avec un ou plusieurs groupes de données identiques (rarement voire jamais plus de trois) comme ceci:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <input type="text" name= "valeur1[0]" />
    <input type="text" name= "valeur2[0]" />
    <input type="text" name= "valeur1[1]" />
    <input type="text" name= "valeur2[1]" />
    <input type="text" name= "valeur1[2]" />
    <input type="text" name= "valeur2[2]" />

    Je voudrais appliquer un filter_input sur chaque champ. J'ai fait ceci:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ( is_string($postValue) ) {
    	$toSave[$postName] = filter_input(INPUT_POST, $postName, FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>1]]);
    }
    if ( is_array($postValue) ) {
    	foreach ($postValue as $key=>$item) {
    		var_dump($key, $item);
    		$toSave[$postName][$key] = filter_input(INPUT_POST, $postName, FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>1]]);
    		$item = filter_input(INPUT_POST, $postName, FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>1]]);
    		var_dump($item);
    	}
    }
    Malheureusement, j'obtiens toujours la valeur par défaut.
    Les lignes 7 et 8 font double emploi et correspondent à deux essais différents.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu te donnes beaucoup de mal pour pas grand chose...
    • Un simple intval() suffit largement.
    • Sur un array, utiliser array_map (comme je te l'ai déjà montré)


    N'imagine pas que tu vas sécuriser ton code, alors que tu ne maitrises pas les fonctions que tu utilises...
    Dernière modification par Invité ; 03/09/2018 à 10h50.

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Sinon, pour faire avaler un tableau de champs aux fonctions filter_xxxx, il existe les flags FILTER_FORCE_ARRAY et FILTER_REQUIRE_ARRAY.
    FILTER_REQUIRE_ARRAY Oblige la valeur à être un tableau.
    FILTER_FORCE_ARRAY Si la valeur est un scalaire, elle sera traitée comme un tableau avec les valeurs scalaires comme seul élément.
    http://php.net/manual/fr/filter.filters.flags.php

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $champs = filter_input(
                INPUT_POST, 
                'champ', 
                FILTER_VALIDATE_INT, 
                [
                    'options'=>['default'=>0, 'min_range'=>1], 
                    'flags' => FILTER_FORCE_ARRAY
                ]);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Je me rends compte que mon formulaire est trop compliqué: Il fait trop de choses. Je vais le scinder en plusieurs parties ce qui m'évitera de me prendre la tête inutilement et de vous déranger tout aussi inutilement.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ce qu'on ne comprend pas, c'est pourquoi tu fais un FILTER_VALIDATE_INT sur des <input type="text"> ?

    Mets des <input type="number">, dans ce cas !

  6. #6
    Invité
    Invité(e)
    Par défaut
    1- Tiens, voilà une petite fonction que j'utilise :
    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
    <?php
    // --------------------------------------------------------------
    // FONCTION : RECUPERATION des données d'un FORMULAIRE : POST
    // --------------------------------------------------------------
    function recup_POST( $name, $key='STR', $else='' )
    {
    	$post				= '';
    	switch( $key )
    	{
    		case 'INT': // integer
    			$post		= (isset($_POST[$name]))? 	intval($_POST[$name]) 					: $else;
    			break;
    		case 'DEC': // decimal
    			$post		= (isset($_POST[$name]))? 	floatval($_POST[$name]) 				: $else;
    			break;
    		case 'STR': // string
    			$post		= (isset($_POST[$name]))? 	formatage_from_post($_POST[$name]) 		: $else;
    			break;
    		case 'TXT': // textarea
    			$post		= (isset($_POST[$name]))? 	formatage_from_textarea($_POST[$name]) 	: $else;
    			break;
    		case 'ARR': // array
    			$post		= (isset($_POST[$name]))? 	$_POST[$name] 							: $else;
    			break;
    	}
    	// -------------
    	return $post;
    };
    Utilisation (exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    	// -----------------------------------------
    	// 1- RECUPERATION DES DONNEES DU FORMULAIRE
    	// -----------------------------------------
    	$articleId 		= recup_POST( 'articleId', 'INT', 	0 );	// INT
    	// -----------------
    	$artTitre		= recup_POST( 'artTitre', 'STR', '' );	// text
    	$artContenu		= recup_POST( 'artContenu', 'TXT', 	'' );	// textarea
    	// -----------------
    	$artPrix		= recup_POST( 'artPrix', 'DEC', '' );	// FLOAT
    	// -----------------
    3- Sur le même modèle, j'ai aussi écrit les fonctions recup_GET() et recup_POST_sinon_GET().
    Je te laisse les ré-écrire


    3- Les 2 autres fonctions sont (à ADAPTER à tes besoins) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    // --------------------------------------------------------------
    // FONCTION : FORMATAGE des données récupérées d'un FORMULAIRE
    // --------------------------------------------------------------
    function formatage_from_post( $chaine )
    {
    	$chaine				= html_entity_decode( $chaine, ENT_QUOTES, 'UTF-8' ); 		// Convertit les entités HTML spéciales en caractères
    	$chaine 			= htmlspecialchars( trim( $chaine ), ENT_NOQUOTES, 'UTF-8' );
    	$chaine 			= str_replace( ['&amp;amp;','&amp;#'], ['&amp;','&#'], $chaine ); 	// & - &#
    	// -------------
    	return $chaine;
    };
    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
    <?php
    // --------------------------------------------------------------
    //  FONCTION : PROTECTION contre les failles XSS dans le html des TEXTAREA (EDITEUR WYSIWYG)
    // --------------------------------------------------------------
    function formatage_from_textarea( $chaine )
    {
    	// -----------------
    	// remplacement : 	&nbsp; -> espaces / passages à la ligne (CKeditor)
    	$chaine				= str_replace(array('&nbsp;', '\r\n	', '\r\n ', '\r\n'), array(' ', '', '', ''), $chaine);
    	// remplacement : 	CHEMIN RELATIF -> CHEMIN ABSOLU
    	$chaine				= str_replace('="/', '="'.SITE_URL_HTTP, $chaine);
    	// -----------------
    	$chaine				= html_entity_decode($chaine, ENT_QUOTES, 'UTF-8'); 		// Convertit les entités HTML spéciales en caractères
    	// -----------------
    	// balises qui seront conservees
    	// (ajoutez ou supprimez des balises a votre convenance)
    	$allowable_tags  	= '<abbr><acronym><a><b><br><blockquote><cite><code><dl><dt><dd>';
    	$allowable_tags 	.= '<em><i><b><strong><small><pre><u><ul><ol><li><s><sup><sub><ins>';
    	$allowable_tags 	.= '<div><img><h1><h2><h3><h4><h5><h6><hr><p><span>';							// titres
    	$allowable_tags 	.= '<table><caption><legend><thead><tfoot><tbody><tr><th><td><colgroup><col>';	// tableau
    	$allowable_tags 	.= '<audio><video><object><param><embed>';										// audio/video
    	$allowable_tags 	.= '<form><fieldset><input><select><label><button>';							// formulaire
    	// -----------------
    	// SPECIAL ADMIN : on autorise les iframe,...
    	if ( strpos(' '.$_SERVER['REQUEST_URI'],'/'.REP_ADMIN) )  // ADMIN UNIQUEMENT
    	{
    	  $allowable_tags 	.= '<iframe>';							// iframe
    	}
    	// -----------------
    	$chaine				= strip_tags($chaine, $allowable_tags);
    	// -----------------
    	return $chaine;
    };
    N.B. Je ne dis pas que ces fonctions sont le summum de la sécurité.
    Mais jusqu'ici, je n'ai jamais eu le moindre souci.

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

Discussions similaires

  1. [LibreOffice][Tableur] MACRO : appliquer une macro sur un tableau
    Par controle2gestion.net dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 29/08/2018, 11h00
  2. Appliquer une formule sur un tableau dynamique
    Par Patoche07 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/11/2015, 16h08
  3. Réponses: 1
    Dernier message: 10/03/2013, 01h27
  4. [AC-2007] Enregistrement auto sur modification d'un champ de formulaire
    Par Lireas dans le forum IHM
    Réponses: 2
    Dernier message: 17/05/2010, 11h16
  5. Appliquer un style sur un tableau d'éléments
    Par Arnaud F. dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/07/2009, 10h29

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