Как можно взорвать слова из поля с несколькими значениями?

У меня есть эта таблица: 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, я не беру слов.
Но когда я набираю первое слово элементов (квартира), я беру все слова.

Слова не уникальны

0

Решение

Общий подход к этому состоит в том, чтобы добавить | слева от поля, затем найдите его. Это гарантирует, что элемент, содержащий поиск, не будет сопоставлен.

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);
}
}
1

Другие решения

Попробуйте использовать это, чтобы получить все возможные результаты

$elements=$db->fetchRow("select distinct `elements` from TABLE_ELEMENTS where lower(`elements`) like lower('%$term%') limit 10");
0