【问题标题】:json_decode fails on godaddy hostingjson_decode 在 godaddy 主机上失败
【发布时间】:2012-12-02 15:29:55
【问题描述】:

我在我的 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
        }
    ]
}

如果数组中的最后一个元素(带有任务分配角色)被删除,那么一切都被成功处理。如果我用空格替换 &lt;&gt;> 字符,那么一切都很好。

由此引发了两个问题:

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

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

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

【问题讨论】:

  • 我尝试使用 JS 进行编码并使用我的本地 PHP 安装进行解码,结果一切正常(duh)。我认为您需要向 GoDaddy 开罚单。
  • @ualinker 你好,这里有人来自未来。他们对你的票有回应吗?
  • 为未来的访问者链接:Why json_decode doesn't work for me?
  • @Braiam 嘿,你们已经有飞行汽车了吗?我不使用 GoDaddy 托管 - TS 可以。

标签: php json shared-hosting


【解决方案1】:

无论出于何种原因,仅在 Godaddy 主机上(可能也在其他一些地方,但不是在我测试的其他地方),当我提交表单时,服务器正在转义引号 - 这就是导致问题的原因。解决问题的方法很简单:而不是做

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

我做到了

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

一切都很完美。

【讨论】:

  • 虽然现在还不能真正确认,但您的问题可能是由于打开了非常过时的Magic Quotes 功能引起的。回到过去,共享主机启用此功能可能并不少见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多