Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!
Часто приходится писать расширения, которые используют полнотекстовый поиск по базе данных. Один из таких компонентов — это поиск по сайту. Тут нельзя обойтись простым экранированием, а строка может содержать специфические символы. Для этих целей обычно пользуются LIKE — что очень не безопасно. Попробуем разобраться, как уменьшить риск полнотекстового поиска по базе данных Joomla.
Но как не крути конструкцию LIKE %…% приходится использовать для поиска по базе данных Joomla. Некоторая сложность возникает если мы попытаемся искать специальные символы, который по идее нужно экранировать перед использованием в
Обычно, когда мы используем JDatabase:Quote(), в нашей строке автоматически экранируются специальные символы. Такие символы как «%" (процент) и «_» (подчеркивание) тоже будут верно экранированы при использовании второго параметра (в примере выше он установлен на «false»). Если это не сделать, то запрос будет выполнен с ошибкой. Для того чтобы верно использовать эту строку воспользуемся методом JDatabase:getEscaped(), в качестве второго параметра которого принимается необязательный параметр, который указывает были ли экранированы спец символы «%" и «_». После этого собираем запрос полностью, обрамляя обработанные строки знаком «%», кавычками и формируем весь запрос.
Для того чтобы более яснее разобрать что произошло с переменными, предлагаем вам ознакомиться с таблицей ниже.
| Имя переменой | Значение переменной |
|---|---|
| $searchFor | We are 25% through the_chapter |
| $escaped | We are 25\% through the\_chapter |
| $quoted | '%We are 25\% through the\_chapter%' |
| $like | 'columnName' LIKE '%We are 25\% through the\_chapter%' |
Пример можно сделать более гибким, если заменить все пробелы символом «%» (напомним, что в контексте MySQL он обозначает любое кол-во символов). В итоге получаем код следующего вида:
Посмотрим значения переменных из этого листинга во время выполнения кода.
| Имя переменой | Значение переменной |
|---|---|
| $searchFor | We are 25% through the_chapter |
| $words | array('We', 'are', '25%', 'through', 'the_chapter') |
| $words | array('We', 'are', '25\%', 'through', 'the\_chapter') |
| $quotedSearch | We%are%25\%%through%the\_chapter |
| $quotedSearch | '%We%are%25\%%through%the\_chapter%' |
| $like | 'columnName' LIKE '%We%are%25\%%through%the\_chapter%' |