【问题标题】:jQuery Ajax error 200 parse errorjQuery Ajax 错误 200 解析错误
【发布时间】:2016-05-16 18:11:19
【问题描述】:

我已经阅读了许多与我的困境有关的文章,但我不明白我的问题是什么,所以请有人帮我解释一下:

我想使用 jQuery ajax 将值发布到 PHP 文件:

$().ready(function(){
"use strict";
$("#ansSubmit").click(function() {
    $.ajax({
        type: "POST",
        url: "updateScore.php",
        dataType: "json",
        data:{ 
            data : JSON.stringify(flag)
        },
        success: function(data) {
            alert(data.reply);
        },
        error: function(jqXHR, textStatus, errorThrown) {
          alert("jqXHR: " + jqXHR.status + "\ntextStatus: " + textStatus + "\nerrorThrown: " + errorThrown);
        }
    });  
    $("#infoDiv").load("updateScore.php"); // to see what $_POST contains
  });
});

被发送的标志变量是一个整数。

这是我更新的 updateScore.php(我要发布到的 PHP 文件):

<?php
session_start();

$returned = array("reply" => "no data received");

if(isset($_POST["data"])) {
   $returned["reply"] = $_POST["data"];
}

print_r($_POST);

echo json_encode($returned);

?>

“没有收到数据”被返回,所以至少我知道它到达了 updateScore.php 但现在我需要帮助确定它为什么不发送任何东西 - 我 100% 确定标志有一个值。

附加信息:

  1. mime.types 激活了所有 JSON 选项。
  2. console.log(data) 返回未捕获的引用错误:未定义数据。
  3. errorThrown 返回 Parse 错误:在位置 0 中出现意外
  4. print_r($_POST) 返回 Array()

【问题讨论】:

  • 您是否检查过在调用 srigify 时已定义标志?
  • 我将 XAMPP 与 PHP 5.6.14 和 jQuery 1.12.0 一起使用
  • 是的,我通过警报对其进行监控。它返回一个 0 到 5 之间的整数。
  • 您是通过localhost 还是通过在浏览器地址栏中输入文件名file:///c:\xampp\htdocs\index.php 访问您的xampp 网站?您必须使用 localhost 方法才能使 ajax 工作。
  • 我使用 localhost/php/main.php。一个 id 为“ansSubmit”的 html 按钮会触发 jQuery 脚本(经过测试并且可以正常工作)以发布到 updateScore.php。如果手动插入标志,updateScore.php 脚本也可以工作。

标签: php jquery json ajax post


【解决方案1】:

首先你告诉服务器你正在向它发送 JSON:

contentType: "application/json",

然后你将一个对象传递给data。这被编码为application/x-www-form-urlencoded(它不是 JSON,尽管它恰好嵌入了 JSONinside)。

data:{ 
    data : JSON.stringify(flag)
},

然后在 PHP 中你尝试从 $_POST 读取

if(isset($_POST["data"])) {

...但是$_POST 是空的,因为您告诉服务器您正在发送 JSON,所以没有尝试对其进行解码。


删除这一行:

contentType: "application/json",

…因为它是一个破坏你代码的谎言。


或者

您实际上可以发送 JSON:

contentType: "application/json",
data: JSON.stringify(flag),

...然后从原始请求正文而不是(仍然未填充的)$_POST 中读取它。

$json = file_get_contents('php://input');
$data = json_decode($json);

【讨论】:

  • 5 开始解释,太棒了!令我感到困惑的是,您建议的两种方法都出现解析错误:JSON 位置 0 中的意外令牌
  • @user3458861 — dataType: "json" 告诉 jQuery 将响应解析为 JSON,无论内容类型响应标头说什么(它还设置了一个 Accept 请求标头,表示对 JSON 的偏好)。如果它得到&lt;,那么这通常表明服务器正在返回HTML(并且由于客户端期待JSON而出错)。您提供的代码不应该返回 HTML,可能服务器未配置为支持 PHP,因此它返回 PHP 程序的原始源代码(或者您可能从file:// URI 和服务器被绕过)
  • 我运行其他 php 脚本没有问题,我从 localhost/somePath 加载所有内容。我的 mime.types 有 application/json 和 text/json 活动。老实说,我不知道还能尝试什么,但我看到你在堆栈溢出用户中排名前 0.01%,所以我希望你可能有另一个或 2 个想法?
【解决方案2】:

从您的示例中,您期望返回一个 json 对象,但您正在回显 it works ....

在 php 中试试这个示例代码:

$returned = array("reply" => "not found");

if(isset($_POST["data"])) {
     $returned["reply"] = "It works!" . $_POST["data"];
}

echo json_encode($returned);

基本上这个示例代码设置了一个数组returnedreply 默认为not found。如果数据可用,它会将reply 设置为您的消息。然后在 echoes 一个 json 版本的消息之后。

【讨论】:

  • 我的回复仍然未定义,如果我包含 contentType: "application/json" 和 dataType: "json" 那么我会收到 404 file not found 错误。我不会称它为进步,但至少它是一些新的东西......
  • 这篇文章很有帮助,它返回了回复,但没有附加“它有效!” . $_POST["数据"];所以我的 isset() 失败了。我 100% 确定该标志在发送之前有一个值,但 console.log(data) 返回:Uncaught ReferenceError: data is not defined,知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
  • 2012-10-13
  • 2017-07-31
相关资源
最近更新 更多