Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/48: Рейтинг темы: голосов - 48, средняя оценка - 4.94
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625

LIKE поиск по базе

19.03.2013, 19:11. Показов 9568. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.

В таблице имеется две строки и два столбца. Изображение:

Произвожу поиск по базе так:

PHP
1
2
3
4
5
6
$form_text = $_POST['text']; // принимаем текстовую строку через URL
$get = mysql_query("SELECT `id` FROM `table_1` WHERE `text` LIKE '%".$form_text."%'");
 
while($result_id = mysql_fetch_assoc($get)) {
echo $result_id['id']."<br>";
}
Теперь к проблеме. Когда ввожу в текстовое поле по отдельности Hello или World, то результат выходит. Выходит или 1 или 2, как положено. Но если ввести оба слова сразу(через пробел), то никакого результата не выходит, а по идее должны выйти две записи сразу. В чем может быть проблема?
Миниатюры
LIKE поиск по базе  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.03.2013, 19:11
Ответы с готовыми решениями:

Поиск в ADoquery, Delphi, поиск в базе данных
Доброго времени суток многоуважаемые пользователи данного сайта! Есть очень глупая проблема, с которой я, к сожалению, справиться не...

Поиск в базе данных (поиск далее)
Добрый вечер! Нужна ваша помощь. Делаю поиск по базе, использую компонент AdoTable. В базе есть Одинаковые строки, нужно чтобы при нажатии...

Поиск по базе
Найти номер телефона сотрудника по его фамилии и по инициалам... с коментариями. помогите пожалуйста буду очень благодарен

15
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
19.03.2013, 21:59  [ТС]
В общем, похоже придется сделать через цикл.
1. Заносим каждое слово в массив
2. Через цикл, извлекаем по одному значению из получившегося массива и подставляем в SQL запрос.
3. Через цикл выводим найденные данные

Вот что получилось:

PHP
1
2
3
4
5
6
7
8
9
10
11
$form_text = $_POST['user_string']; // получаем из url
// здесь конечно же надо подготовить строку, очистить от лишних символов, убрать лишние пробелы, итд.
$array = explode(" ", $form_text);
$size = sizeof($array);
for($i=0;$i<$size;$i++) {
   $text = $array[$i];
   $get_id = mysql_query("SELECT `id` FROM `table_1` WHERE `text` LIKE '%".$text."%'");
      while($result_id = mysql_fetch_assoc($get_id)) {
        echo $result_id['id']."<br>";
      }
}
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
19.03.2013, 22:02
SQL
1
SELECT ... WHERE `field` LIKE '%text' OR `field` LIKE '%text' OR .....
?
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
19.03.2013, 22:16  [ТС]
PHP
1
SELECT ... WHERE `field` LIKE '%text' OR `field` LIKE '%text' OR .....
А если у нас 10 слов в строке будет? Будем использовать 10 раз LIKE?:-)
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
19.03.2013, 22:23
да. А вообще, это можно сделать либо так, например:
PHP
1
2
3
$arr = explode(' ', 'foo bar lol');
function like($text) { return '"%' . addslashes($text) . '%"'; }
$sql = 'SELECT .... WHERE `text` LIKE ', join(', OR `text` LIKE ', array_map('like',$arr));
либо через плэйсхолдеры (смотря что используется)
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
20.03.2013, 17:38  [ТС]
PHP
1
2
3
$arr = explode(' ', 'foo bar lol');
function like($text) { return '"%' . addslashes($text) . '%"'; }
$sql = 'SELECT .... WHERE `text` LIKE ', join(', OR `text` LIKE ', array_map('like',$arr));
А как тоже само, но только для поиска в двух ячейках, а не одной? Спасибо.
0
 Аватар для dr_yand
157 / 138 / 15
Регистрация: 13.03.2013
Сообщений: 321
Записей в блоге: 3
21.03.2013, 13:03
Но если ввести оба слова сразу(через пробел), то никакого результата не выходит, а по идее должны выйти две записи сразу.
Оператор LIKE работает не так.
Вам больше подходит полнотекстовый поиск
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
21.03.2013, 23:59  [ТС]
В этой статье:
http://www.php.su/articles/?cat=phpdb&page=015
говорится о том, что требуемые поля VARCHAR или (SMALLTEXT, MEDIUMTEXT и т.п.), в которых производится поиск, нужно сделать ключами FULLTEXT. Первый раз про такое слышу. Ребят, может в трех словах объясните как это сделать? У меня имеется такой запрос, на создание таблицы:

PHP
1
2
3
4
5
6
7
$create_table_1 = "CREATE TABLE IF NOT EXISTS `table_1` (
id INT NOT NULL AUTO_INCREMENT,
user_id VARCHAR( 99 ),
user_name VARCHAR( 99 ),
text MEDIUMTEXT,
PRIMARY KEY ( `id` )
) DEFAULT CHARSET=cp1251";
Получается так, что поля text и user_name, мне надо сделать FULLTEXT.
0
 Аватар для dr_yand
157 / 138 / 15
Регистрация: 13.03.2013
Сообщений: 321
Записей в блоге: 3
22.03.2013, 00:08
если вы работаете через phpmyadmin, то можно через веб-интерфейс добавить новый индекс
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.03.2013, 00:27  [ТС]
если вы работаете через phpmyadmin, то можно через веб-интерфейс добавить новый индекс
Попробовал, вроде добавляется. А все же как через запрос сделать?
0
 Аватар для dr_yand
