#php #jquery #ajax #json
#php #jquery #ajax #json
Вопрос:
Мне интересно, как ссылаться на конкретные переменные в моей функции успеха jquery.ajax().
Мой php-код на addit.php
if ($_POST) {
$user_id = $_SESSION['user_id'];
$filename = $_SESSION['filename'];
$quote = $_POST['quote'];
$query = "INSERT INTO `submissions` (
`id` ,
`user_id`,
`quote` ,
`filename` ,
`date_added` ,
`uploaded_ip`
)
VALUES (
NULL , '{$user_id}', '{$quote}', '{$filename}', NOW(), '{$_SERVER['REMOTE_ADDR']}')
";
$db = DbConnector::getInstance();
$db->insert($query);
// remove funky characters from the quote
$cleanRemove = preg_replace("/[^a-zA-Z0-9s]/", "", $quote);
// replace any whitespace with hyphens
$cleanQuote = str_ireplace(" ", "-", $cleanRemove);
// get the id of the last row inserted for the url
$lastInsertId = mysql_insert_id();
$returnUrl = array ("lastId"=>$lastInsertId, "cleanQuote"=>$cleanQuote);
echo json_encode($returnUrl);
}
Мой код jQuery:
$.ajax({
type: "POST",
url: "addit.php",
data: ({
// this variable is declared above this function and passes in fine
quote: quote
}),
success: function(msg){
alert(msg);
}
});
Возвращает в предупреждении:
{"lastId":91,"cleanQuote":"quote-test-for-stack-overflow"}
Как я могу теперь ссылаться на это в функции успеха? Я пытался сделать что-то подобное, но это не сработало (возвращает «undefined» в предупреждении):
$.ajax({
type: "POST",
url: "addit.php",
data: ({
// this variable is declared above this function and passes in fine
quote: quote
}),
success: function(data){
alert(data.lastId,data.cleanQuote);
}
});
Ответ №1:
Похоже, что ответ JSON не преобразуется в объект, поэтому alert()
отображается вся строка (в противном случае вы бы увидели [object Object]
). Вы могли бы проанализировать это самостоятельно, но лучшим решением может быть выполнение одного (или обоих) из следующих действий:
-
Добавьте
dataType = "json"
к вызовуajax()
, чтобы сообщить jQuery, что вы ожидаете JSON в качестве ответа; затем jQuery проанализирует результат и предоставит вамdata
объект, с которым вы можете работать, а не просто строку. Также обратите внимание, чтоalert()
принимает только один аргумент, все последующие будут просто проигнорированы. -
Обновите свой PHP, чтобы отвечать правильным типом содержимого
header('Content-type: application/json');
— это позволит jQuery автоматически определить, что ответ JSON, и он проанализирует его для вас, не требуяdataType
значения. Это также облегчит задачу другим пользователям, поскольку вы будете явно указывать тип данных.
Комментарии:
1. Потрясающе! Получилось. Спасибо.. предупреждение было просто для отладки. На самом деле я использую обе переменные для создания URL-адреса для перенаправления пользователя, и это работает отлично. Еще раз спасибо.
2. @bob_cobb Отлично, рад быть полезным 🙂
Ответ №2:
Обычно я использую следующее для обработки возвращаемого объекта json:
data = $.parseJSON(data);
Тогда data.lastID должен возвращать значение, которое вы ожидаете для lastID.