Я пытаюсь создать раскрывающийся список, используя 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 с пропуском как «значение параметра» и пользователь как «текст опции».