157 / 138 / 15
Регистрация: 13.03.2013
Сообщений: 321
Записей в блоге: 3
22.03.2013, 00:31
Вроде бы так
SQL
1
CREATE FULLTEXT INDEX index_name ON tablename (COLUMNS);
или так
SQL
1
ALTER TABLE tablename ADD FULLTEXT index_name (COLUMNS);
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.03.2013, 01:09  [ТС]
Спасибо. Отличные варианты. В интернете также попался такой вариант:

PHP
1
2
3
4
5
CREATE TABLE tablename (
field1 VARCHAR(200),
field2 VARCHAR(200),
FULLTEXT (field1, field2)
);
У меня еще один заключительный вопрос. Мы поставили на необходимые поля FULLTEXT. Теперь мы уже не используем LIKE, а используем к примеру, что-то наподобие этого:

PHP
1
SELECT * FROM tablename WHERE MATCH (field1,field2) AGAINST ('database');
Правильно я понял принцип?
0
 Аватар для dr_yand
157 / 138 / 15
Регистрация: 13.03.2013
Сообщений: 321
Записей в блоге: 3
22.03.2013, 01:11
Ага
Только стоит обратить внимание на один нюанс, в настройках mysql выставляется минимальная длина слова которое будет участвовать в поиске. Обычно она равна 3
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.03.2013, 01:18  [ТС]
Ага
Только стоит обратить внимание на один нюанс, в настройках mysql выставляется минимальная длина слова которое будет участвовать в поиске. Обычно она равна 3
Окей спасибо. Буду дерзать. А слова меньше трех символов, из строки я сразу выдираю. Пример:

PHP
1
2
3
4
$s_text; // текст для поиска
$s_text = preg_replace("/[^\w\x7F-\xFF\s]/", " ", $s_text); // убираем лишние символы
$s_text = preg_replace("/\s(\S{1,3})\s/", "  ", "$s_text"); // убираем слова длинной менее трех символов
$s_text = preg_replace("/\s+/", " ", $s_text); // убираем лишние пробелы
Вот как то так.
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
22.03.2013, 01:22
еще по цифрам нельзя искать, при полнотекстовом
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
23.03.2013, 01:26  [ТС]
еще по цифрам нельзя искать, при полнотекстовом
А в принципе мне и нужен только поиск по тексту. Ничего страшного.

Добавлено через 1 час 40 минут
Ребят, выходит ошибка. Не пойму в чем дело. Что-то делаю не так. Создал таблицу таким образом:

MySQL
1
2
3
4
5
6
CREATE TABLE tablename (
user_name VARCHAR(200),
field1 VARCHAR(200),
field2 VARCHAR(200),
FULLTEXT (field1, field2)
);
Ищу данные в ней, таким образом:

PHP
1
2
3
4
5
6
$s_text; // строка поиска
$query = "SELECT user_name, MATCH (field1, field2) AGAINST ('$s_text') FROM tablename";
 
while($result_name = mysql_fetch_assoc($query)) { 
    echo $result_name['user_name']."<br>"; // вывожу имя через цикл
}
При поиске, у меня выходят даже те результаты, где нет совпадений по искомой сроке. В чем может быть дело?

Добавлено через 22 часа 20 минут
Всем спасибо. С поиском разобрался. Правильный запрос, должен выглядеть так:

MySQL
1
mysql_query("SELECT `user_name`, MATCH (field1, field2) AGAINST ('$s_text' IN BOOLEAN MODE) AS relev FROM `tablename` WHERE MATCH (field1, field2) AGAINST ('$s_text' IN BOOLEAN MODE) ORDER BY relev DESC");
текстовую строку $s_text, заранее надо подготовить так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$s_text = trim($_POST['user_string']); // строка поиска
$s_text = preg_replace("/[^\w\x7F-\xFF\s]/", " ", $s_text); // убираем лишние символы
$s_text = preg_replace("/\s(\S{1,3})\s/", "", " $s_text "); // убираем слова короче 3 символов
$s_text = preg_replace("/\s+/", " ", $s_text); // убираем повторяющиеся пробелы
// далее удаляем последний символ, в каждом слове строки. 
$array = explode(" ", $s_text);
$size = sizeof($array);
$new_str = "";
for($i=0; $i<$size; $i++) {
    $new_str .= substr($array[$i], 0, -1)." ";
}
$new_str = trim($new_str);
$s_text = "*".str_ireplace(" ", "**", $new_str)."*"; // заменяем пробелы на звездочки, в итоге должна получаться например такая строка для поиска: *hello**world*
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2013, 01:26
Помогаю со студенческими работами здесь

поиск в базе
имеется алгоритм $search_query = &quot;SELECT * FROM news WHERE UPPER(news) LIKE '%&quot;.strtoupper($_POST).&quot;%' LIMIT 100&quot;; $result_query =...

Поиск по базе
Дайте пожалуйста исходник для поиска по всей таблице DBGrid или по определённому столбцу.

поиск по базе
необходимо командой @DbLookup вытащить из текущей базы данных из view &quot;Default&quot; все значения колонки &quot;Имя&quot; , в которой заносяться...

поиск по базе
помогите сделать поиск форму я сделал нужно чтобы при вводе в верхнее поле в список выводились все люди с такими фамилиями именами и т.д.

Поиск по базе
Добрый день, форумчане. Вобщем проблема такая, нужно реализовать поиск по строкам в базе данных, но чтобы можно было вводить запись...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru