警告:输入变量超过1000

Fre*_*son 13 php json

我正在构建一个像PHP一样的RESTS服务,它应该接受一个大的JSON帖子作为主要数据(我发送和读取的数据很像这里讨论的那样:http://forums.laravel.io/viewtopic.php?id = 900 )

问题是PHP给了我以下警告:

<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 />
Run Code Online (Sandbox Code Playgroud)

有没有办法让PHP不计算输入变量(或者我应该只是压制启动警告)?

chu*_*die 15

出了点问题,你不需要1000个变量.重新编程您的程序以接受1个具有1000个键的变量数组.这是错误是警告你,你没有按照推荐的方式做事.请勿以任何方式禁用,扩展或隐藏它.

  • 这是不正确的。我有 2 个变量,每个变量有 500 个键,这会触发错误 (3认同)
  • 我现在使用 JavaScript 将文本框表格转换为 JSON 数组,然后将其作为单个变量在 POST 中传递。在 PHP 中,我将其解码为我需要的关联数组。工作完美,只需 1 个变量,而不是 1,820 个变量 `:)` (2认同)

Far*_*han 15

改变这个

; max_input_vars = 1000
Run Code Online (Sandbox Code Playgroud)

对此

max_input_vars = 3000
Run Code Online (Sandbox Code Playgroud)

php.ini文件中的注释行是

;
Run Code Online (Sandbox Code Playgroud)


Fre*_*son 10

我发现直接在PHP(via file_get_contents('php://input'))中处理json数据的正确方法是确保请求设置正确的内容类型,即Content-type: application/json在HTTP请求头中.

在我的情况下,我正在使用curl从这个代码请求php的页面:

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))
    );
Run Code Online (Sandbox Code Playgroud)

请注意CURLOPT_HTTPHEADER => array('Content-Type: application/json')部分.

在接收方我使用以下代码:

$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);
}
Run Code Online (Sandbox Code Playgroud)

不要更改max_input_vars变量.由于更改请求以设置正确的标题,我的问题max_input_vars就消失了.显然没有PHP评估post变量,Content-type并设置了某些变量.


Har*_*hil 7

我认为大多数时候没有必要增加max_input_vars大小

但要优化您的代码

从一个ajax请求中获取所有结果并将该结果发送到另一个ajax请求时,我遇到了这个问题。

所以我所做的是从数据库结果中字符串化数组

JSON.stringify(totalResults);
Run Code Online (Sandbox Code Playgroud)

在javascript中将JSON.stringify 数组转换为字符串,因此在转换后我将该字符串发送到另一个请求并再次使用json_decodephp将该字符串解码为数组

<?php $totalResults = json_decode($_POST['totalResults']); ?>
Run Code Online (Sandbox Code Playgroud)

所以我又得到了那个原始数组,

我希望这可以帮助某人,所以我分享了它,谢谢。

  • 是的,这正是我的情况。我可以轻松地将 max_input_vars 更改为更大的数字。但我怎么知道对于我无法控制的数据集大小来说,更大的数字是最大的呢?所以这些转换就是我现在所做的。现在我只需要担心 post_max_size .... (2认同)

小智 6

确实,max_input_vars使用.htaccess文件进行更改是有效的,但您需要重新启动 Apache 服务。

请遵循完整流程:

  1. C:\xampp\apache\conf\httpd.conf
  2. 打开文件httpd.conf
  3. 在文件中查找xampp/htdocs
  4. 再低一点,您可能会看到这样的一行:AllowOverride
  5. 如果删除#之前显示此行AllowOverride#
  6. AllowOverride插入后下一行php_value max_input_vars 10000
  7. 保存文件并关闭
  8. 最后停止 Apache 并重新启动(重新启动 Apache 后即可工作)


Mat*_*usz 5

根据php手册 max_input_varsphp.ini作用是:

多少输入变量可以被接受(限制被施加到$_GET, $_POST$_COOKIE超全局分开).使用此指令可以减少使用哈希冲突的拒绝服务攻击的可能性.如果输入变量多于此指令指定的输入变量,E_WARNING则会发出a,并从请求中截断其他输入变量.此限制仅适用于多维输入数组的每个嵌套级别.

你只需要将更多的数字归因max_input_vars于你的数字php.ini.