【问题标题】:Passed arrays lose all but first element传递的数组会丢失除第一个元素之外的所有元素
【发布时间】:2012-04-05 09:38:08
【问题描述】:

我有一个奇怪的问题。我最近将我的应用程序从本地 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。 我想问题是一些服务器配置,但我找不到任何关于这个问题的信息。

对 cme​​ts 的回应:

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

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

给了

Array
(
    [0] => 52.447529
)

php.ini 可以找到here

您应该能够看到行为here

这个php文件的源文件是

<?php

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

?>

【问题讨论】:

  • 我在本地添加了同样的问题,但从未弄清楚是什么原因造成的(它是在 windows 7 上使用 Zend Server 5.5)
  • 你能检查一下你的url是否没有&而不是 &
  • print_r(parse_str($_SERVER["QUERY_STRING"]));给你?
  • 您的代码在我的服务器上运行良好。也许这是“register_globals”问题?你能在这里发布你的 php.ini 配置吗?
  • 我编辑了原始帖子以解决 cmets

标签: php arrays post get


【解决方案1】:

好吧,我的系统管理员进行了系统更新并重新启动,问题现已解决。没有更改任何配置文件。

【讨论】:

  • 系统更新有时包括 PHP 更新和其他各种好东西。你可能永远不知道是什么解决了它!
  • 配置在我看来也不错。您可能一直在运行一个有问题的 PHP 版本。
【解决方案2】:

在我的服务器上测试过,对我来说效果很好:

_GET["latmin"]  

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

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

【讨论】:

  • 是的,我知道代码是正确的,它也适用于我的本地 XAMPP 安装,但不适用于新服务器。如果我找不到解决方案,我会重新安装并希望这种行为会消失,但很高兴知道这样的事情是如何发生的。奇怪的是 parse_str 也给出了错误的输出。我的 php.ini 贴在上面,我发现数据处理部分没有任何异常。
  • 我们可以确定这不是 php.ini 问题,因为我使用了您的确切 php.ini 并获得了正确的结果(数组中的 2 个拉丁文)。运行 phpinfo();并将您的 get 参数传递给页面并告诉我它在底部的 _GET 部分中显示的内容。
【解决方案3】:

link 的一个示例每次都打印Array ( [0] =&gt; 52.447529 ),甚至没有传递任何变量。因此,似乎您在未与此代码链接的代码中遇到问题: `

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

`

【讨论】:

  • 这是因为我测试了 parse_str 方法,它应该打印一个 2 元素数组,但没有。传递的变量包含在 phpinfo() 的末尾;但也许这不是很清楚。
【解决方案4】:

嗯.. 也许它与 critical vulnerability bug 有某种关系?您的 XAMPP 是否具有与生产相同的 PHP 版本?我知道如果您发布太多数据(文件/帖子大小和参数数量),可能会出现类似问题。升级到 5.3.10 怎么样?

【讨论】:

  • 您好,是的,我在其上运行的本地安装与无法运行的 SUSE Enterprise Server 具有相同的版本。所以我不认为它是特定于版本的,而是一些奇怪的配置问题。如果找不到解决方案,我将尽快升级或重新安装。但深入了解这一点会很有趣。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    此错误的最可能原因是有人在 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”这样的字符串时,php 使用了一个 SAPI“treat_data”钩子——不同的 SAPI 可能有它自己的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2017-01-23
      • 1970-01-01
      相关资源
      最近更新 更多