Tout savoir pour devenir un pro de PluXml, mais pas seulement...

Problème de formulaires avec max_input_vars (PHP 5.3.9+)


Rédigé par jack le 8 commentairese

Depuis la version de PHP 5.3.9 une nouvelle directive dans le fichier php.ini limite le nombre de champs de saisie traité après la soumission d'un formulaire. Cette directive s'appelle max_input_vars. Par défaut seuls les 1000 champs sont traités, les suivants sont tout simplement ignorés. Elle affecte les variables $_GET, $_POST et $_COOKIE.

Concrètement cela veut dire que si vous avez un grand formulaire qui contient plus de 1000 champs (champ texte, checkbox, hidden, etc...), lorsque vous allez traiter les variables $_POST après la soumission du formulaire, seuls les 1000 premières variables $_POST seront accessibles, les autres ne seront pas présentes dans le tableau $_POST.

Voilà donc une restriction, qui pour des raisons de sécurité est justifée afin d'éviter des attaques par déni de service, mais qui sera vite un gros problème si vous avez à traiter des gros formulaires.

Il y a trois solutions pour passer outre cette restriction.

Solution 1
Si vous avez accès au fichier php.ini sur votre serveur, éditez le et recherchez le paramètre max_input_vars. Changez sa valeur 1000 par une plus grande en fonction de vos besoins, pour avoir par exemple:

max_input_vars = 3000

Solution 2
Si vous n'avez pas accès au php.ini, il reste la solution du fichier .htaccess.
A la racine de votre site éditez ou créez un fichier .htaccess dans lequel vous mettrez sur la 1ère ligne l'instruction suivante:

php_value max_input_vars 3000

Solution 3
Dernière solution: utiliser l'instruction init_set dans un fichier php pour modifier la valeur du paramètre max_input_vars de cette façon:

ini_set('max_input_vars', 3000);

DClassé dans : Programmation ,Mots clés : PHP

A propos de l'auteur, jack:

Webmestre de PluXopolis de 2018 à Avril 2023.

8 commentaires

MaitrePylos a dit : #1

Comme je passais par là :)

Le plus simple est de passer par PHP directement, le langage dispose de fonction pour modifier en ligne directement.

Dans votre header.php en première ligne

ini_set('php_value max_input_vars',3000);

Voici la doc : http://php.net/manual/fr/function.ini-set.php

La solution de .htaccess demande à Apache de modifier un comportement PHP (il y a donc un intermédiaire de plus).

De plus la solution du ini_set() fonctionnera quelque soit le serveur Web : nginx,IIS,Cheroke .........

Stéphane a dit : #2

@MaitrePylos :
Effectivement il y a aussi cette solution à laquelle je n'avais pas pensé. Article mis à jour. Merci.

phpman a dit : #3

Bonjour,

Il me semble que la solution 3 n'est pas correcte mais c'est à vérifier car :

1. La syntaxe serait plutôt ini_set('max_input_vars', 3000);
2. Cette directive ne peut à priori pas être redéfinie par script : http://us1.php.net/manual/fr/configuration.changes.modes.php

Stéphane a dit : #4

@phpman :
Effectivement la bonne syntaxe est: ini_set('max_input_vars', 3000);
C'est corrigé. Merci

leo04 a dit : #5

Bonjour !
J'ai lu vos com's et je suis intéressé mais où dois-je placer ce code "ini_set('php_value max_input_vars',3000);" dans mon fichier header.php ?

Voici le code de mon header:

if (isset(Context::getContext()->controller))
$controller = Context::getContext()->controller;
else
{
$controller = new FrontController();
$controller->init();
$controller->setMedia();
}
Tools::displayFileAsDeprecated();
$controller->displayHeader();

admin a dit : #6

@leo04 :
Bonjour. Mettez la ligne tout au début du fichier, avant la première balise <?php

<?php ini_set('php_value max_input_vars',3000); ?>

leo04 a dit : #7

Merci, j'ai pu le régler autrement. Cette démarche n'a pas aboutie, j'ai dû créer un fichier php.ini puis j'ai inséré le code.

yannt a dit : #8

bonjour j'ai le même problème tu a créé le fichier ou ?

rFil RSS des commentaires de cet article

Les commentaires sont fermés.

Top