сбой декодирования 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
}
]
}
Если удалить последний элемент в массиве (с задачей Назначить роль ), то все успешно обработан. Если я заменю символы <
и >
> пробелами, опять же, все будет в порядке.
Из этого вытекают два вопроса:
Если синтаксическая ошибка в такой строке JSON является правильным поведением, то почему я не вижу ошибки в двух других средах? Кроме того, почему
JSON.stringify
затем выдает неправильную строку?Если синтаксическая ошибка в такой строке JSON является неправильным поведением, то что-то должно быть не так с PHP godaddy реализация или конфигурация.
Обратите внимание, что, хотя я прямо спросил о godaddy, это имеет значение только в том случае, если это единственный поставщик, где код выдает ошибку. Кто-нибудь может пролить свет на эту ситуацию?
1 answers
По какой-то причине, только на хостинге godaddy (возможно, и в некоторых других местах, но не в других местах, которые я тестировал), когда я отправлял форму, сервер удалял кавычки - и это было причиной проблемы. Решение проблемы было довольно простым: вместо того, чтобы делать
$data = json_decode($_POST['logdata'], true);
Я сделал
$data = json_decode(stripslashes($_POST['logdata']), true);
И все работало отлично.