传递的数组只保留了第一个元素。

8

我有一个奇怪的问题。最近我把我的应用从本地xampp安装迁移到了SUSE Enterprise Server 11,一切都正常,但有一件事情让我很疯狂,无法找到解决办法。

当使用以下语法通过GET或POST传递数组时:

search_dggs.php?latmin[]=52.447529&latmin[]=22&lonmin=17.56&lonmax=22.16

我只得到了latmin的第一个元素。请注意,这只是在需要传递数组的其他地方出现错误后我尝试的一个简单示例。
print_r($_SERVER["QUERY_STRING"]); 

输出

latmin[]=52.447529&latmin[]=22&lonmin=17.56&lonmax=22.16

但是
print_r($_GET);

提供

Array
(
    [latmin] => Array
        (
            [0] => 52.447529
        )

    [lonmin] => 17.56
    [lonmax] => 22.16
)

所有的POST请求都会发生完全相同的情况。

我使用的是 PHP 版本 5.3.8。 我猜问题在于服务器配置,但我找不到关于这个问题的任何信息。

回应评论:

如果我提交任意数量的变量,也会发生相同的情况。

parse_str($_SERVER["QUERY_STRING"]);
print_r($latmin);

提供

Array
(
    [0] => 52.447529
)

php.ini文件可以在这里找到。

你可以在这里看到该行为的实际效果。

此php文件的源文件为:

<?php

    $test="latmin[]=52.447529&latmin[]=22&lonmin=23&lonmax=22.16";
    parse_str($test);
    print_r($latmin);
    phpinfo();

?>

2
你能检查一下你的URL是否使用了&而不是&吗? - web-nomad
print_r(parse_str($_SERVER["QUERY_STRING"])); 给你什么结果? - Yada
2
你的代码在我的服务器上运行良好。也许这是“register_globals”问题?你能在这里发布你的php.ini配置吗? - s.webbandit
@Incognito 我上面发布了一个示例,以及链接。 - cpaulik
这是因为我测试了parse_str方法,它应该打印一个包含2个元素的数组,但实际上没有。传递的变量包含在phpinfo()的末尾;但也许这不是很清楚。 - cpaulik
显示剩余8条评论
6个回答

5

系统管理员进行了系统更新和重启,问题现在已经解决。没有更改任何配置文件。


系统更新有时会包括PHP更新和各种其他好东西。你可能永远不知道是什么修复了它! - citizenen
配置在我看来也很不错。你可能运行的是有缺陷的 PHP 版本。 - hakre

4

在我的服务器上测试过,对我来说运行良好:

_GET["latmin"]  

Array
(
    [0] => 52.447529
    [1] => 22
)

在 Data Handling 部分查看您的 php.ini 文件,并查看值是什么。将所有内容重置为默认值,重新启动 Web 服务器,然后再尝试。PHP.ini 数据处理默认值

是的,我知道代码是正确的,并且在我的本地XAMPP安装上也可以运行,但在新服务器上却不行。如果我找不到解决方案,我将重新安装并希望这种行为会消失,但知道类似这样的事情如何发生会很好。奇怪的是,parse_str也给出了错误的输出。我的php.ini已发布在上面,我在数据处理部分没有注意到任何异常。 - cpaulik
我们可以排除php.ini的问题,因为我已经使用了您的确切php.ini并获得了正确的结果(在数组中有2个latmins)。运行phpinfo(); 并将您的get参数传递到页面,并告诉我底部_GET部分显示的内容。 - gspatel

2

An example at the link prints Array ( [0] => 52.447529 ) every time even no variables were passed. So, seems that you have problem in code that is not linked with this code: `

$test="latmin[]=52.447529&latmin[]=22&lonmin=23&lonmax=22.16";
parse_str($test);
print_r($latmin);
phpinfo();

`


这是因为我测试了parse_str方法,它应该打印一个包含2个元素的数组,但实际上没有。传递的变量包含在phpinfo()的末尾;但也许这不是很清楚。 - cpaulik

0
这个错误最可能的原因是有人在php.ini中将"max_input_vars"设置为0或1。 "max_input_vars"默认值为1000,并且可以在php.ini中进行覆盖。
我最近遇到了同样的行为,但原因不同 -- 一个安全补丁被反向移植到了PHP 5.2安装中,部分实现了"max_input_vars",但忽略了一些重要内容。不同的原因,相同的结果。
相关的php源代码可以在main/php_variables.c中找到。在php 5.3.8中,橡胶与路面摩擦发生在php_register_variable_ex函数中。
当解析"foo=bar&asdf[]=1&asdf[]=2"等字符串时,有一个名为SAPI "treat_data"的钩子,php使用它--不同的SAPI可能具有自己的实现方式。

0

嗯...也许与那个关键漏洞有关?你的XAMPP是否与生产环境具有相同的PHP版本?如果你发布了太多数据(无论是文件/帖子大小还是参数数量),可能会出现类似的问题。升级到5.3.10怎么样?


嗨,是的,我的本地安装版本与SUSE企业服务器上无法运行的版本相同。因此,我不认为它是特定于版本的,而是一些奇怪的配置问题。如果我找不到解决方案,我将很快升级或重新安装。但是找到问题的根源会很有趣。 - cpaulik

0
尝试使用$_REQUEST而不是$_GET和/或$_POST

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接