Как я могу вернуть конкретные значения при использовании json_encode с помощью jquery.ajax()?

#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] ). Вы могли бы проанализировать это самостоятельно, но лучшим решением может быть выполнение одного (или обоих) из следующих действий:

  1. Добавьте dataType = "json" к вызову ajax() , чтобы сообщить jQuery, что вы ожидаете JSON в качестве ответа; затем jQuery проанализирует результат и предоставит вам data объект, с которым вы можете работать, а не просто строку. Также обратите внимание, что alert() принимает только один аргумент, все последующие будут просто проигнорированы.

  2. Обновите свой PHP, чтобы отвечать правильным типом содержимого header('Content-type: application/json'); — это позволит jQuery автоматически определить, что ответ JSON, и он проанализирует его для вас, не требуя dataType значения. Это также облегчит задачу другим пользователям, поскольку вы будете явно указывать тип данных.

Комментарии:

1. Потрясающе! Получилось. Спасибо.. предупреждение было просто для отладки. На самом деле я использую обе переменные для создания URL-адреса для перенаправления пользователя, и это работает отлично. Еще раз спасибо.

2. @bob_cobb Отлично, рад быть полезным 🙂

Ответ №2:

Обычно я использую следующее для обработки возвращаемого объекта json:

 data = $.parseJSON(data);
  

Тогда data.lastID должен возвращать значение, которое вы ожидаете для lastID.