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);
  }
});

Затем проверьте консоль отладки на наличие ошибок, которые могут помочь вам диагностировать проблему.

Другие вопросы по тегам