Приднестровская поддержка XOOPS
Для поиска по шаблону используются два оператора:
□ LIKE — соответствие шаблону SQL;
□ NOT LIKE — несоответствие шаблону SQL.
В шаблоне SQL могут использоваться следующие специальные символы:
□ % — любое количество символов;
□ _ — любой одиночный символ.
Если специальные символы не используются, то применение оператора LIKE эквивалентно оператору =, например:
SELECT 'строка для поиска' LIKE 'поиск';
/* Выведет: 0 */
SELECT 'поиск' LIKE 'поиск';
/* Выведет: 1 */
Следует учитывать, что поиск в текстовом поле производится без учета регистра. Чтобы учитывался регистр, необходимо указать ключевое слово BINARY:
SELECT 'PHP' LIKE 'php';
/* Выведет: 1 */
SELECT 'PHP' LIKE BINARY 'php';
/* Выведет: 0 */
Учет регистра русских букв зависит от кодировки:
SET NAMES cp866;
SELECT 'Поиск' LIKE 'поиск';
/* Выведет: 1 */
SET NAMES cp1251;
SELECT 'Поиск' LIKE 'поиск';
/* Выведет: 0 */
Специальные символы могут быть расположены в любом месте шаблона.
Например, чтобы найти все вхождения, необходимо указать символ % в начале и в конце шаблона:
SELECT 'строка для поиска' LIKE '%поиск%';
/* Выведет: 1 */
Можно установить привязку или только к началу строки, или только к концу: SELECT 'строка для поиска' LIKE 'строка%';
/* Выведет: 1 */
SELECT 'новая строка для поиска' LIKE 'строка%';
/* Выведет: 0 */
SELECT 'строка для поиска' LIKE '%поиска';
/* Выведет: 1 */
SELECT 'строка для поиска 2' LIKE '%поиска';
/* Выведет: 0 */
Шаблон для поиска может иметь очень сложную структуру:
SELECT 'строка для поиска' LIKE '%строк_%по_ск%';
/* Выведет: 1 */
SELECT 'строка для поиска' LIKE '%поиск%а';
/* Выведет: 1 */
Обратите внимание на последнюю строку поиска. Этот пример демонстрирует, что специальный символ % соответствует не только любому количеству символов, но и полному их отсутствию.
Что же делать, если необходимо найти символы "%" и "_"? Ведь они являются специальными:
SELECT 'скидка 10%' LIKE '%10%';
/* Выведет: 1 */
SELECT 'скидка 10$' LIKE '%10%';
/* Выведет: 1 */
В этом случае специальные символы необходимо экранировать с помощью обратной косой черты:
SELECT 'скидка 10%' LIKE '%10\%';
/* Выведет: 1 */
SELECT 'скидка 10$' LIKE '%10\%';
/* Выведет: 0 */
Обратите внимание, что функция mysql_real_escape_string() не добавляет обратной косой черты перед символами % и _ для их защиты. Сделать это в PHP позволяет функция addcslashes():
$text = addcslashes($text, '_%');
В качестве примера рассмотрим поиск по шаблону. Для этого создадим таблицу search в базе данных tests:
CREATE TABLE `search` (
`id` INT NOT NULL AUTO_INCREMENT,
`str` TEXT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Затем добавим две записи:
SET NAMES cp866;
INSERT INTO `search` VALUES (NULL, 'Скидка 10%');
INSERT INTO `search` VALUES (NULL, 'Скидка 10$');
Исходный код с вариантами поиска по шаблону приведен в листинге 2.
Листинг 2. Поиск по шаблону
<?php
$str_search = '10%';
if ($db = @mysql_connect("localhost", "root", "123456")) {
mysql_select_db("tests");
mysql_query("SET NAMES cp1251");
// Добавляем защитные слэши
$str_search = mysql_real_escape_string($str_search);
echo 'Без добавления слэшей перед спецсимволами:<br>';
$query = "SELECT `str` FROM `search` WHERE `str` LIKE '%";
$query .= $str_search . "%'";
$res = mysql_query($query);
while ($pole = mysql_fetch_array($res)) {
echo $pole[0] . '<br>';
}
echo '<br>После добавления слэшей перед спецсимволами:<br>';
$str_search_add = addcslashes($str_search, '_%');
$query_add = "SELECT `str` FROM `search` WHERE `str` LIKE '%";
$query_add .= $str_search_add . "%'";
$res_add = mysql_query($query_add);
while ($pole_add = mysql_fetch_array($res_add)) {
echo $pole_add[0] . '<br>';
}
mysql_close($db);
}
else {
echo 'Не удалось установить подключение к базе данных';
}
?>
Открыв этот файл в Web-браузере, мы увидим:
В этом примере предполагается, что значение переменной $str_search было получено через форму поиска. Поэтому прежде чем подставить значение переменной в SQL-запрос, мы экранируем специальные символы. Если этого не сделать, то любой пользователь может видоизменить SQL-запрос.
Отправитель | Нити |
---|
3 пользователь(ей) активно (2 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 3 далее... |