поиск в бд
Пользователи, просматривающие топик: 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)
|
|
|
RE: поиск в бд - 2009-01-25 22:21:36.680000
|
|
|
Cep}|{
Сообщений: 1396
Оценки: 0
Присоединился: 2007-06-26 01:11:51.416666
|
Никогда не суй в запрос неотфильтрованные данные, в твоем случае это $_GET Нихрена непонятно, ты поподробней объясни с примерами, в чем косяк
|
|
|
RE: поиск в бд - 2009-01-25 22:48:39.623333
|
|
|
Parano1d
Сообщений: 423
Оценки: 0
Присоединился: 2008-05-21 13:40:17.093333
|
quote:
если $_GET['search'] будет img это как и зачем?
|
|
|
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
|
|
|
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 только одно совпадение, потому что остальные две находятся внутри угловых скобках. и точно также при подсветке. если фраза не находится внутри угловых скобках то надо ее подсвечивать.
|
|
|
RE: поиск в бд - 2009-01-27 00:16:50.820000
|
|
|
azusr
Сообщений: 10
Оценки: 0
Присоединился: 2009-01-08 21:23:31.860000
|
спс всем за ответы. вот мой скрипт (сделал сегодня). но по моему он не идеален. если кому то понадобится пусть возьмет и если у кого то хорошие идеи пусть скажет. echo "<form action=\"?\" method=\"get\"><div>\n",
"\t<input type=\"text\" name=\"query\" /> <input type=\"submit\" value=\"search\" />\n",
"</div></form>\n<br /><br />\n";
if ($_GET['query'])
{
// фильтрация query
$query = htmlspecialchars($_GET['query']);
$result = mysql_query('SELECT * FROM news');
while ($story = mysql_fetch_assoc($result))
{
// удаляем все теги которые внутри существует query
$story['full'] = preg_replace("/<[^>]*".$query."[^>]*>/uis", '', $story['full']);
// если в тексте существует query то выводим загаловку текста
echo preg_match("/".$query."/uis", $story['full'])?
"<b><a href=\"?page=news&amp;id={$story['id']}&amp;highlight={$query}\">{$story['title']}</a></b><br /><br />\n": '';
}
}
elseif ($_GET['page'] == 'news')
{
// фильтрация id
$id = (!preg_match('/^[0-9]{1,5}$/', $_GET['id']) || !$_GET['id'])? 1: $_GET['id'];
$result = mysql_query("SELECT * FROM news WHERE id='{$id}'");
$story = mysql_fetch_assoc($result);
// подсветка текста
$story['full'] = highlight($story['full'], $_GET['highlight']);
$story['date'] = date('d.m.Y', $story['date']);
echo "<div style=\"width: 500px;\">\n",
"\t<b>{$story['date']} - {$story['title']}</a></b><br /><br />\n\t{$story['full']}\n</div>";
}
function highlight($text, $highlight)
{
// фильтрация highlight
$highlight = htmlspecialchars($highlight);
// добавляем теги которые внутри находится highlight в массив tags
preg_match_all("/<[^>]*".$highlight."[^>]*>/uis", $text, $tags);
// убираем повторяющиеся теги
$tags = array_values(array_unique($tags[0]));
// подсвечиваем highlight во всех тегах из массива tags и добавляем в массив highlighted_tags
for ($i = 0; isset($tags[$i]); $i++)
$highlighted_tags[] = preg_replace("/".$highlight."/uis", "<span class=\"highlight\">\${0}</span>", $tags[$i]);
// подсвечиваем highlight в тексте
$text = preg_replace("/".$highlight."/uis", "<span class=\"highlight\">\${0}</span>", $text);
// убираем подсветку тегов
for ($i = 0; isset($tags[$i]); $i++)
$text = str_replace($highlighted_tags[$i], $tags[$i], $text);
return $text;
}
|
|
|
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']))
|
|
|
|
|