我发布的表单数据包含一些复选框和其他输入到PHP脚本的jQuery的.serialize()。
post.js:
$(function(){
$("#button").click(function(){
$.ajax({
type: "POST",
url: "post.php",
data: $("form#input").serialize(),
success: function(data){
$.getJSON('post.php', function(data) {
$.each(data, function(key, val) {
})
})
}
})
})
})
post.php中:
$tags = array();
foreach($_POST['checkboxes'] as $key => $value){
$tags[] = "$value";
}
$json = array(
array(
"tags" => $tags,
),
);
echo json_encode($json);
如果我将getJSON指向post.php,我会在错误日志中收到一条PHP警告:“PHP警告:为foreach()提供的参数无效”,这会导致输入表单中的数据无法正确传递(即foreach之后没有写任何东西的fwrite)。如果我引用getJSON的另一个文件,比如data.php,或者如果我根本不包含它,那么帖子工作正常。为什么会这样?我可以存储数据并制作第二个脚本来返回JSON数据,但在一个脚本中更容易完成。
答案 0 :(得分:3)
这是这笔交易:
success: function(data){
在上面的部分中,您收到的数据是您定义的返回json_encoded string containing key:value pairs of $tags
。
$.getJSON('post.php', function(data) {
现在,在你的getJSON请求中,你没有传递任何值,而你的foreach语句希望你发布复选框的值,以便可以解析它们,并制作标签。我不确定我理解你为什么要这样做,因为success: function(data)
将本地解析从服务器返回的JSON,并为你做好准备。
$.each(data, function(key, val) {
如果您只是丢失$.getJSON
请求并使用每个函数,您将迭代从服务器返回的标记。我相信这是你想要的功能。
答案 1 :(得分:1)
如果未发布复选框,您的代码就会中断
$tags = array();
if( array_key_exists('checkboxes', $_POST) && is_array($_POST['checkboxes']) ) {
$tags = array_values($_POST['checkboxes']);
}
$json = array(
array(
"tags" => $tags,
),
);
echo json_encode($json);
答案 2 :(得分:1)
您收到Invalid argument supplied for foreach
,因为它预计您$_POST['checkboxes']
来电时未发送的$.getJSON
值。
$.getJSON
发送另一个 AJAX调用,GET
请求获取JSON文件。您已向POST
发送了post.php
个请求,您无需另外发送电话。
将dataType: 'json'
添加到第一个电话,并为您解析JSON响应。
$.ajax({
type: "POST",
url: "post.php",
data: $("form#input").serialize(),
dataType: 'json',
success: function (data) {
$.each(data, function (key, val) {
// code here
});
}
});
答案 3 :(得分:0)
您不必调用“getJSON”,因为您已经拥有了所需的内容。您需要的一切都在数据中。所以你的“成功”回调应该是这样的:
function(data){
var jsonData = $.parseJSON(data);
$.each(jsonData, function(key, val) {
})
}