Как получить доступ к элементам ассоциативного массива из ответа AJAX

#php #jquery #json #ajax

#php #jquery #json #ajax

Вопрос:

У меня есть сокращенный вызов ajax, который запускается при изменении поля выбора.

 <script type'text/javascript'>
    $('#selection_project').change(function(event) {
        $.post('info.php', { selected: $('#selection_project option:selected').val()},
            function(data) {
                $('#CTN').html(data);
           }
       );            
   }); 
</script>
  

Это работает, но ответ от сервера такой:

 if (isset($_POST['selected']))
    $selected = $_POST['selected'];
    $results['selected'] = $selected;
    $response = json_encode($results);

    echo $response;
  

$results — это ассоциативный массив со многими значениями из SQL-запроса.

Мой вопрос в том, как мне получить доступ к какому-либо конкретному элементу? Я пробовал такие вещи, как

 data.selected
  

или,

 data['selected']
  

Я также понимаю, что где-то в методе .post должен быть оператор, определяющий альтернативный тип данных, например

 'json', 
  

или

 datatype: 'json',
  

но после долгих поисков ни один пример, который я смог найти, не мог предоставить фактический синтаксис использования альтернативных типов данных в методе .post .
Я бы просто использовал метод .ajax, но после того, как я вытащил свои волосы, я не могу понять, почему он не работает, и .post был, поэтому я просто придерживался его.
Если бы кто-нибудь мог немного подтолкнуть меня в правильном направлении, я был бы очень признателен!!

РЕДАКТИРОВАТЬ: вот моя попытка .ajax, не могу понять, почему она не работает. Возможно, я слишком долго смотрел на это.

 <script type'text/javascript'>

    $('#selection_project').change(function(event) {
        $.ajax({ 
            type: 'POST',
            url : 'pvnresult.php',
            data: { selected: $('#selection_project option:selected').val()},
            dataType: 'json',
            success: function(data){
                $('#CTN').html(data);
            }
        });
    });

</script>
  

Ответ №1:

Попробуйте записать, что именно возвращается из info.php . Возможно, данных вообще нетamp;

 $('#selection_project').change(function(event) {
    $.post('info.php', {
        selected: $('#selection_project option:selected').val()},
        function(data) {
            console.log(data);
            $('#CTN').html(data);
       }
   );            
}); 
  

— Обновление. Извините, я не могу оставлять комментарии

Вы должны проанализировать свой json с помощью JSON.parse перед использованием:

 $('#selection_project').change(function(event) {
    $.post('info.php', {
        selected: $('#selection_project option:selected').val()},
        success: function(data){
            var result = JSON.parse(data);
            $('#CTN').html(data);
        }
    });
});
  

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

1. весь массив со всеми данными отображается в элементе #CTN.

2. @LoganVoss под массивом вы подразумеваете объект? ассоциативный массив в кодировке php json станет объектом в js. по крайней мере, в форме, которую вы представили в вопросе.

3. @KevinB да, то, что отображается, в основном {«0»: {«Project_ID»:»1″, «Global_Project_Number»:»99999″ и т. Д. До тех пор, пока я не добавил «выбранный» в конец.

4. да, это объект с "0" ключом. foo["0"].Project_ID

5. Я понял! также спасибо @KevinB, комбинация этого ответа и вашей помощи исправила это! Я сделал JSON. ПРОАНАЛИЗИРУЙТЕ и разобрались. Еще раз спасибо!

Ответ №2:

Обратите внимание: в вашем Javascript вы выполняли:

dataType: 'json',
success: function(data){
$('#CTN').html(data);
}

Это означает, что вы ожидаете JSON данных, а не просто простых HTML .
Теперь, чтобы получить ваши JSON данные в виде объекта, Javascript вы могли бы сделать:

         success: function(data){
            if(data){
               // GET THAT selected KEY 
               // HOWEVER, BE AWARE THAT data.selected  
               // MAY CONTAIN OTHER DATA-STRUCTURES LIKE ARRAYS AND/OR OBJECTS
               // IN THAT CASE, TO GET THE EXACT DATA, YOU MAY JUST DO SOMETHING LIKE:
               // IF OBJECT: 
               // $('#CTN').html(data.selected.THE_KEY_YOU_WANT_HERE);
               // OR IF ARRAY:
               // $('#CTN').html(data.selected['THE_KEY_YOU_WANT_HERE']);   
               $('#CTN').html(data.selected);                 
            }
        }
  

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

1. что вы имеете в виду? Я думал, что .html похож на изменение innerhtml элемента

2. @LoganVoss Да, вы используете .html() для изменения innerHTML любого объекта DOM в jQuery, но это только в том случае, если вы ожидаете HTML строку или обычную строку. Ваш код явно требует и ожидает JSON , что не совпадает с обычной строкой / HTML и, следовательно, будет вести себя не так, как вы ожидали.