Либо то, что советовал C Man (разделить поисковую фразу и поиск по каждому слову), либо полнотекстовый поиск.
Для метода "расщепления слов" я бы посоветовал:
- использовать регулярные выражения для разбиения, что-то вроде
preg_match_all('#[a-zA-Z0-9]+#', $text, $words)
;Вам не нужно искать такие символы, как "$", не так ли? - написать функцию, которая будет генерировать для вас предложение
where
.
Функция для генерации where
Предложение может выглядеть следующим образом:
function generateFilter(array $fields, array $words) {
// prepare $word for putting into SQL statement
foreach ( $words as &$word ) {
// ensure that wildcard characters are used as regular characters
$word = str_replace('%', '\\%', $word);
$word = str_replace('_', '\\_', $word);
// prevent SQL injections
$word = mysql_real_escape_string($word);
}
unset($word);
// generate filter
$filter = array();
foreach ( $words as $word ) {
$wordFilter = array();
foreach ( $fields as $field ) {
$wordFilter[] = "{$field} like '%$word%'";
}
$filter[] = implode(' or ', $wordFilter);
}
$filter = '(' . implode(') and (', $filter) . ')';
return $filter;
}
$filter = generateFilter(
array('name', 'surname', 'address'),
array('john', 'doe')
);
echo $filter;
Результат:
(name like '%john%' or surname like '%john%' or address like '%john%') and
(name like '%doe%' or surname like '%doe%' or address like '%doe%')
Если вы используете подготовленные операторы (что настоятельно рекомендуется), эта функция будет немного более сложной, так как в результатестрока будет иметь заполнители для переменных, в то время как $ words будет помещен в некоторый массив переменных, которые должны быть связаны с подготовленным оператором.
Метод «Разделение слов» работает для небольших строк и небольших объемов данных.,Если у вас есть большие объемы данных и / или большие строки, рассмотрите возможность использования полнотекстового поиска.Он не требует разделения поисковой фразы, хотя имеет некоторые ограничения - ему нужен полнотекстовый индекс по столбцам, которые используются для поиска (IIRC, вы можете создать индекс по нескольким столбцам и затем использовать полнотекстовый поиск по всем индексированным столбцам одновременно,т. е. вам не нужно искать каждый столбец отдельно), он имеет минимальную длину ключевого слова и может давать не строгие результаты, например, иногда в результате могут появляться только 3 из 5 ключевых слов.Тем не менее, это дает релевантность каждого результата - результаты, которые ближе к условиям поиска, будут иметь более высокую релевантность.Это полезно для сортировки результатов по релевантности.
Хотя создание индекса может показаться вам «дополнительной работой», это позволит СУБД выполнять поиск быстрее, чем без индекса.