проблема с автозаполнением JQuery и MySql - PullRequest
3 голосов
/ 10 июня 2011

search.php

$text = $mysqli->$_POST['term'];
$query = "SELECT name FROM males WHERE name LIKE '%" . $text . "%' ORDER BY name ASC";
$result = $mysqli->query($query);
$json = '[';
$first = true;
while($row = $result->fetch_assoc())
{
    if (!$first) { $json .=  ','; } else { $first = false; }
    $json .= '{"value":"'.$row['name'].'"}';
}
$json .= ']';
echo $json;

index.php

1) HTML

<body>
Text: <input type="text" id="autocomplete" />
</body>

2) jQuery

    $( "#autocomplete" ).autocomplete({
        source: function(request, response) {
            $.ajax({ url: "http://localhost/testing/auto/search.php",
            data: { term: $("#autocomplete").val()},
            dataType: "json",
            type: "POST",
            success: function(data){
                response(data);
            }
        });
    },
    minLength: 2
    });

Когда я набираю 2 буквы, мне выдаются все имена в моей базе данных, даже если эти две буквы не соответствуют ни одному из имен.

Как это происходит и как это исправить?

Ответы [ 6 ]

1 голос
/ 10 июня 2011

Похоже, мой комментарий работал как ответ, отсюда и этот ответ.

Что делает $mysqli->$_POST['term']? Я думаю, что вы должны иметь $text = $_POST['term'];. Это должно работать.

1 голос
/ 10 июня 2011

Измените PHP на

$text = $_POST['term'];

$query = "SELECT name FROM males WHERE name LIKE '%" . $mysqli->real_escape_string($text) . "%' ORDER BY name ASC";
$result = $mysqli->query($query);

echo json_encode($result->fetch_all(MYSQLI_ASSOC));

Вы забыли экранировать ввод для предотвращения SQL-инъекций.Кроме того, используйте ответ @ mu, чтобы исправить ваш код переднего плана.

1 голос
/ 10 июня 2011

Ваш source обратный вызов не делает то, что вы думаете.Текущее содержимое автозаполнения находится в request.term, а не в $("#autocomplete").val().Вы отправляете пустое значение для term обратно в ваш PHP, а затем ваш SQL выглядит следующим образом:

SELECT name FROM males WHERE name LIKE '%%' ORDER BY name ASC

, который из всех соответствует всем в вашей таблице males.Ваш обратный вызов source должен выглядеть следующим образом:

source: function(request, response) { 
    $.ajax({
        url: "http://localhost/testing/auto/search.php",
        data: { term: request.term },
        dataType: "json", 
        type: "POST", 
        success: function(data) { 
            response(data);  
        }
    });
}   

Виджет jQuery-UI, вероятно, корректно управляет DOM, поэтому элемент ввода #autocomplete может не иметь ничего полезного, пока автозаполнитель не имеетокончательное значение для него.

Для справки, вот что говорит точное руководство :

Третий вариант, обратный вызов, обеспечивает наибольшую гибкость,и может быть использован для подключения любого источника данных к автозаполнению.Обратный вызов получает два аргумента:

  • A request объект с единственным свойством, называемым term, которое ссылается на значение, в настоящее время находящееся в текстовом вводе.Например, когда пользователь ввел «новый йо» в поле города, термин «автозаполнение» будет равен «новый йо».
0 голосов
/ 28 февраля 2013

Используйте $_REQUEST['term'] вместо $_POST['term'].

0 голосов
/ 10 июня 2011

Я думаю, что ваш запрос sql.Вы использовали

$query = "SELECT name FROM males WHERE name LIKE '%$text%' ORDER BY name ASC"

, если ваш список имен похож на

Aaron Alexander Maartha ...

Если вы введете «AA», приведенный выше запрос приведет к: Aaron,Maartha.Потому что запрос будет искать соответствующую строку между целыми строками.% text% означает, что результат запроса будет игнорировать левый и правый результаты.

, если вы ищете данные поля имен, вы должны использовать запрос

$query = "SELECT name FROM males WHERE name LIKE '$text%' ORDER BY name ASC"

Если вы введете 'AA,это приведет: Aaron.

Обратите внимание, что jQuery возвращает только то, что вы просите, в базу данных.

0 голосов
/ 10 июня 2011

Сначала убедитесь, что ваш search.php работает.Переключитесь на $ _GET ['term'] и запускайте страницу напрямую, пока не получите нужные данные.

Я бы лично изменил запрос с LIKE '% text%' на LIKE 'text%'.

После этого используйте Firebug для проверки параметров, которые передаются в search.php с помощью вызова AJAX.Кстати, вы уверены, что ваш код JQuery является правильным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...