您可以将 PHP $_POST 变量设置为数组吗?

Posted

技术标签:

【中文标题】您可以将 PHP $_POST 变量设置为数组吗?【英文标题】:Can you have a PHP $_POST variable that is set to an array? 【发布时间】:2011-09-04 02:07:53 【问题描述】:

我正在使用 AJAX 将一些数据放入我的数据库中。我正在使用 JSON 将数据提交到 php 页面。我正在使用 POST 请求。您可以将 POST 变量之一设置为数组吗?下面我有完整的 AJAX 请求,但这里是我将数据的两部分设置为数组的部分:

"content[]" : testContentArray,
"content_attr[]" : testContentAttributes,

以下是我的完整 AJAX(使用 jQuery):

$.ajax(
                type: "POST",
                url: "../includes/create_test_main.ajax.php",
                data:   "tags" : $('#testTags').val(),
                                         "title" : $('#testTitle').val(),
                                         "subject" : $('#testSubject').val(),
                                         "description" : $('#testDescription').val(),
                                         "content[]" : testContentArray,
                                         "content_attr[]" : testContentAttributes,
                                         "user_id" : user_id,
                success: 

                                     function(testId) //redirect Page
                                        window.location.href = "http://localhost/nvr_forget/public_html/test/" + testId + "/";
                                     
            );
        ;

如果这是这样做的方法,我将如何在 PHP 端处理它?我应该将 $_POST 变量作为普通数组处理吗?

【问题讨论】:

【参考方案1】:

当然可以 - 它可以是简单数组(以整数作为键)或关联数组。这仅取决于您提交的 JSON 对象。

例如,如果您提交以下 JSON 对象:

var data = 
    'a': 'test123',
    'b': [
        'x',
        'y',
        'z'
    ],
    'c': 
        'testing': 'abc',
        'blah': 'qwerty'
    

$_POST 中将包含以下元素:

$_POST['a'] - 包含字符串test123$_POST['b'] - 包含数组 (array('x','y','z')), $_POST['c'] - 也包含数组,但具有关联性 (array('testing'=>'abc','blah'=>'qwerty')),

【讨论】:

我认为这行不通。 $_POST['b'] 最终会变成 "Array" 而不是 ['x','y','z'] @Frits 这是因为你刚刚附和了它。你不会像那样回显数组(这是 PHP 初学者的常见错误)。尝试使用print_r($_POST['b'])var_dump($_POST['b']) 而不是echo $_POST['b'],你就会明白我的意思了。 echo 会产生带有引号的数组吗?我想不是。请不要假设。我本可以输入“string (5) "Array"”,但现在这很愚蠢不是吗? @Frits 我的回答不是基于所谓的“假设”,而是基于所谓的“经验”。如果您真的想要输出['x','y','z'] 并且正确地从JS 传递数据(=正如我所描述的),您可以执行echo "['".implode("','",$_POST['b'])."']";。但如果你能得到其他东西,我不会感到惊讶 - 只需给我更多细节,让我为你解决问题。 这是部分解决方案。如果$_POST['b'] 是一个空数组,它将打印[''] 无论如何(这是一个具有一个元素的数组:一个空字符串)。这离主题很远,但只是为了避免混淆;) - 只需使用 var_dump kids【参考方案2】:

您可以从 JS (JSON) 发布一个对象,然后使用 json_decode 在服务器 (PHP) 上对其进行 json_decode。

【讨论】:

这完全不需要。 OP 在 JS 端有 JSON,如果他使用 jQuery 的 .post() 函数,他发送的数据然后被 PHP 视为数组。为什么需要从 JS 对象构造字符串然后解码?【参考方案3】:

当您将data 对象中的数组传递给$.ajax 时,它会被解析为name[]=value 格式。这是使用$.param 完成的,所以我将使用它来说明:

jQuery.param('foo': [1, 2, 5])
// "foo%5B%5D=1&foo%5B%5D=2&foo%5B%5D=5"

%5B%5D 是 uri 编码的方括号。这是将同一键的多个值发送到服务器的常用方法。 PHP 将其解析为一个数组,因此在这种情况下:

var_export($_POST['foo']);
// array ('1', '2', '5')

所以在您的代码中,$_POST['content']$_POST['content_attr'] 都应该是数组。您使用的方括号是不必要的,但不会破坏任何内容。

See the PHP manual on the subject.

【讨论】:

那么你将如何遍历这些数组呢?类似while($_POST['content']) /*do something*/ ? @chromedude 你不能使用while 来循环遍历一个数组(嗯,你可以,但在几乎所有可以想象的情况下这都是愚蠢的)。使用foreach jQuery.param 基本上完成了我的解决方案,但就像我说的,你只是在使用另一个序列化程序.. 我想如果你只是在胡闹的话,这很好:P 好的,太好了!那么我有什么(减去括号)并假设testContentArraytestContentAttributes 是数组可以工作? jQuery 确实有一个特殊的 'json' 选项,您可以传入 .ajax/.post 函数。你不妨使用它。【参考方案4】:

您可能可以做到,但您必须像这样完全手动完成:


    "content[0]": "a",
    "content[1]": "b",
    "content[2]": "c",
    "content[multi][0]": "d"

$_POST['content'] 将如下所示:

Array(
    0 => "a",
    1 => "b",
    2 => "c",
    multi => Array(
        0 => "d"
    )
)

这样会简单得多:


    "blob" : JSON.stringify(data_or_array_or_whatever)

在 PHP 中,您可以通过以下方式检索它:

$data = json_decode($_POST['blob'], true);

不过,这需要旧浏览器的 json2.js 库。

我会选择后者,因为在前者中,您最终可能会编写自己的序列化程序:P - 这正是我们使用 JSON 的原因。

【讨论】:

@Frits 使用 jQuery 并将数组分配给 JSON 对象(然后通过 .post() 方法发送到服务器的对象)的属性之一,无需 JSON 字符串化(在客户端) & 解码(在 PHP 端),所以不需要额外的库。 那为什么 OP 有问题呢?无论如何,我的观点是如果你想在不使用 jQuery 的情况下做到这一点。 @Frits 因为他是初学者。但他询问了更有经验的人,他希望有人知道如何使用 jQuery 通过 AJAX 发送数据。但是,如果您在没有 jQuery 的情况下尝试这样做,您可能是对的 - 我已经在问题的上下文中查看了您的答案。但是,您是说他需要 json2.js 代替 - 对他来说这可能没有用甚至不合理(他使用 jQuery),但我会尽快撤销我的反对票(现在已锁定)。 您应该能够撤销反对票。谢谢你。我假设这个问题将被搜索机器索引,所以我总是尽量给出最广泛和解释性的答案。我宁愿不要过分依赖 jQuery 的内部魔力,因为这个问题非常笼统并且没有提到 jQuery(在标题中)。我认为这有助于理解基本原理。 @Frits Downvote 已撤销。不过,我有不同的看法 - 他 is 使用 jQuery(从问题的标签和实际内容判断)和这样的做法(只是分配包含例如数组的复杂 JSON 对象,而不是打扰用它制作字符串)是:1)很常见(真的),2)很容易(增加抽象级别),3)非常有用(更短的代码,更容易阅读和调试),4)非常优化(由jQuery制作)制造商)

以上是关于您可以将 PHP $_POST 变量设置为数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 将所有 $_POST[] 变量访问到一个数组中?

您可以进行 $_POST 变量吗? [复制]

php超级全局变量

PHP 从 Ajax 调用接收空的 $_POST 变量

php - 检查 $_POST 是不是为数组?

php - 检查 $_POST 是不是为数组?