【问题标题】:Jquery Ajax Request Not Sending Post DataJquery Ajax 请求不发送帖子数据
【发布时间】:2012-12-11 22:40:02
【问题描述】:

我正在使用 Jquery $.ajax 方法成功地进行 AJAX 调用,因为它发布到的文件正在被调用和执行。但是,没有发送 POST 数据。我要做的就是发送数据并让文件接收它;我不关心返回数据。

我尝试将其更改为 GET,但没有产生结果。我在收到的 URL 中传递了 GET 数据(显然,我猜)。我也尝试过更改我发送的数据类型......这些都没有让我知道我做错了什么。我也在这里浏览了许多具有类似标题的问题,但似乎没有任何东西可以解决这个问题。虽然我确信这很简单。

其他可能相关的变量:我正在使用 Knockout JS。我正在使用 .htaccess 重定向在 /public 文件夹中创建单入口点。

不用多说,代码如下:

page.html

<button data-bind="click: save">Save</button>

如果你对 KOJS 不熟悉,它基本上只是在单击时调用函数 save。我很确定这可以正常工作。

models.js

self.save = function() {
    var jsonData = ko.toJSON(self.tasks);
    $.ajax("http://test.local.com/js/post.php", {
        data: jsonData,
        type: "post", contentType: "application/json",
        success: function(result) { alert(jsonData) }
    });
};

那个警报给了我一个格式很好的 JSON 对象,比如

[{"title": "Clean up the dog"},{"title": "Warm up the old pasta"}]

这是帖子文件,我想,我的错误在哪里? $_POST 数组为空。如果我将其更改为以 GET 形式发送,那也是空的。我将 cmets 放在代码中进行解释。

post.php

if (isset($_POST)) {
  //It does get inside this if. That's good at least, right?

  $my_file = 'file.txt';
  $handle = fopen($my_file, 'w') or die('Cannot open file:  '.$my_file);
  //It will make this file.

  fwrite($handle, print_r($_POST));
  //Prints "1" without the quotes


  foreach ($_POST as $key => $value) {
    fwrite($handle, 'your data: '.$value.'; ');
  }
  //Prints nothing
}

关于为什么这不会发送任何 POST 数据有什么想法吗?我敢肯定这很傻。谢谢!

【问题讨论】:

  • 您确实意识到您正在提醒您正在发送的相同数据,而不是您正在接收的数据?作为旁注,控制台可能比警报更适合读取 JSON。
  • 是的,我愿意。我做了我知道该怎么做的事情,那就是确保我至少已经正确准备好要发送的数据。如果我认为我根本没有发送数据,那么我认为这个问题的措辞会完全不同!
  • 在您选择的浏览器的开发工具中打开网络面板,并检查您是否可以看到正在发送的请求。在您考虑服务器端发生的事情之前,请确保它正在发送!
  • 您根本没有从 PHP 文件中返回任何内容,您是否希望返回数据?
  • 在您的 php 代码中,如果您希望 print_r 返回而不是 print,您必须使用第二个参数 TRUE。 php.net/manual/en/function.print-r.php

标签: jquery ajax json post knockout.js


【解决方案1】:

您的问题是您将 data 设置为 JSON 字符串。根据文档,jQuery 不会处理字符串数据,只会处理对象 http://api.jquery.com/jQuery.ajax/

改为使用 ko.toJS 来获得一个干净的 JS 对象,这应该会让你走上正确的道路。

[编辑]

我刚刚注意到您也设置了 contentType...为此,您将无法使用 $_POST var。相反,您需要从 file_get_contents("php://input") 获取“应该”为您提供原始 JSON 字符串的数据。从那里你应该能够使用 PHP 的 json_decode 将它变成一个真正的 PHP 对象。

【讨论】:

  • 您的第一个建议似乎已经解决了其中一个问题,但仍然无法正常工作。我摆脱了 contentType 属性,将其更改为ko.toJS,然后传递了该对象。这使我的 $_POST 的 count() 为 1,但键为“未定义”且值为空。设置 processData: false 使 $_POST 的 count() 返回 0。
  • hmm... 也许回到 contentType: application/json 但请注意,您不会在 php 的 $_POST 中找到数据。我会更新我的答案
  • 辉煌。使用$jsondata = file_get_contents("php://input");fwrite($handle, $jsondata); 打印出数据!谢谢!
猜你喜欢
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多