сбой декодирования json на хостинге godaddy


Я использую json_decode в своем PHP для анализа данных из 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 и является правильным при проверке (как на стороне клиента, так и на стороне сервера). Если это имеет значение, вот пример значения параметров отправленной записи:

{
    "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 затем выдает неправильную строку?

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

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

Author: Aleks G, 2012-12-14

1 answers

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

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

Я сделал

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

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

 14
Author: Aleks G, 2012-12-18 20:18:35