【问题标题】:PHP/Ajax/Json - JSON echo from PHP freezes script?PHP/Ajax/Json - 来自 PHP 的 JSON 回显冻结脚本?
【发布时间】:2012-08-09 19:19:27
【问题描述】:

我通常通过搜索找到我的答案,但这些让我很困惑,我找不到任何相关文章:/

我只是对我的 PHP 脚本运行 AJAX 调用并提醒返回值(JSON 编码对象)。

问题是,脚本一碰到我的“回声”语句就会冻结。我已经在没有回声的情况下进行了测试,甚至使用了诸如“Hello”之类的值(两者都成功)。我还使用我在网上找到的示例 JSON 字符串测试了输出。这失败了。

我现在相信任何结构为 JSON 的字符串都会导致此错误(我已经在 jsonlint.com 上测试了这两个 JSON 脚本)。

非常感谢所有帮助!!!

Javascript 代码:

function scan()
{
var script          = "../resources/ajax/fincenmanager/load_reports.php";
var params          = "";
var return_function = "load_wire";

document.getElementById("loading_screen").className = "show";

ajax(script, params, return_function);
}
function load_wire(text)
{
document.getElementById("loading_screen").className = "hidden";
alert(text);
}

PHP 代码:

<?php
     require_once("../../config.php");
     require_once("../../library/FincenManager/fincenmanagerclass.php");

     header("Content-Type: application/json");

     $manager = new FincenManager("../../inputs/FincenManager/");

     $json = json_encode($manager);

     // Script Breaks After This Line.. 100% Sure :/
     echo $json;
 ?>

【问题讨论】:

  • var_dump($manager) 的输出是什么?
  • 如果我将 echo 语句更改为 var_dump($manager) 脚本仍然会冻结并且不会返回输出,所以我不确定:/ 我假设它必须有一些字符或某些东西不喜欢,但是 TBH 我迷路了:P
  • 在设置$manager 之后立即执行(在尝试设置json_encode() 之前)。注释掉 echo 行和 json_encode 行。可能只是您正在创建的对象由于某种原因无法进行 JSON 编码。
  • 刚刚尝试过,仍然冻结:/ 奇怪的是,如果我删除 echo 语句,它将运行良好(它将 JSON 编码对象并返回空白警报语句)。这就是让我相信这是 echo 语句失败的原因。
  • 非常有趣...刚刚解决了这个问题。显然,我的字符串中有双引号导致回显失败。我使用 str_replace("\"", "'", $json) 将双引号更改为单引号,并且字符串完美返回...有人知道这是为什么吗?(​​这只发生在 ajax 调用中)

标签: php ajax json


【解决方案1】:

除了" 字符(正如您所发现的那样)之外,您还需要更多地逃避。 在这种情况下,问题在于 " 结束了字符串,而 JSON 不希望在 " 之后出现一个字符,而是 ,]} 那里。

这个问题的答案将帮助您进一步转义字符:click

对于测试 JSON:JSONlint

【讨论】:

  • 谢谢 Steven,我查看了链接,但我认为问题有点不同。我什至无法让字符串返回到调用 ajax 函数,它在 PHP 脚本中冻结并且从未返回。我假设这是因为 json_encode 创建了没有转义双引号的字符串,并且在尝试回显该字符串时它会崩溃。不过还是不确定..
【解决方案2】:

嗯,

我正在研究推理,但我相信这应该足以帮助遇到此问题的任何人:

我的 JSON 字符串中的双引号(编码对象时由 json_encode 创建的双引号)导致“echo”语句失败。为了解决这个问题,我使用以下代码将所有未转义的双引号替换为转义的双引号:

str_replace( " \" " , " \\\" " , json_encode($object) )

我认为这是 json_encode 没有自行转义双引号的结果,并且仅在尝试从 ajax 请求调用的外部脚本中“回显”时才会发生。

谢谢大家:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2015-10-18
    相关资源
    最近更新 更多