Jquery .ajax method =“post”但$ _POST为空

时间:2009-10-30 15:31:59

标签: php jquery ajax

$.ajax({
    method: "post"
    , url: "save.php"
    , data: "id=453&action=test" 
    , beforeSend: function(){

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

我已将方法类型设置为发布,但在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为空?

如何让它发挥作用?

6 个答案:

答案 0 :(得分:9)

而不是method: "post"您需要使用type: "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>

你的错误必须在其他地方。

答案 1 :(得分:5)

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

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

例如。将扩展名称与JavaScript内联。

url: "dir/foo"

而不是

url: "dir/foo.php"

我希望这能帮助那些发现此页面的人像我一样。

答案 2 :(得分:4)

为什么不直接拨打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';
  }
?>

答案 3 :(得分:3)

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

key

答案 4 :(得分:0)

我遇到了与$(form).ajaxSubmit()类似的问题。

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

答案 5 :(得分:0)

对于我来说,解决方案是在Ajax语句的.serialize()行中添加缺少的data

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