jQuery AJAX/POST无法向PHP发送数据

35

我有一个问题已经困扰我一段时间了,我知道这个话题上有无数的问题,相信我我尝试过每一个解决方案但仍然没有起作用。

这是最简单的例子,在我的情况下却不起作用。

jQuery:

$.ajax({
    url: "ajax/add-user.php",
    type: "POST",
    data: {name: 'John'},
    success: function(data){
        console.log(data);
    }
});

PHP

echo json_encode($_POST);

就是这样,每次作为响应我都得到一个空数组。我尝试使用serialize()data:进行处理,但响应总是为空的。我没有任何错误,只有当我应该获得发送的值时得到一个空数组。

例如,在php中,如果我尝试echo一些硬编码变量,我可以得到它们,但$_POST$_GET不起作用。

有什么解决方法或如何确定问题的方法吗?

谢谢。

编辑/解决方案

好吧,看来问题出在.htaccess上,它重新编写了URL并删除了扩展名。在网络选项卡中确实请求被永久移动。从ajax URL中删除.php扩展名:问题得到解决。非常感谢,对浪费的时间很抱歉。干杯!


10
尝试使用 echo $_SERVER['REQUEST_METHOD']。如果您得到的不是POST,那么您的原始帖子可能被重定向并且您实际上正在执行GET,这就是为什么$_POST为空的原因。 - Marc B
1
你设置了数据类型吗? - java seeker
2
所以是的...某些东西导致您的POST请求被重定向到http 301,从而使您的脚本通过GET获取。 - Marc B
7
好的,看起来问题出在.htaccess文件中,它会重写URL并移除扩展名。在网络标签页中,请求确实被永久重定向了。从ajax URL中去掉.php扩展名解决了这个问题。谢谢你,对浪费时间感到抱歉。祝好。 - C. Ovidiu
2
@C.Ovidiu:请将最终解决方案作为自我回答添加并标记为已接受,以便未来的搜索者受益。 - Nathan Tuggy
显示剩余8条评论
7个回答

24

您需要在ajax调用中将数据类型设置为json。

JQUERY CODE:

$.ajax({
  url: "ajax/add-user.php",
  type: "POST",
  dataType:'json',
  data: {name: 'John'},
  success: function(data){
      console.log(data);
  }
});

同时验证您的后端代码(php),是否可以接受json数据?

如果不能,请按以下方式配置标头:

PHP代码:

/**
 * Send as JSON
 */
header("Content-Type: application/json", true);

愉快编码 :


5
并且或者将此内容添加到您的ajax对象中:contentType: "application/json; charset=utf-8", - LenArt
4
因为 "method: "POST"" 不起作用,所以发现了这个问题。根据文档(http://api.jquery.com/jQuery.ajax/),在 jQuery 版本小于1.9.0 的情况下应该使用 "type" 而不是 "method"。我没有意识到 CMS 正在使用 1.8.2 版本! - Robert Dundon
谢谢@LenArt。我一直习惯于使用最新版本的jQuery,但最近在处理一个旧项目时,无法找出为什么POST不起作用...我也需要在这个旧项目中使用type :p - iamface

16

最近我遇到了这个问题,但是原因不同:

  1. 我的POST数据被重定向为301
  2. 我的服务器请求是GET
  3. 我没有收到我的POST数据

我的原因是 - 我在服务器上注册的URL如下:

http://mywebsite.com/folder/path/to/service/

但是我的客户在打电话:

http://mywebsite.com/folder/path/to/service

服务器上的 .htaccess 将其视为将 301 GET 重定向到正确的 URL 并删除 POST 数据。简单的解决方案是仔细检查URL路径

@C.Ovidiu,@MarcB - 你们两个人帮我节省了很多调试时间!


1
这是我的情况,我自己从来想不到,所以感谢您的分享! - Brian Leishman

7
为什么不使用jQuery.post
$.post("ajax/add-user.php",
       {name: 'John'},
       function(response){
           console.log(response);
       }
);

在您的PHP代码中,可以这样保存输入内容:
if(isset($_POST["name"]))
{
    $name= $_POST["name"];
    file_put_contents("name.txt", $name)
    header('HTTP/1.1 200 OK');
}
else
{
    header('HTTP/1.1 500 Internal Server Error');
}

exit;

2
jQuery.ajax 封装了这个功能 - OP 已经在使用它,只是在幕后进行。 - Piskvor left the building

6

我曾经遇到过同样的问题,这个问题最终被证明是我的data对象中的一个变量未定义。由于某种原因,这阻止了POST数据的发送。将变量设置为非未定义值即可解决问题。


我也遇到过这个问题,但它并非总是会导致问题。你知道这里到底发生了什么吗? - Karl P

1
尝试编辑您的代码并使用以下内容:

$.ajax({url: 'ajax/add-user.php',
type: 'POST',
data: {name: 'John'},
dataType: 'html',
success: function(data){
alert("success");
console.log(data);
},error: function (xhr, ajaxOptions, thrownError) {alert("ERROR:" + xhr.responseText+" - "+thrownError);}
});

如果你收到错误和成功提示,确保接收的是HTML。那些额外的参数将帮助你优化Ajax调用。之后尝试使用异步true/false进行调整。

另外,以新窗口运行ajax/add-user.php程序(键入URL),看看它会输出什么。编辑程序并强制输出“传说中的Hello World”之类的信息,看看你的Ajax是否能够接收到该消息。

祝好运。


谢谢您的回复,但是正如我之前回复的那样,问题是由于 .htaccess 文件删除了 .php 扩展名。 - C. Ovidiu

1

我尝试了很多方法,但最终发现以下代码对我有效:

if ( $_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) ) {
    $_POST = json_decode(file_get_contents('php://input'), true);
}

如果你尝试一下,这将会起作用。


0

你应该检查你的 .htaccess 文件,关闭带有 "#" 符号的行

# To externally redirect /dir/foo.php to /dir/foo
# RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
# RewriteRule ^ %1/ [R,L]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接