web-dev-qa-db-fra.com

Avertissement: les variables d'entrée ont dépassé 1000

Je crée un service semblable à RESTS dans PHP qui devrait accepter une publication JSON volumineuse en tant que données principales (j'envoie et lis les données de la manière décrite ci-dessous: http://forums.laravel.io/viewtopic. php? id = 900 )

Le problème est que PHP me donne l'avertissement suivant:

<b>Warning</b>:  Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in <b>Unknown</b> on line <b>0</b><br />

Existe-t-il un moyen d’obtenir que PHP ne compte pas les variables d’entrée (ou devrais-je simplement surpresser les avertissements de démarrage)?

12

J'ai découvert que la bonne façon de gérer les données JSON directement dans PHP (via file_get_contents('php://input')) est de s'assurer que la demande définit le bon type de contenu, à savoir Content-type: application/json dans l'en-tête de la requête HTTP.

Dans mon cas, je demande des pages de php en utilisant curl avec ce code:

function curl_post($url, array $post = NULL, array $options = array()) {
  $defaults = array(
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 0,
    CURLOPT_URL => $url,
    CURLOPT_FRESH_CONNECT => 1,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FORBID_REUSE => 1,
    CURLOPT_TIMEOUT => 600
  );
  if(!is_null($post))
    $defaults['CURLOPT_POSTFIELDS'] = http_build_query($post);
  $ch = curl_init();
  curl_setopt_array($ch, ($options + $defaults));
  if(($result = curl_exec($ch)) === false) {
    throw new Exception(curl_error($ch) . "\n $url");
  }
  if(curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) {
    throw new Exception("Curl error: ". 
      curl_getinfo($ch, CURLINFO_HTTP_CODE) ."\n".$result . "\n");
  }
  curl_close($ch);
  return $result;
}

$curl_result = curl_post(URL, NULL,
    array(CURLOPT_HTTPHEADER => array('Content-Type: application/json'),
      CURLOPT_POSTFIELDS => json_encode($out))
    );

Notez la partie CURLOPT_HTTPHEADER => array('Content-Type: application/json').

Du côté de la réception, j'utilise le code suivant:

$rawData = file_get_contents('php://input');
$postedJson = json_decode($rawData,true);
if(json_last_error() != JSON_ERROR_NONE) {
  error_log('Last JSON error: '. json_last_error(). 
    json_last_error_msg() . PHP_EOL. PHP_EOL,0);
}

Ne changez pas la variable max_input_vars. Depuis que la demande de définition des en-têtes de droite a été modifiée, mon problème avec max_input_vars est parti. Apparemment, PHP n'évalue pas les variables de publication avec un certain Content-type défini.

10
Fredrik Erlandsson

Quelque chose ne va pas, vous n'avez pas besoin de 1000 variables. Recodez votre programme pour accepter 1 tableau de variables avec 1000 clés. Cette erreur est là pour vous avertir que vous ne faites pas les choses de la manière recommandée. Ne le désactivez pas, ne le prolongez pas et ne le cachez pas.

11
chugadie

Selon manuel phpmax_input_vars dans php.ini le rôle est:

Nombre de variables d'entrée pouvant être acceptées (la limite s'applique à $_GET, $_POST et $_COOKIE superglobal séparément). Utilisation de cette directive atténue la possibilité d'attaques par déni de service utilisant de la table de hachage les collisions. S'il y a plus de variables d'entrée que celles spécifiées par ceci directive, un E_WARNING est émis et les autres variables d’entrée sont tronqué de la demande. Cette limite s'applique uniquement à chaque imbrication niveau d'un tableau d'entrée multidimensionnel.

Vous devez simplement attribuer un plus grand nombre à max_input_vars dans votre php.ini.

5
Mateusz

Réellement, changer max_input_vars en utilisant .htaccess fonctionne mais vous devez redémarrer le service Apache.

Suivez le processus complet:

  1. Aller au C:\xampp\Apache\conf\httpd.conf
  2. Ouvrir le fichier httpd.conf
  3. Dans le fichier, cherchez xampp/htdocs
  4. Un peu plus bas, vous pouvez voir une ligne comme celle-ci: AllowOverride
  5. Si cette ligne affiche # avant AllowOverride, supprimez le #
  6. Ligne suivante après AllowOverride insérer php_value max_input_vars 10000
  7. Enregistrez le fichier et fermez
  8. Enfin, arrêtez Apache et redémarrez (Cela fonctionnera juste après redémarrer Apache)
3
Marco

Change ça

; max_input_vars = 1000

Pour ça

max_input_vars = 3000

La ligne de commentaire dans le fichier php.ini est

;
2
Faridul Khan

Changer max_input_vars dans php.ini n'a pas fonctionné pour moi 

Changer max_input_vars à l'aide du fichier .htaccess fonctionne.

Si vous souhaitez modifier les “max_input_vars” à l'aide du fichier .htaccess, accédez au fichier C:\xampp\Apache\conf\httpd.conf (dans xampp), ajoutez le code suivant dans votre fichier .htaccess.

valeur_php max_input_vars 10000

1
Dasun Lahiru

Je pense que la plupart du temps, il n'est pas nécessaire d'augmenter la taille de max_input_vars,

mais pour optimiser votre code

j'avais fait face à ce problème en obtenant tous les résultats d'une requête ajax et en envoyant les résultats à une autre requête ajax.

Donc, ce que j'ai fait est stringified le tableau à partir des résultats de la base de données, 

JSON.stringify(totalResults);

en javascript JSON.stringifyconvertir un tableau en chaîne, donc après la conversion, j’envoie cette chaîne à une autre demande et décodé cette chaîne en tableau à nouveau en utilisant json_decode dans php,

<?php $totalResults = json_decode($_POST['totalResults']); ?>

donc j'ai à nouveau ce tableau d'origine,

j'espère que cela peut aider quelqu'un alors je l'ai partagé, merci. 

0
Haritsinh Gohil