php://input中的数据与解析并放置在$_POST中的数据不相等

3
我正在解决WordPress中的一个奇怪的错误,虽然我不知道WordPress是如何工作的,但我花了一个小时左右来试图分离问题并查看问题的根源。
结果发现问题在于该内容没有更新,因为$_POST没有被请求到的数据。
在我从浏览器访问的文件的顶部,在任何其他代码之前,我执行了以下操作:
echo file_get_contents("php://input");
print_r($_POST); exit();

我发现WordPress将$_POST作为全局变量并对其进行写入。我认为WordPress可能在某个地方处理这些数据,但我找不到它的位置。无论如何,在文件的顶部,这些变量都会被定义,甚至在任何其他操作之前... 我认为在此之前是不可能修改变量的。
输出结果如下:
widget-text%5B3%5D%5Btitle%5D=Test&widget-text%5B3%5D%5Btext%5D=THISISATEST&sidebar=sidebar-1&sidebar-1_position=1&sidebar-2_position=&sidebar-3_position=&sidebar-4_position=&sidebar-5_position=&savewidget=Save+Widget&widget-id=text-3&id_base=text&multi_number=3&_wpnonce=36852083b6&_wp_http_referer=%2Fwp-admin%2Fwidgets.php%3Fmessage%3D0%26editwidget%3Dtext-3%26sidebar%3Dsidebar-1%26key%3D0
Array
(
    [widget-text] => Array
        (
            [3] => Array
                (
                    [title] => Test
                )

        )

    [sidebar] => sidebar-1
    [sidebar-1_position] => 1
    [sidebar-2_position] => 
    [sidebar-3_position] => 
    [sidebar-4_position] => 
    [sidebar-5_position] => 
    [savewidget] => Save Widget
    [widget-id] => text-3
    [id_base] => text
    [multi_number] => 3
    [_wpnonce] => 36852083b6
    [_wp_http_referer] => /wp-admin/widgets.php?message=0&editwidget=text-3&sidebar=sidebar-1&key=0
)

URL解码:

widget-text[3][title]=Test&widget-text[3][text]=THISISATEST&sidebar=sidebar-1&sidebar-1_position=1&sidebar-2_position=&sidebar-3_position=&sidebar-4_position=&sidebar-5_position=&savewidget=Save Widget&widget-id=text-3&id_base=text&multi_number=3&_wpnonce=36852083b6&_wp_http_referer=/wp-admin/widgets.php?message=0&editwidget=text-3&sidebar=sidebar-1&key=0Array

请注意,在原始数据中,存在widget-text[3][text]=THISISATEST。 但是,$_POST ['widget-text'] ['3'] ['text'] 未定义。
我查看了phpinfo,但找不到任何相关设置。 我使用的是PHP版本5.3.8,Apache 2,在AWS上运行suse。
有人有任何想法如何使$_POST正确解析原始数据吗?

1
@ÁlvaroG.Vicario:在 $_POST 中,缺少 widget-text[3][text],但它在原始的 php://input 数据中。 - gen_Eric
没错。PHP似乎会排除任何第三层级的数组键,我尝试使用检查器编辑表单,看看是不是只有“text”键让PHP不喜欢,但无论如何都没有成功。 - Kavi Siegel
我不是很了解WordPress,但如果它的工作方式像Drupal的表单API一样,您将在其他地方编写代码来定义表单所期望的字段,而意外的字段将从输入中剥离。因此,我猜测WordPress核心会在您的代码看到它之前从$_POST中剥离该字段。 - SDC
@SDC,即使代码位于文件顶部,这种情况是否可能发生呢?在此之前没有运行任何其他代码。浏览器中的URL是我所在的文件,我认为没有任何包含魔法在进行。 - Kavi Siegel
1
做得更好 - 将此放置在受影响的文件中,以确保没有遗漏 var_dump(get_cfg_var('auto_prepend_file')); 并且它等于空字符串。从那里的 phpinfo() 确认没有包含任何魔法。 - Kavi Siegel
显示剩余3条评论
2个回答

1

是的,只需要这样做:

parse_str( urldecode( file_get_contents("php://input") ), $result );

var_dump( $result );

1

这确实很奇怪。可能是PHP中的一个bug或者配置/扩展问题。

  1. 尝试更改配置变量 max_input_nesting_levelmax_input_varsmax_input_time。如果您不确定值,只需尝试默认值。查看 PHP 文档页面 以查找默认值及其含义。

  2. 如果您正在运行 suhosin 扩展,请尝试禁用它并查看是否有所帮助。此外,所有 suhosin.post.* 配置键 都很有意思。

  3. 谷歌搜索显示类似的问题:onetwo

  4. 尝试通过 $_REQUEST 访问它 - $_REQUEST['widget-text']['3']['text']

无论如何,经过一些谷歌搜索,似乎这种情况发生在PHP 5.3.8中。因此,升级可能是另一个选项。


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