【问题标题】:Array being chopped off over ajax post. Ajax posting limit?数组被 ajax 帖子截断。 Ajax 发帖限制?
【发布时间】:2012-09-09 21:08:12
【问题描述】:

我有一个多维数组,它由 426 个较小的数组组成,其中还包含 4 个属性。下面是 426 个数组之一的示例...

    array( //Main array
          0 => array( //1 of 426 arrays
               'name' => 'Danny', 
               'email' => 'your@email.com', 
               'picture_url' => 'http://www.website.com', 
                'score' => 89
          ),
    )

我将这个数组与 jquery 的 ajax 函数一起发布到一个 php 文件中,然后将它们添加到一个数据库中……我的问题是,当它发布到 php 文件中时,该数组似乎被截断了。只有大约一半的数组实际上到达了 php 文件...

这使我相信通过 ajax 发布时可能存在文件大小限制。但是,我的数组的大小似乎相对较小..

我正在 WAMP 上运行我的应用程序..

任何人都可以阐明可能发生的事情吗?

更新:

我像这样发布我的数组:

$.ajax({
  type: "POST",
  url: "invite_friends.php",
  data: {
    theID: me.id,
    friends: multidimensional_array //This is the array <---
  },
  success: function(data, textStatus, jqXHR) {
    return console.log(data);
  },
  error: function(jqXHR, textStatus, errorThrown) {
    return alert("Error: Oops, there has been a problem");
  }
});

然后我像这样检索我的数组(在invite_friends.php中)..

if($_POST['friends']) {
    $friends = $_POST['friends'];   
} else {
    $friends = FALSE;
} 

【问题讨论】:

  • 你如何发布你的数组?可以分享一下代码吗?
  • 当您说 post 时,您的意思是 get ?
  • 根据 w3schools.com(是的,我知道:w3fools.com)GET 有大小限制,但 POST 没有。
  • @Mathieu - 当然,我已经更新了我上面的问题:)
  • 我也遇到了同样的问题。丹尼,你有什么解决办法吗?

标签: php jquery ajax arrays multidimensional-array


【解决方案1】:

尝试在 .htaccess 和 max_input_time 中将 php_value post_max_size 设置为至少 16M,以免超时。

php_value post_max_size 16M
php_value max_input_time 4000

【讨论】:

  • 我已将这些添加到我的 htaccess 并更改了我的 php ini 文件,恐怕这没有帮助。
  • 您可以尝试获取整个数组并使用控制台将其保存到文件中,以检查您发布的数组有多大
  • 很抱歉回复晚了,直到早上才离开办公室。我已经将数组的所有内容放在了一个文本文件中,大小为 48 KB
  • @Danny 这意味着还有其他问题,因为这么小的帖子不会超时。您确定您的代码中没有任何会影响 POST 数据的验证吗? PS 也关闭魔术引号。
  • 好的魔术引号已被禁用。恐怕没有比我上面的代码中显示的更多验证了。我在控制台中截取了我的数组的屏幕截图。 postimage.org/image/9bwfov2nj - 我注意到它是一个包含对象的多维数组。也许这会有所作为?
【解决方案2】:

您需要打开您的php.ini 文件并设置(或创建)这一行:

max_input_vars = 1000000

max_input_vars 的默认值为 1000,这将在 1000 个元素处截断一个数组。只需将其更改为一个非常高的数字(在我的情况下,我需要将其设置为一百万)。

来自 PHP 手册:

可以接受多少个输入变量(限制应用于 $_GET, $_POST 和 $_COOKIE 分别超全局)。该指令的使用 减轻使用哈希的拒绝服务攻击的可能性 碰撞。如果输入变量多于此指定的 指令,发出 E_WARNING,进一步的输入变量是 从请求中截断。 此限制仅适用于每个嵌套 多维输入数组的级别。

记住:正如手册所述,设置此默认限制是为了防止拒绝服务攻击。

希望这会有所帮助,尽管这是一个老问题。

【讨论】:

  • 如果 php.ini 无法访问,那么通过 Ajax 在某个循环中逐个发送每个数组是否比一次发送更好?
【解决方案3】:

我也有同样的问题。

$.ajax({data:{x:x,y:y}});

最后发现有些值是日期格式(对象)。当它们转换为简单类型(字符串或整数)时,问题就解决了。希望这能有所帮助。

【讨论】:

    【解决方案4】:

    您应该在客户端将所有数据转换为 json 格式并将其作为文本发送。

    var jsonDataString = JSON.stringify(data)
    //data - array, associative array, any other variables
    
    $.ajax({
    ...
        data: {
            friends: jsonDataString,
        }
    ...
    });
    

    在服务器端只需解码 json 文件。

    <?php
    ...
    $friendsJsonString = $_POST['friends'];
    $friends = json_decode($friendsJsonString);
    ...
    

    由于安全风险,更改 php.ini 不是一个好主意。

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 2020-08-02
      • 2010-12-07
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      相关资源
      最近更新 更多