автозаполнение пользовательского интерфейса jquery с помощью базы данных


Я довольно новичок в jQuery и, возможно, пытаюсь достичь чего-то, что может быть немного сложнее для новичка. Однако я пытаюсь создать автозаполнение, которое отправляет текущее значение в PHP-скрипт, а затем возвращает необходимые значения.

Вот мой код Javascript

$("#login_name").autocomplete({
    source: function(request, response) {
 $.ajax({
     url: "http://www.myhost.com/myscript.php",
     dataType: "jsonp",

     success: function(data) {
  alert(data);
  response($.map(data, function(item) {
      return {
   label: item.user_login_name,
   value: item.user_id
      }
  }))
     }
 })
    },
    minLength: 2
});

А вот и последняя половина"myscript.php "

while($row = $Database->fetch(MYSQLI_ASSOC))
{
    foreach($row as $column=>$val) 
    {
        $results[$i][$column] = $val;
    }
    $i++;
}
print json_encode($results);

, который выдает следующий результат

[{"user_id":"2","user_login_name":"Name1"},{"user_id":"3","user_login_name":"Name2"},{"user_id":"4","user_login_name":"Name3"},{"user_id":"5","user_login_name":"Name4"},{"user_id":"6","user_login_name":"Name5"},{"user_id":"7","user_login_name":"Name6"}]

Кто-нибудь может сказать мне, где я ошибаюсь, пожалуйста? Начинаю становиться совсем несостоявшийся. Поле ввода просто становится "белым", и никакие параметры не отображаются. Код действительно работает, если я указываю массив значений.

ОБНОВЛЕНИЕ Я изменил код на и по-прежнему не везет.

$("#login_name").autocomplete({
    source: "/ajax/login_name.php",
    dataType: "json",
    minLength: 2,
    cache: false,
    select: function(event, ui) {
        alert(ui);
    }
});

Используя инструмент веб-разработчика FireFox, я получаю сообщение об ошибке "b равно нулю".

Author: bigstylee, 2010-03-29

7 answers

Наконец-то нашел решение, которое соответствует моим потребностям

$("#login_name").autocomplete({
  source: function(request, response){
    $.post("/ajax/login_name.php", {data:request.term}, function(data){     
        response($.map(data, function(item) {
        return {
            label: item.user_login_name,
            value: item.user_id
        }
        }))
    }, "json");
  },
  minLength: 2,
  dataType: "json",
  cache: false,
  focus: function(event, ui) {
    return false;
  },
  select: function(event, ui) {
    this.value = ui.item.label;
    /* Do something with user_id */
    return false;
  }
});
 19
Author: bigstylee, 2012-01-05 17:13:50

Некоторые предложения:

  1. Почему dataType= "jsop"? Похоже, это не jsonp. Я думаю, вы хотите "json".
  2. также вставьте cache : false в параметры. Это гарантирует, что запрос всегда выполняется и никогда не выполняется из кэша на стороне браузера.
  3. проверьте, идет ли вызов, с помощью чего-нибудь вроде Скрипача или Чарльза.
  4. называется ли ваш успех fn? У вас есть alert() там. Вызывается ли он?
  5. если у вас есть Firebug или инструменты разработчика IE8, вы можете поместить точка останова на alert() для проверки значения параметров.
  6. Зачем указывать полное имя хоста в URL-адресе? Прошлой ночью у меня была странная ситуация с автозаполнением, когда ответ был нулевым, пустой строкой, когда я использовал другое имя хоста для страницы и запроса Ajax. Когда я изменил его, чтобы использовать то же имя хоста, запрос был выполнен успешно. На самом деле из-за той же политики происхождения у вас вообще не должно быть имени хоста в URL-адресе для вызова ajax.
 4
Author: Cheeso, 2010-03-29 13:13:05

Да, вам действительно нужна информация о заголовке для вашего json

        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); 
        header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" ); 
        header("Cache-Control: no-cache, must-revalidate" ); 
        header("Pragma: no-cache" );
        header("Content-type: text/x-json");

И тванфоссон делает хорошую точку опоры на вилку

В любом случае я не думаю, что вы делаете вызов ajax, который делает плагин.

Если вы используете автокомплемент jquery-ui, вам следует прочитать документацию, чтобы запустить базовую версию. ваш php в порядке, если не считать отсутствующих данных заголовка

 2
Author: mcgrailm, 2017-05-23 11:53:43

На случай, если это кому-то еще понадобится:

Документация для автозаполнения в пользовательском интерфейсе jQuery указывает, что параметр строки запроса для использования является "термин", а не "q"... или, по крайней мере, сейчас.

E.g. http://www.myhost.com/myscript.php?term=someToSearchFor
 2
Author: CodeReaper, 2011-07-21 12:32:51

Простое автозаполнение пользовательского интерфейса Jquery для тех, кому это может понадобиться.

//select data from the table
$search = $db->query('SELECT Title from torrents');

//then echo script tags and variables with php
<?php echo '<script type="text/javascript">
 $(function() {
  var availableTags = [';
 foreach ($search as $k) {
  echo '"'.$k['Title'].'",';
}
  echo '];
$( "#tags" ).autocomplete({
  minLength:2, //fires after typing two characters
  source: availableTags
});
});
</script>';

 ?>

Ваша html-форма

<div id="search">
<form id="search-form">
<input id="tags" type="text" />
<input type="submit" value="Search" />
</form>
</div>
 1
Author: TenTen Peter, 2014-07-12 21:20:09

Структура JSON представляет собой плоскую строку, в то время как отображение ожидает массив или структуру, подобную массиву. попробуйте расшифровать строку в формате json перед использованием map.

 0
Author: pinaki, 2010-03-29 12:32:56

У меня тоже была проблема, как и у тебя. И теперь я это исправляю. Проблема в том, что мой json, возвращаемый с моего сервера, содержит синтаксическую ошибку.

В http://api.jquery.com/jQuery.getJSON / сообщает, что если в JSON есть какая-то ошибка, она завершится беззвучно. JSON должен соответствовать стандарту JSON здесь http://json.org/ .

Поскольку моя ошибка заключается в том, что моя строка в JSON заключена только в одну кавычку. Но стандарт JSON принимает только строки, заключенные в двойные кавычки.

Например. "Привет, мир", а не "Привет, мир"

Когда вы это исправите, вы можете установить источник в качестве строкового URL-адреса. Термин будет находиться в строке запроса "термин". И это работает!!

 0
Author: panawat wongkleaw, 2011-12-06 05:54:49