您可以将 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
好的,太好了!那么我有什么(减去括号)并假设testContentArray
和testContentAttributes
是数组可以工作?
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 变量设置为数组吗?的主要内容,如果未能解决你的问题,请参考以下文章