使用.serialize()PHP错误发布表单数据

时间:2012-07-06 14:22:58

标签: php jquery ajax

我发布的表单数据包含一些复选框和其他输入到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数据,但在一个脚本中更容易完成。

4 个答案:

答案 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) {

    })
}