dataType: "JSON" не будет работать
Я пытаюсь отправить несколько переменных из файла php в ajax, используя json в массиве. Код в php-файле работает отлично и делает все с моей базой данных, как должно. Но как только я добавляю dataType: "json" в ajax, в php-файле больше ничего не происходит. Я немного погуглил, и некоторые люди упоминали, что это может быть проблема с браузером, но пока что это не работает ни в Firefox, ни в Chrome, ни в IE. Я использую последнюю версию jQuery.
Вот что происходит внутри php:
<?php
//Create variables and update database
echo json_encode(array("id" => "$realid", "un" => "$username", "date" => "$date"));
?>
И это код Ajax:
.ajax(
{
url: 'UpdateComments.php',
type: 'POST',
dataType: "json",
data:
{
type: "add",
comment: $("#comment").val(),
id: videoID
},
success: function (data)
{
//Get the data variables from json and display them on page
}
});
Я не разбираюсь в этом, любой совет будет принята с благодарностью!
5 ответов
Общая проблема заключается в том, что браузер печатает "что-то еще" перед JSON, независимо от того, является ли он каким-либо читаемым или нечитаемым(невидимым) символом. Попробуйте сделать что-то вроде этого:
<?php
//at the very beginning start output buffereing
ob_start();
// do your logic here
// right before outputting the JSON, clear the buffer.
ob_end_clean();
// now print
echo json_encode(array("id" => $realid, "un" => $username, "date" => $date));
?>
Теперь все дополнительные данные (до JSON) будут отброшены, и у вас должно получиться...
Легко забыть о echo
или var_dump()
который вы, возможно, использовали в прошлом, чтобы проверить, как работает ваш сценарий.
В моем собственном сценарии у меня был var_dump()
, о котором я забыл, он не использовал текст JSON_encode-ed и отправлял простой текст в браузер. Это нарушило требование dataType:"json" и привело к тому, что функция успеха не сработала.
Мне потребовалось время, чтобы найти проблему, так как у меня было ctrl+f(ред) дляecho
только и забыл про бродягу var_dump()
.
printf
вероятно, еще один подозреваемый.
Я полагаю, что если вы используете dataType, вы должны использовать contentType, "Официальный тип мультимедиа в Интернете для JSON - это application/json".
.ajax(
{
url: 'UpdateComments.php',
type: 'POST',
contentType: "application/json",//note the contentType defintion
dataType: "json",
data:
{
type: "add",
comment: $("#comment").val(),
id: videoID
},
success: function (data)
{
//Get the data variables from json and display them on page
}
});
$.ajax({
url: '/route/',
type: 'POST',
dataType: "json",
data:
{
type: "add",
comment: $("#comment").val(),
id: videoID
},
success: data => {console.log(data);}
});
<?php
ob_start();
ob_end_clean();
echo json_encode(array("id" => "$realid", "un" => "$username", "date" => "$date"));
?>
Я бы не использовал dataType, если он вызывает у вас проблемы, также я лично не использовал объект в качестве значения данных, прежде чем, может быть, это как-то связано с этим?
Во всяком случае, я настроил основную рутину ajax, надеюсь, это поможет.
$.ajax(
{
url: 'UpdateComments.php',
type: 'POST',
data:
{
type: "add",
comment: $("#comment").val(),
id: videoID
},
success: function (response)
{
//Get the data variables from json and display them on page
var data = $.parseJSON(response);
alert(data.id);
}
});
Если вы установите dataType в jQuery, это фактически установит атрибут заголовка Content-Type. Возможно, в вашем PHP-скрипте вам нужно будет объявить этот MIME-тип принятым. Заметили ли вы, что код даже входит в PHP-скрипт, когда вы делаете запрос? Я сомневаюсь, что это проблема браузера, если он не работает в Firefox, Chrome или IE.
Чтобы получить лучшую перспективу в вашем AJAX-запросе, подпишитесь на событие ajaxBeforeSend (не уверен, правильно ли указано имя события, проверьте jQ docs) и зарегистрируйте объект xhr.
Попробуйте определить обработчик ошибок как часть вызова $.ajax
$.ajax({
...,
error: function(xml, error) {
console.log(error);
}
});
Затем проверьте консоль отладки на наличие ошибок, которые могут помочь вам диагностировать проблему.