У меня есть эта таблица: TABLE_ELEMENTS, с именем ELEMENTS, у меня есть несколько значений внутри, см. Изображение.
Это php и возврат результатов из запроса автозаполнения.
$("#autocomplete").autocomplete({
source: "http://localhost/include/autocomplete.php?type=mauto_complete",
Сначала я называю это ..
if(isset($_GET['type']) && in_array($_GET['type'], $arr_action)) $type=$_GET['type'];
if($type == "mauto_complete") {
require_once $config_abs_path."/autocomplete/autocomplete.php";
if(isset($_GET['term'])) {
$term = escape($_GET['term']);
$response = mauto_complete::getAutocomplete($term);
echo json_encode($response);
}
}
И это второй файл .auto.php
function getAutocomplete ($ term) {
global $db;
global $config_table_prefix;
global $crt_lang;
$elements=$db->fetchRow("select Distinct `elements` from TABLE_ELEMENTS where `elements` like '$term%' limit 10");
$elements_array = explode("|", $elements);
return $elements_array;
}
Я должен написать это после выбора
$elements_array = explode("|", $elements);
Хорошо, запрос работает нормально, но в результатах автозаполнения, когда я набираю слово Building, я не беру слов.
Но когда я набираю первое слово элементов (квартира), я беру все слова.
Слова не уникальны
Общий подход к этому состоит в том, чтобы добавить |
слева от поля, затем найдите его. Это гарантирует, что элемент, содержащий поиск, не будет сопоставлен.
select
Distinct `elements`
from
TABLE_ELEMENTS
where
lower(CONCAT('|', `elements`)) LIKE lower('%|$term%')
Тем не менее, вы, вероятно, ищете что-то еще. Ниже я подхожу к этому. Я не мог понять, какую библиотеку вы использовали для подключения, поэтому вам, возможно, придется немного изменить ее, чтобы она работала на вас.
function getAutocomplete($name, $term)
{
// make sure you escape the string to avoid SQL injection
$name = mysqli_real_escape_string($db, $name);
// make the searches case-insensitive
$term = strtolower($term);
// fetch the valid elements for the field and split them using explode
$elements = $db->fetchRow("SELECT `elements` FROM `TABLE_ELEMENTS` WHERE `name` = '$name'");
$elements_array = explode('|', $elements);
// make an array to save the matching elements
$filtered = array();
// iterate over each element to check for a match
foreach($elements_array as $element)
{
// check to see if the beginning of the element starts with the search term
if(strpos(strtolower($element), $term) === 0)
{
// add it to the filtered array
$filtered[] = $element;
}
}
// return the matching results
return $filtered;
}
Затем, чтобы использовать его, укажите, для какого поля вы хотите выполнить автозаполнение:
print_r(getAutocomplete('Property Type', 'B'));
// Outputs: Array
// (
// [0] => Building
// [1] => Bungalow
// [2] => Business
// )
Чтобы ваш существующий код использовал его, измените ваш JavaScript, чтобы он соответствовал следующему. Вам нужно будет изменить имя в зависимости от того, какое поле вы заполняете автоматически.
$("#autocomplete").autocomplete({
source: "http://localhost/include/autocomplete.php?type=mauto_complete&name=Property%20Type"});
Затем обновите файл, в котором вы вызываете функцию getAutocomplete:
if(isset($_GET['type']) && in_array($_GET['type'], $arr_action)) $type=$_GET['type'];
if($type == "mauto_complete") {
require_once $config_abs_path."/autocomplete/autocomplete.php";
if(isset($_GET['term']) && isset($_GET['name'])) {
$name = $_GET['name'];
$term = $_GET['term'];
$response = mauto_complete::getAutocomplete($name, $term);
echo json_encode($response);
}
}
Попробуйте использовать это, чтобы получить все возможные результаты
$elements=$db->fetchRow("select distinct `elements` from TABLE_ELEMENTS where lower(`elements`) like lower('%$term%') limit 10");