Json_decode не работает на ходьбе

Я использую json_decode в своем PHP для анализа данных из 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.

Загружающая часть (ajax) в javascript выглядит так:

$.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
        }
    ]
}

Если последний элемент в массиве (с задачей Assign Role) удаляется, все обрабатывается успешно. Если я заменю символы < и > > пробелами, то все будет хорошо.

Из этого вытекают два вопроса:

  • Если синтаксическая ошибка в такой строке JSON является правильной, то почему я не вижу ошибку в двух других средах? Кроме того, почему JSON.stringify создает неправильную строку?

  • Если синтаксическая ошибка в такой строке JSON является неправильным поведением, то что-то должно быть не так с реализацией или конфигурацией PHP godaddy.

Обратите внимание, что, хотя я явно спросил о godaddy, он имеет значение только в том случае, если он является единственным провайдером, где код создает ошибку. Кто-нибудь может пролить свет на эту ситуацию?

Ответы

Ответ 1

По какой-то причине, только на ходьбе-ходьбе (возможно, в некоторых других местах, но не в других местах, которые я тестировал), когда я отправлял форму, сервер избегал кавычек - и это вызывало проблему. Решение проблемы было довольно простым: вместо выполнения

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

Я сделал

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

и все работает отлично.