Я видел много вопросов, связанных с передачей массива с метками и свойствами значения через JSON, но не так много о передаче строк. Моя проблема в том, что я не могу заполнить свой автозаполнение. Я запустил функцию дампа и получаю эти значения образцов, переданные через JSON, в автозаполнение:
0: 23456 1: 21111 2: 25698
Вот какой код:
$("#auto_id").autocomplete( { source: function(request,response) { $.ajax ( { url: "fill_id.php", data: {term: request.term}, dataType: "json", success: function(data) { //what goes here? } }) } });
Вот fill_id.php:
$param = $_GET['term']; $options = array(); $db = new SQLite3('database/main.db'); $results = $db->query("SELECT distinct(turninId) FROM main WHERE turninid LIKE '".$param."%'"); while ($row_id = $results->fetchArray()) { $options[] = $row_id['turninId']; } echo json_encode($options);
Моя автозаполнение остается пустой. Как мне изменить свой массив JSON, чтобы заполнить его? Или что я могу включить в свою функцию успеха ajax?
Вы можете в значительной степени придерживаться удаленной демонстрации автозаполнения пользовательского интерфейса jQuery: http://jqueryui.com/resources/demos/autocomplete/remote-jsonp.html
Чтобы получить результаты в списке автозаполнения, вам нужно поместить объект с меткой и значением в параметр ответа (который фактически является функцией) внутри вашей функции успеха ajax:
source: function( request, response ) { $.ajax({ url: "fill_id.php", data: {term: request.term}, dataType: "json", success: function( data ) { response( $.map( data.myData, function( item ) { return { label: item.title, value: item.turninId } })); } }); }
Но это будет работать, только если вы немного измените yor fill_id.php:
// escape your parameters to prevent sql injection $param = mysql_real_escape_string($_GET['term']); $options = array(); // fetch a title for a better user experience maybe.. $db = new SQLite3('database/main.db'); $results = $db->query("SELECT distinct(turninId), title FROM main WHERE turninid LIKE '".$param."%'"); while ($row_id = $results->fetchArray()) { // more structure in data allows an easier processing $options['myData'][] = array( 'turninId' => $row_id['turninId'], 'title' => $row_id['title'] ); } // modify your http header to json, to help browsers to naturally handle your response with header('Cache-Control: no-cache, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Content-type: application/json'); echo json_encode($options);
Конечно, когда у вас нет названия или чего-либо в вашей таблице, вы также можете просто оставить свой ответ так, как есть, и повторить идентификатор в своем обратном вызове. Важно отметить, что вы заполняете свою функцию response
в автозаполнении парой value / item:
// this will probably work without modifying your php file at all: response( $.map( data, function( item ) { return { label: item, value: item } }));
edit: обновлена ссылка ссылки на автозаполнение нового jQuery UI