Php 警告:输入变量超过1000

Php 警告:输入变量超过1000,php,json,Php,Json,我正在用PHP构建一个类似REST的服务,它应该接受一个大的JSON帖子作为主数据(我发送和读取的数据与这里讨论的非常相似:) 问题是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>

我正在用PHP构建一个类似REST的服务,它应该接受一个大的JSON帖子作为主数据(我发送和读取的数据与这里讨论的非常相似:)

问题是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 />
警告:未知:输入变量超过1000。要增加限制,请更改php.ini中的max_input_vars。在第0行的未知位置
是否有任何方法可以让PHP不计算输入变量(或者我是否应该跳过启动警告)?

根据
PHP中的
max\u input\u vars
。ini
角色是:

可以接受多少输入变量(限制应用于
$\u GET
$\u POST
$\u COOKIE
分别为超全局)。本指令的使用 减少使用哈希的拒绝服务攻击的可能性 碰撞。如果输入变量多于此参数指定的值 指令,发出
E_警告
,并进一步输入变量 从请求中截断。此限制仅适用于每个嵌套 多维输入数组的级别


您只需在
php.ini

中为
max\u-input\u-vars
指定更大的数字,在php.ini中更改max\u-input\u-vars对我来说不起作用

使用.htaccess文件更改最大输入变量正在工作

如果要使用.htaccess文件更改“max_input_vars”,请转到C:\xampp\apache\conf\httpd.conf文件(在xampp中),在.htaccess文件中添加以下代码


php\u value max\u input\u vars 10000

Realy,使用
更改
max\u input\u vars
。htaccess
文件正在工作,但您需要重新启动Apache服务

遵循完整的流程:

  • 转到
    C:\xampp\apache\conf\httpd.conf
  • 打开文件
    httpd.conf
  • 在文件中查找
    xampp/htdocs
  • 稍微低一点,您可能会看到这样一行:
    AllowOverride
  • 如果此行在
    AllowOverride
    之前显示
    ,请删除
  • AllowOverride
    insert
    php\u value max\u input\u vars 10000后的下一行
  • 保存文件并关闭
  • 最后停止Apache并重新启动(它将在重新启动Apache之后工作)

  • 有些问题,您不需要1000个变量。重新编码您的程序以接受1个带1000个键的变量数组。这是一个错误,用于警告您没有按照建议的方式做事。不要以任何方式禁用、扩展或隐藏它。

    我发现在PHP中直接处理json数据的正确方法(通过
    file\u get\u contents('php://input“)
    )是确保请求设置了正确的内容类型,即HTTP请求头中的
    内容类型:application/json

    在我的例子中,我使用curl从php请求页面,并将其添加到以下代码中:

    函数curl\u post($url,数组$post=NULL,数组$options=array()){
    $defaults=数组(
    CURLOPT_POST=>1,
    CURLOPT_头=>0,
    CURLOPT_URL=>$URL,
    CURLOPT_FRESH_CONNECT=>1,
    CURLOPT_RETURNTRANSFER=>1,
    CULLOPT_禁止重复使用=>1,
    CULLOPT_超时=>600
    );
    如果(!为空($post))
    $defaults['CURLOPT\u POSTFIELDS']=http\u build\u query($post);
    $ch=curl_init();
    curl_setopt_数组($ch,($options+$defaults));
    if($result=curl\u exec($ch))==false){
    抛出新异常(curl_error($ch)。“\n$url”);
    }
    if(curl\u getinfo($ch,CURLINFO\u HTTP\u代码)!=200){
    抛出新异常(“卷曲错误:”。
    curl_getinfo($ch,CURLINFO_HTTP_代码)。“\n”。$result。”\n”);
    }
    卷曲关闭($ch);
    返回$result;
    }
    $curl\u result=curl\u post(URL,NULL,
    数组(CURLOPT_HTTPHEADER=>array('Content-Type:application/json'),
    CURLOPT_POSTFIELDS=>json_encode($out))
    );
    
    请注意
    CURLOPT_HTTPHEADER=>array('Content-Type:application/json')
    部分

    在接收端,我使用以下代码:

    $rawData=file\u get\u contents('php://input');
    $postedJson=json_decode($rawData,true);
    if(json\u last\u error()!=json\u error\u NONE){
    错误日志('Last JSON error:'。JSON\u Last\u error()。
    json_last_error_msg().PHP_EOL.PHP_EOL,0);
    }
    
    不要更改
    max\u input\u vars
    变量。
    由于更改了设置右标题的请求,我的
    max\u input\u vars
    问题消失了。显然,PHP不会在设置了某些
    内容类型的情况下对post变量进行求值。

    更改此设置

    ; max_input_vars = 1000
    
    对此

    max_input_vars = 3000
    
    php.ini文件中的注释行是

    ;
    

    我认为大多数情况下,没有必要增加
    max\u input\u vars
    size

    但是要优化您的代码

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

    因此,我所做的是根据db结果对数组进行字符串化

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

    <?php $totalResults = json_decode($_POST['totalResults']); ?>
    
    
    
    所以我又得到了原始数组

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

    我可以接受PHP有这样的限制;这是有道理的。我不能接受的是(这是使我很难认真对待PHP作为编程语言的众多原因之一),处理只会继续处理被截断的数据,可能会用不完整的数据覆盖好的数据。是的,在保存数据之前,应该对数据进行额外验证。但这种行为只是在自找麻烦

    也就是说,我实施了以下措施以防止这种情况再次发生:

    $limit = (int)ini_get('max_input_vars');
    if (count($_GET) >= $limit) {
        throw new Exception('$_GET is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
    }
    if (count($_POST) >= $limit) {
        throw new Exception('$_POST is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
    }
    if (count($_COOKIE) >= $limit) {
        throw new Exception('$_COOKIE is likely to be truncated by max_input_vars (' . $limit . '), refusing to continue');
    }
    
    请注意,截断不一定发生在限制处。我的限制被设置为de
    curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_INFILE, ($fp = fopen("filename.txt", "r")));
    fclose($fp);