Php godaddy主机上的json_解码失败

Php godaddy主机上的json_解码失败,php,json,shared-hosting,Php,Json,Shared Hosting,我在PHP中使用json\u 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 st

我在PHP中使用
json\u 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
$.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);
    }
})
这段代码运行良好。在本地linux机器或mac上执行时,传递的数据被正确解码,一切正常。但是,当在godaddy共享主机上执行相同的代码时,解码失败,出现语法错误。花了很多时间试图缩小问题的范围,我发现当JSON对象属性的值中有
字符时,就会出现问题

javascript中的上载部分(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
$.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
        }
    ]
}
{
“场景ID”:“1”,
“场景名称”:“MOH”,
“开始时间”:1355496349,
“日志”:[
{
“角色”:“领导者”,
“任务”:“卫生部”,
“响应”:“开始”,
“时间”:1355496349
},
{
“角色”:“头”,
“任务”:“分配角色”,
“回复”:“完成”,
“时间”:1355496351
}
]
}
如果删除了数组中的最后一个元素(具有task Assign角色),则所有内容都将成功处理。如果我用空格替换
>字符,同样,一切正常

由此产生了两个问题:

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

  • 如果这种JSON字符串上的语法错误是不正确的行为,那么godaddy的PHP实现或配置一定有问题


  • 请注意,虽然我明确询问了godaddy,但它只是在代码产生错误的唯一提供者的情况下才相关。任何人都可以了解这种情况吗?

    无论出于什么原因,在godaddy主机上(可能在其他一些地方也有,但在我测试的其他地方没有),当我提交表单时,服务器正在逃避引用-这就是问题的原因。这个问题的解决办法很简单:不是做

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


    一切都很好。

    我试着用JS编码,用我本地的PHP安装解码,结果一切顺利(duh)。“我想你需要向戈达迪开一张罚单。”“阿林克你好,这是来自未来的人。”。他们对你的票有回应吗?为未来的访客链接:@Braiam嘿,你们已经有飞车了吗?我不主持GoDaddy-TS主持。虽然现在还不能确认,但您的问题可能是由于启用了非常过时的功能造成的。早在那时,共享主机启用此功能可能并不少见。