首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >json_decode在godaddy主机上失败

json_decode在godaddy主机上失败
EN

Stack Overflow用户
提问于 2012-12-14 23:48:24
回答 1查看 3.6K关注 0票数 16

我在PHP中使用json_decode来解析POST中的数据( POST本身是通过ajax执行的)。我的代码如下所示:

$data = json_decode($_POST['logdata'], true);
if(!$data) {
    $ecodes = array(
    JSON_ERROR_NONE           => "No error has occurred",
    JSON_ERROR_DEPTH          => "The maximum stack depth has been exceeded",
    JSON_ERROR_STATE_MISMATCH => "Invalid or malformed JSON",
    JSON_ERROR_CTRL_CHAR      => "Control character error, possibly incorrectly encoded",
    JSON_ERROR_SYNTAX         => "Syntax error",
    JSON_ERROR_UTF8           => "Malformed UTF-8 characters, possibly incorrectly encoded"
    );
    $err = json_last_error();
    $result = array("error" => 1, "error_msg" => "Invalid log data: " . $ecodes[json_last_error()]);
    echo json_encode($result);
    exit;
}

...  //use $data array

这段代码运行良好。当在我本地的linux机器或我的mac上执行时,传递的数据被正确解码,一切工作正常。然而,当相同的代码在godaddy共享主机上执行时,解码失败并出现语法错误。在花费大量时间尝试缩小问题范围之后,我发现当JSON对象属性的值中包含<>字符时,就会出现问题。

javascript中的上传部分(ajax)如下所示:

$.ajax({
    url:        '/emaillog.php',
    type:       'POST',
    dataType:   'json',
    data:       { logdata: JSON.stringify(this.logData[this.scenarioLogId]) },
    cache:      false,
    error:      function(jqXHR, textStatus, errorThrown) {
        alert("Error occurred during upload: " + textStatus);
    },
    success:    function(data, textStatus, jqXHR) {
        var msg = data.error
                  ? "An error occurred processing action log: " + data.error_msg
                  : "Action log processed successfully.";
        alert(msg);
    }
})

正如您所看到的,POST参数的值是使用JSON.stringify创建的,并且经过检查(客户端和服务器端)是正确的。如果重要的话,下面是提交的POST参数的一个示例值:

{
    "scenarioId":"1",
    "scenarioName":"MOH",
    "startTime":1355496349,
    "log":[
        {
         "role":"Leader",
         "task":"MOH",
         "response":"start",
         "time":1355496349
        },
        {
         "role":"Head",
         "task":"<span class=\"bold\">Assign Role</span>",
         "response":"done",
         "time":1355496351
        }
    ]
}

如果删除了数组中的最后一个元素(具有任务分配角色),则一切都将成功处理。如果我再次用空格替换<>>字符,一切都是正常的。

由此产生了两个问题:

  1. 如果在这样的JSON字符串上出现语法错误是正确的行为,那么为什么我在其他两个环境中看不到错误?另外,为什么JSON.stringify会产生错误的字符串呢?如果这样的

字符串上的语法错误是不正确的行为,那么

  1. 的PHP实现或JSON就一定出了问题

请注意,虽然我显式地询问了godaddy,但只有当它是代码产生错误的唯一提供程序时,它才是相关的。有没有人能解释一下这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-19 04:18:35

无论出于什么原因,当我提交表单时,在godaddy主机上(可能也在其他地方,但不是我测试过的其他地方),服务器转义了引号--这就是导致问题的原因。这个问题的解决方案很简单:不做

$data = json_decode($_POST['logdata'], true);

我做到了

$data = json_decode(stripslashes($_POST['logdata']), true);

一切都运行得很完美。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13881919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档