【问题标题】:Posting form data with .serialize() PHP error使用 .serialize() PHP 错误发布表单数据
【发布时间】:2012-07-06 22:32:08
【问题描述】:

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

【问题讨论】:

    标签: php jquery ajax


    【解决方案1】:

    这是交易:

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

    【讨论】:

      【解决方案2】:

      当未发布复选框时,您的代码会中断

      $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);
      

      【讨论】:

        【解决方案3】:

        您收到Invalid argument supplied for foreach 是因为它需要$_POST['checkboxes'] 中的值,而您没有在$.getJSON 调用中发送该值。

        $.getJSON 发送另一个 AJAX 调用,GET 请求以获取 JSON 文件。您已经向post.php 发送了POST 请求,无需再发送呼叫。

        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
                });
            }
        });
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-04
            • 2011-05-05
            • 1970-01-01
            • 2021-12-19
            • 2014-09-15
            相关资源
            最近更新 更多