jQuery JSON отключается, не заселяя

Я пытаюсь создать раскрывающийся список, используя jQuery, PHP и mySQL, вот мой код,

HTML:

<select id="box"></select><br /> <input id="button" type="button" value="populate" /> 

Javascript / JQuery:

 $(document).ready(function() { $("#button").click(function (){ $.getJSON("test_post.php", function(data){ $.each(data, function(user) { $('#box').append( $('<option></option>').html(user) ); }); }); }); }); 

PHP:

 mysql_connect('localhost', 'user', '1234'); mysql_select_db('json'); $test = mysql_query('SELECT user,pass FROM login WHERE user="john"'); while($row = mysql_fetch_array($test, true)) { $data .= json_encode($row); }; echo $data; 

У меня есть 3 записи в базе данных, и когда я запускаю файл test_post.php, он отгоняет JSON, но когда я пытаюсь его заполнить, ничего не происходит!

Любая идея почему?

В вашем коде есть несколько проблем.

Во-первых: попытайтесь использовать неопределенные переменные $data , вы должны были инициализировать его до пустой строки перед циклом while: $data = ''; , в противном случае это может отправить уведомление PHP с ответом JSON в зависимости от значений параметров display_errors и error_reporting .

Второй: как сказал @shamittomar, $data должен быть массивом, а json_encode() нужно вызывать только один раз для всего массива. Пока вы отправляете несколько объектов JSON, конкатенированных в одну строку, что неверно.

В-третьих: значение параметра user функции в JavaScript на самом деле является индексом массива data , а не значением , но даже если бы user был значением, это был бы объект JavaScript с свойствами user и pass , а не строка .

Результирующий код должен быть (только с измененными частями):

PHP

 $data = array(); while ($row = mysql_fetch_array($test, true)) { $data[] = $row; }; echo json_encode($data); 

JavaScript

 $.each(data, function(i, user) { $('#box').append( $('<option></option>').html(user.user) ); }); 

Попробуйте взять json_encode из цикла while и закодировать его в конце. Как это:

 while($row = mysql_fetch_array($test, true)) { $data[] = $row; } $data = json_encode($data); echo $data; 

[EDIT]: После комментария к OP:

Если вы просто хотите, чтобы имя пользователя выпадало, сделайте следующее:

 while($row = mysql_fetch_assoc($test)) { $data[$row['user']] = $row; } $data = json_encode($data); echo $data; 

Вы пробовали проверить JSON? jQuery довольно разборчив в отношении JSON: он должен правильно проверять, без комментариев и правильного типа контента! Попробуйте добавить на свой PHP следующее, чтобы узнать, помогает ли это (я всегда это делаю)

header('Content-type: application/json');

Прежде всего проверить код подключения mysql в порядке?

 mysql_connect('localhost', 'user', '1234'); 

Обновленный php-код, как показано ниже,

 mysql_connect('localhost', 'user', '1234'); mysql_select_db('json'); $test = mysql_query('SELECT user,pass FROM login WHERE user="john"'); while($row = mysql_fetch_array($test, true)) { $data['pass '] = $row['pass']; $data['user'] = $row['user']; }; echo json_encode($data); die(); 

Код Javascript:

 $("#button").click(function (){ $.getJSON('getDropdownData.php', '',function(data){ $("#box").remove(); $('<option />', {value: '', text: 'Select option'}).appendTo("#box"); $.each(data,function(key, value){ $('<option />', {value: key, text: value}).appendTo("#box"); }); }); }); 

Затем вы получите dorpdown с пропуском как «значение параметра» и пользователь как «текст опции».