Как сделать, чтобы поиск учитывал, если наименование введено слитно?
Подсказать решение по поиску на сайте? Пример: Hello world - так ищет, Helloworld - так не находит. Нужно решение, чтобы находил если даже юзер ввел слитно.
простое решение "в лоб": разбить на слова експлоде(), полученный массив либо объединить в в строку через имплоде() используя "%". Но тут будет лажа с подготовленными выражениями, то есть так делать не желательно, работать будет, но это дыра в безопасности. Чуть сложнее - то же разбиение, а потом циклом создать плейсхолдеры по количеству элементов массива и соответствующие данные в массиве подстановок.
FanatPHP, если тупо подставить выражение из строки поиска без препэйредов. В препэйред объединенная через % строка будет бесполезна, так как символ % является интерпретируемым знаком.
а зачем подставлять без препэйредов?
с какой стати она будет бесполезна?
нет вообще никакой разницы в том, как строка была подставлена в запрос - напрямую или через плейсхолдер, если там один лайк. а ему больше и не надо
ThunderCat экслодом можно разбить если есть какой нибудь разделитель.
К примеру если эксплодить сроку Helloworld то он вернет массив со значением Helloworld
ThunderCat, зависит от СУБД. Например, в Oracle можно строку с % биндить к параметру запроса и процент будет восприниматься like-ом не как символ, а как лексема поиска (поведение по умолчанию). Еще в Oracle можно настраивать вид экранирования процента, чтобы процент протащить в like именно как символ.
А если заменить пробелы на проценты сразу в запросе? where t.name like replace(:search_str, ' ', '%')
alexalexes, так наоборот нам нужно понять, что он ввел слитно или мог ввести слитно.
К примеру хранимая в бд Hello World, после запроса helloworld нам нужно найти совпадения и вернуть Hello World
FanatPHP, лайк должен содержать что-то типа 'вася%пупкин%лох'. если я передам эту строку в один плейсхолдер, поиск будет по строке содержащей эти символы %, а не выражение условного вайлдкарда.
Zhandoss, так, я неверно понял вопрос изначально. в обратную сторону (введение с пробелами) так как я описал найти можно, а вот слитное написание сравнить разве что через регулярки можно, или реплейс в строке из базы, значение ячейки с заменой пробела на пустую строку сравнить с пользовательской строкой.
Пользуйся SOUNDEX, он найдет если даже строка слитно
Отвечал тут
//Строка в таблице была Hello World
//Название базы test
//name название столбца
//Helloworld поисковая фраза
SELECT * FROM test WHERE SOUNDEX(name) LIKE CONCAT('%',SUBSTRING(SOUNDEX('Helloworld'),2),'%');