1

我正在使用 jQuery 的 .serialize() 将包含一些复选框和其他输入的表单数据发布到 PHP 脚本。

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() 提供的参数无效”,这会导致输入表单中的数据无法正确传递(即 fwrite在 foreach 没有写任何东西之后)。如果我为 getJSON 引用另一个文件,比如 data.php,或者如果我根本不包含它,则帖子可以正常工作。为什么会这样?我可以只存储数据并制作第二个脚本来返回 JSON 数据,但在一个脚本中完成这一切会更容易。

4

4 回答 4

2

这是交易:

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请求并使用 each 函数,您将遍历从服务器返回的标签。我相信这是您想要的预期功能。

于 2012-07-06T14:30:47.473 回答
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);
于 2012-07-06T14:31:42.637 回答
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
        });
    }
});
于 2012-07-06T14:32:08.450 回答
0

你不必调用“getJSON”,因为你已经有了你想要的。您需要的一切都在数据中。所以你的“成功”回调应该是这样的:

function(data){
    var jsonData = $.parseJSON(data);
    $.each(jsonData, function(key, val) {

    })
}
于 2012-07-06T14:29:21.403 回答