【问题标题】:Jquery .ajax method="post" but $_POST emptyJquery .ajax method="post" 但 $_POST 为空
【发布时间】:2010-12-11 15:40:39
【问题描述】:
$.ajax({
    method: "post"
    , url: "save.php"
    , data: "id=453&action=test" 
    , beforeSend: function(){

    } 
    , complete: function(){ 
    }  
    , success: function(html){ 
        $("#mydiv").append(html);        
    }
});

我已将方法类型设置为 post,但在 Save.php 中,我只在 $_GET$_REQUEST 中获取值,但在 $_POST 中没有。

我的表格如下:

<form method="post" id="myform" action="save.php">

它不起作用,在此处和 Google 上查看,尝试添加 enctype

<form method="post" id="myform" action="save.php" enctype="application/x-www-form-urlencoded">

$_POST 还是空的?

如何让它发挥作用?

【问题讨论】:

  • 刚刚在使用 jQuery 的 ajaxForm 插件时遇到了类似的问题。我通过确保每个输入元素都有一个“名称”属性来解决它。我的匹配 ID 选择器,但这可能不是必需的。

标签: php jquery ajax


【解决方案1】:

您可以尝试更改 contentType,即:application/x-www-form-urlencoded。例如,如果你有application/json,你可以得到你目睹的行为。

$.ajax({
    url: 'index.php',
    dataType: 'json',
    type: 'POST',
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
    data: { 'test': jsonStr },
    success: function( data, textStatus, jQxhr ){
        console.log('success');
    },
    error: function( jqXhr, textStatus, errorThrown ){
        console.log( errorThrown );
    }
});    

【讨论】:

    【解决方案2】:

    在我的情况下,解决方案是在 Ajax 语句的 data 行中添加缺少的 .serialize()

    data: $("#form").serialize()
    

    【讨论】:

      【解决方案3】:

      我在使用$(form).ajaxSubmit() 时遇到了类似的问题。

      浏览器工具显示我已成功发出POST。服务器上的$_SERVER['REQUEST_METHOD'] 也表示POST,但PHP 中的$_POST 变量被返回为array(0) { }。对我来说问题是我实际上是在提交一个空表单。只要表单中有数据,$_POST 就会在其中包含一些内容(正如您所料!)但更重要的是,if ($_POST) { ... } 开始返回 true

      【讨论】:

        【解决方案4】:

        我也遇到了变量在混合中丢失的问题,并发现在使用重写条件将dir/foo.php 外部重定向到dir/foo 时,Apache 完全放弃了 POST 请求并进行了重定向。

        因此,在编写 JavasSript 时,您必须以可以绕过任何外部重定向的方式引用该文件。

        例如。删除与 JavaScript 内联的扩展名。

        url: "dir/foo"

        而不是

        url: "dir/foo.php"

        我希望这可以帮助像我一样找到此页面的其他人。

        【讨论】:

        • 谢谢!你的评论帮助了我! :)
        【解决方案5】:

        **在成功之前在您的代码中添加以下代码**

        beforeSend: function(xhr){xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")}
        

        【讨论】:

        • 之后在我的 $_POST 中出现了我的数据!
        【解决方案6】:

        为什么不直接拨打jQuery.post()

        $.post("save.php",
          $("#myform").serialize(),
          function(html) { 
            $("#mydiv").append(html);        
          },
          "html"
        );
        

        关于jQuery.ajax(),更改为type: "POST" 而不是method: "POST" 将导致正确的POST 请求:

        $.ajax({
                type: "POST",
                url: "test.mhtml",
                data: $("#myform").serialize(),
                success: function(html){ 
                        $('#mydiv').html(html);
                }
        });
        

        这在 Apache 日志中显示为:

        ::1 - - - [30/Oct/2009:09:44:42 -0700] "POST /test.php HTTP/1.1" 200 9 "http://localhost:10501/test.mhtml" "(sic)"
        

        可能的替代问题:
        我在查看您的问题时找到了this question on StackOverflow。也许给你带来麻烦的不是 jQuery,而是 PHP?投票最高的答案提供了一些确保 PHP 不干扰的建议,第二高的答案提供了一些代码来查看请求是否实际上是 POST

        <?php
          if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            echo 'POSTed';
          }
        ?>
        

        【讨论】:

        • 先发、完成、成功怎么样??使用 .post ??
        • 只需使用:$.post("save.php", $("#myform").serialize(),function(data){$('.msg').html(data) ;); (第三个参数是一个函数回调。)
        • 我进行了编辑以包含第三个和第四个参数。第三个参数是信息返回的回调函数,第四个参数是返回数据的类型。如果您更改为 JSON 返回类型,jQuery 将为您做一些解析。
        • @Jack 谢谢你的例子。我可以看到 .post 作品。但如果你也帮我调试 .ajax 那就太好了!
        • 大部分只是给你上面说的Sbm007。它们是正确的,因为这会生成一个 POST 请求。
        【解决方案7】:

        你需要使用type: "POST"而不是method: "post"

        所以这应该可以在不对表单 HTML 进行任何更改的情况下工作:

        $.ajax({
            type: "POST"
            , url: "save.php"
            , data: "id=453&action=test" 
            , beforeSend: function(){
        
            } 
            , complete: function(){ 
            }  
            , success: function(html){ 
                $("#mydiv").append(html);        
            }
        });
        

        不知道为什么它不起作用,但这对我有用:

        save.php

        <?php
        print_r($_POST);
        

        file.html

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
        <head>
            <title>Example</title>
        
            <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
            <script type="text/javascript">
                $(function() {
                    $('input').click(function() {
                        $.ajax({
                            type: "POST"
                            , url: "save.php"
                            , data: "id=453&action=test" 
                            , beforeSend: function(){
        
                            } 
                            , complete: function(){ 
                            }  
                            , success: function(html){ 
                                alert(html);        
                            }
                        });
                    });
                });
            </script>
        </head>
        
        <body>
            <div id="main"><input type="button" value="Click me"></div>
        </body>
        </html>
        

        你的错误一定在其他地方。

        【讨论】:

        • @Wbdvlpr:打开 firebug 控制台并检查正在发送的请求。您可以看到它使用什么方法(get/post)以及发送到哪个 url 的参数。然后从那里去。
        • 但是我在 $_GET 和 $_REQUEST 中得到了值 .. 但在 $_POST 中没有 .. 知道如何检查“其他地方”是否有误吗??
        • 你不是在做跨域请求吧?
        • 顺便说一句,有一个很好的插件可以自动从表单中获取所有字段值并通过 ajax 提交:jquery.malsup.com/form/#ajaxForm
        • 不在同一个域中.. 我没有提到的一件事是这个表单在一个对话框窗口中
        猜你喜欢
        • 2015-07-29
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多