【问题标题】:jQuery AJAX/POST not sending data to PHPjQuery AJAX/POST 不向 PHP 发送数据
【发布时间】:2014-04-01 16:04:02
【问题描述】:

所以我有这个问题有一段时间了,我知道关于这个主题有无数的问题,相信我,我尝试了所有可能的解决方案,但仍然不起作用。

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

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 扩展名:解决了。谢谢你,很抱歉浪费了时间。干杯

【问题讨论】:

  • 试试echo $_SERVER['REQUEST_METHOD']。如果您收到 POST 以外的内容,则您的原始帖子可能会被重定向,而您实际上是在执行 GET,这就是 $_POST 为空的原因。
  • 你设置了 dataType: 吗?
  • 所以是的...某些原因导致您的 POST 请求获得 http 301 重定向,从而导致您的脚本改为通过 GET 获取。
  • 好的,看来问题出在 .htaccess 上,它重写了 url 并删除了扩展名。在网络选项卡中,请求确实被永久移动了。从 ajax url 中删除 .php 扩展名:解决了。谢谢你,很抱歉浪费了时间。干杯
  • @C.Ovidiu:请将最终解决方案添加为自我回答并将其标记为已接受,以便未来的搜索者受益。

标签: php jquery ajax post


【解决方案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 调用。稍后使用 async true/false)

另外,在新窗口中运行您的程序 ajax/add-user.php(键入 url)并查看它的回声。编辑程序并强制回显您的内容“即传奇的 hello world”并查看您的 ajax接收消息。

祝你好运。

【讨论】:

  • 感谢您的回复,但正如我之前回复的那样,问题是因为 .htaccess 正在删除 .php 扩展名。
【解决方案2】:

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

JQUERY 代码:

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

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

如果没有,请配置header如下:

PHP 代码:

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

快乐编码:

【讨论】:

  • 并且或将其添加到您的 ajax 对象中: contentType: "application/json; charset=utf-8",
  • 发现这个问题是因为method: "POST" 不起作用。 Per the docs, type 应该用于 jQuery 版本 method。我没有意识到 CMS 使用的是 1.8.2!
  • 感谢@LenArt。我一直习惯于使用 jQuery 的最新版本,但最近在一个旧项目上工作,不知道为什么 POST 不起作用。我在这个旧项目中也需要 type :p
【解决方案3】:

为什么不使用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;

【讨论】:

  • jQuery.ajax 包装了这个功能 - OP 已经在使用这个功能了
【解决方案4】:

我遇到了同样的问题,结果证明是我在data 对象中的变量之一未定义。出于某种原因,阻止了发布数据的发送。将变量设置为 undefined 以外的其他值可以解决问题。

【讨论】:

  • 我也有这个,但它并不总是导致问题。知道这里实际发生了什么吗?
【解决方案5】:

我最近遇到了这个问题,但由于其他原因:

  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 - 你们两个为我节省了大量调试时间!

【讨论】:

  • 这是我自己的情况,我自己永远也想不出来,谢谢分享!
【解决方案6】:

你应该检查你的 .htaccess 文件,用“#”符号关闭行

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

【讨论】:

    【解决方案7】:

    我尝试了很多东西,但我发现下面的代码适合我:

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

    如果你愿意,这将起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2014-01-11
      • 2014-11-20
      • 1970-01-01
      相关资源
      最近更新 更多