Php 警告:输入变量超过1000
我正在用PHP构建一个类似REST的服务,它应该接受一个大的JSON帖子作为主数据(我发送和读取的数据与这里讨论的非常相似:) 问题是PHP给了我以下警告: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>
<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 10000Realy,使用
更改max\u input\u vars
。htaccess
文件正在工作,但您需要重新启动Apache服务
遵循完整的流程:
C:\xampp\apache\conf\httpd.conf
httpd.conf
xampp/htdocs
AllowOverride
AllowOverride
之前显示
,请删除
AllowOverride
insertphp\u value max\u input\u vars 10000后的下一行
有些问题,您不需要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);
在javascriptJSON.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);