Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

поиск в бд

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> поиск в бд
Имя
Сообщение << Старые топики   Новые топики >>
поиск в бд - 2009-01-25 18:24:24.236666   
azusr

Сообщений: 10
Оценки: 0
Присоединился: 2009-01-08 21:23:31.860000
запрос: SELECT * FROM news WHERE full LIKE '%{$_GET['search']}%'
все пашет. если есть совпадение то скрипт заменяет найденную строку на <span style=\"background-color: yellow; color: #ff0000;\">{$_GET['search']}</span>. но у меня в базе находятся хтмл. если $_GET['search'] будет img, то сами знаете что будет.
составил другой запрос: SELECT * FROM news WHERE full LIKE '%{$_GET['search']}%' AND full NOT LIKE '%<%>%' но без результата.
прошу помогите решить проблему. (скрипт на пхп, бд mysql)
Post #: 1
RE: поиск в бд - 2009-01-25 22:21:36.680000   
Cep}|{

Сообщений: 1396
Оценки: 0
Присоединился: 2007-06-26 01:11:51.416666
Никогда не суй в запрос неотфильтрованные данные, в твоем случае это $_GET
Нихрена непонятно, ты поподробней объясни с примерами, в чем косяк
Post #: 2
RE: поиск в бд - 2009-01-25 22:48:39.623333   
Parano1d

Сообщений: 423
Оценки: 0
Присоединился: 2008-05-21 13:40:17.093333
quote:

если $_GET['search'] будет img

это как и зачем?
Post #: 3
RE: поиск в бд - 2009-01-26 05:14:02.396666   
kristalsummers

Сообщений: 63
Оценки: 0
Присоединился: 2008-11-28 19:38:12.070000
> это как и зачем?
ну товарищ хочет сделать обычный поиск по тексту, только в БД, и в поле text(значение) лежит статья в тексте которой есть теги, которые сохранились от редактора к примеру при форматировании.
azusr читай тут http://www.opennet.ru/base/dev/mysql_pgsql_search.txt.html
скорее всего у тебя не ищет ничего так как у тебя указано <%> это получается если у тебя весь текст находится между <p>текст текст</p> like исключает все от < до >, короче регулярку нужно составлять более сложную с квантификатором жадности http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html
Post #: 4
RE: поиск в бд - 2009-01-27 00:09:10.280000   
azusr

Сообщений: 10
Оценки: 0
Присоединился: 2009-01-08 21:23:31.860000
значит так. через переменную $_GET['search'] получаю искомую фразу, отфильтровываю. далее ищу те фразы которые не входят в угловые скобки. пример:
урл: ?search=img
строка1: img test img
строка2: <img src="img.gif" alt="" /> test
строка3: img <img src="img.gif" alt="" /> test
в результате совпадение есть в строках 1 и 3. строка1 понятно почему. в стороке 2 img есть но так как оба находятся внутри угловых скобках срока2 не включается. и в строке 3 только одно совпадение, потому что остальные две находятся внутри угловых скобках.
и точно также при подсветке. если фраза не находится внутри угловых скобках то надо ее подсвечивать.
Post #: 5
RE: поиск в бд - 2009-01-27 00:16:50.820000   
azusr

Сообщений: 10
Оценки: 0
Присоединился: 2009-01-08 21:23:31.860000
спс всем за ответы. вот мой скрипт (сделал сегодня). но по моему он не идеален. если кому то понадобится пусть возьмет и если у кого то хорошие идеи пусть скажет.
echo "&lt;form action=\"?\" method=\"get\"&gt;&lt;div&gt;\n", "\t&lt;input type=\"text\" name=\"query\" /&gt; &lt;input type=\"submit\" value=\"search\" /&gt;\n", "&lt;/div&gt;&lt;/form&gt;\n&lt;br /&gt;&lt;br /&gt;\n"; if ($_GET['query']) { &nbsp;// фильтрация query &nbsp;$query = htmlspecialchars($_GET['query']); &nbsp;$result = mysql_query('SELECT * FROM news'); &nbsp;while ($story = mysql_fetch_assoc($result)) &nbsp;{ &nbsp; // удаляем все теги которые внутри существует query &nbsp; $story['full'] = preg_replace("/&lt;[^&gt;]*".$query."[^&gt;]*&gt;/uis", '', $story['full']); &nbsp; // если в тексте существует query то выводим загаловку текста &nbsp; echo preg_match("/".$query."/uis", $story['full'])? &nbsp; "&lt;b&gt;&lt;a href=\"?page=news&amp;amp;id={$story['id']}&amp;amp;highlight={$query}\"&gt;{$story['title']}&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;\n": ''; &nbsp;} } elseif ($_GET['page'] == 'news') { &nbsp;// фильтрация id &nbsp;$id = (!preg_match('/^[0-9]{1,5}$/', $_GET['id']) || !$_GET['id'])? 1: $_GET['id']; &nbsp;$result = mysql_query("SELECT * FROM news WHERE id='{$id}'"); &nbsp;$story = mysql_fetch_assoc($result); &nbsp;// подсветка текста &nbsp;$story['full'] = highlight($story['full'], $_GET['highlight']); &nbsp;$story['date'] = date('d.m.Y', $story['date']); &nbsp;echo "&lt;div style=\"width: 500px;\"&gt;\n", &nbsp;"\t&lt;b&gt;{$story['date']} - {$story['title']}&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;\n\t{$story['full']}\n&lt;/div&gt;"; } function highlight($text, $highlight) { &nbsp;// фильтрация highlight &nbsp;$highlight = htmlspecialchars($highlight); &nbsp;// добавляем теги которые внутри находится highlight в массив tags &nbsp;preg_match_all("/&lt;[^&gt;]*".$highlight."[^&gt;]*&gt;/uis", $text, $tags); &nbsp;// убираем повторяющиеся теги &nbsp;$tags = array_values(array_unique($tags[0])); &nbsp;// подсвечиваем highlight во всех тегах из массива tags и добавляем в массив highlighted_tags &nbsp;for ($i = 0; isset($tags[$i]); $i++) &nbsp; $highlighted_tags[] = preg_replace("/".$highlight."/uis", "&lt;span class=\"highlight\"&gt;\${0}&lt;/span&gt;", $tags[$i]); &nbsp;// подсвечиваем highlight в тексте &nbsp;$text = preg_replace("/".$highlight."/uis", "&lt;span class=\"highlight\"&gt;\${0}&lt;/span&gt;", $text); &nbsp;// убираем подсветку тегов &nbsp;for ($i = 0; isset($tags[$i]); $i++) &nbsp; $text = str_replace($highlighted_tags[$i], $tags[$i], $text); &nbsp;return $text; }
Post #: 6
RE: поиск в бд - 2009-01-31 15:53:49.713333   
Skayder

Сообщений: 82
Оценки: 0
Присоединился: 2008-12-19 12:58:40.493333
помоему для начала нужно сменить if ($_GET['query']) на if (isset($_GET['query']))
Post #: 7
Страниц:  [1]
Все форумы >> [Веб-программинг] >> поиск в бд







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.