У меня есть несколько переменных, которые содержат имена клиентов и выглядят, например, как показано ниже:
$customer = $row["customer_name"];
Это будет содержать то есть test Microsoft test test test
Теперь в моей базе данных есть столбец customer
и столбец содержит Microsoft Netherlands Office
Чтобы посмотреть в базу данных, у меня есть как ниже, но это не дает мне никаких результатов:
$query="SELECT * FROM specific_req WHERE customer LIKE '%$customer%'";
Я хочу найти в таблице базы данных, которая содержит любое слово из $customer
,
Ты можешь использовать полнотекстовый поиск то есть MATCH AGAINST
,
$query="SELECT * FROM specific_req WHERE MATCH(customer) AGAINST ('$customer')";
Чтобы полный текст работал, вам нужно создать FULLTEXT INDEX
на customer
колонка.
ALTER TABLE specific_req ADD FULLTEXT KEY `idx_customer` (`customer`)
Примечание: продезинфицировать $customer
чтобы избежать инъекций sql
Один из способов сделать это — разделить $customer
переменная в массив поисковых терминов, это позволяет искать каждый термин отдельно в таблице.
$customer = "test Microsoft test test test";
$customers = explode(" ", trim($customer));
$queryString = "";
$customers = array_unique($customers);
foreach($customers as $c) {
$queryString .= "`customer` LIKE '%{$c}%' OR ";
}
$queryString = rtrim($queryString, " OR ");
$query = "SELECT * FROM specific_req WHERE {$queryString}";
echo $query;
Это сделало бы $query
выход
SELECT * FROM specific_req WHERE `customer` LIKE '%test%' OR `customer` LIKE '%Microsoft%'
Все, что мы делаем, это используем PHP explode()
функция, ломая вашу переменную в каждом символе пробела (после использования trim()
удалить начальные и конечные пробелы, чтобы избежать поисков, таких как '%%'
). Это дает нам массив значений, которые мы затем запускаем через foreach()
петля, здание $queryString
чтобы соответствовать синтаксису SQL требуется.
ПРЕДУПРЕЖДЕНИЕ: Это решение может быть уязвимым для SQL-инъекций, которые могут быть исправлены путем экранирования $c
переменная внутри цикла.
Создайте регулярное выражение альтернативных совпадений в PHP и запустите его на SQL:
$customer = "(" . implode('|', array_unique(explode(' ', $customer))) . ")";
$sql = "SELECT * FROM specific_req WHERE customer REGEXP '{$customer}'";