Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2011-12-16 07:00:08

Rookie
Участник
Зарегистрирован: 2011-03-23
Сообщений: 53

Поиск в теме

Помогите пожалуйста организовать такую вещь как "Поиск по теме",за раннее благодарен всем желающим помочь!

Offline

#2 2011-12-16 07:20:51

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Поиск в теме

@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы

                            if (is_cjk($cur_word))
                            {
                                $where_cond = str_replace('*', '%', $cur_word);
                                $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');

                                $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
                            }
                            else
                                $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());

когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА

Offline

#3 2011-12-16 07:58:01

Rookie
Участник
Зарегистрирован: 2011-03-23
Сообщений: 53

Re: Поиск в теме

Visman пишет:

@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы

                            if (is_cjk($cur_word))
                            {
                                $where_cond = str_replace('*', '%', $cur_word);
                                $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');

                                $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
                            }
                            else
                                $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());

когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА


Спасибо,но я видимо не правильно выразил свою идею..

я хочу в viewtopic.php вставить мини-блок поиска

P.S Visman,могу я узнать твой email?
ибо тот что в профиле у тебя безответный..я написал,ответа нет

Offline

#4 2011-12-16 10:02:35

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Поиск в теме

Размещай на странице темы форму

<form method="get" action="search.php">
                <input type="hidden" name="action" value="search" />
                <input type="hidden" name="topic" value="НОМЕР ТЕМЫ" />
                <input type="text" name="keywords" maxlength="100" />
                <p class="buttons"><input type="submit" name="search" value="Поиск по теме" /></p>
</form>

а в search.php добавляй изменения как я выше писал.

Offline

#5 2011-12-16 10:23:08

Rookie
Участник
Зарегистрирован: 2011-03-23
Сообщений: 53

Re: Поиск в теме

Visman пишет:

@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы

                            if (is_cjk($cur_word))
                            {
                                $where_cond = str_replace('*', '%', $cur_word);
                                $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');

                                $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
                            }
                            else
                                $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());

когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА


Извини,но я не совсем понял что необходимо изменить...просто за мою недоходчивость(

Offline

#6 2011-12-16 17:14:54

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Поиск в теме

Rookie пишет:

Извини,но я не совсем понял что необходимо изменить...просто за мою недоходчивость(

Стандартный вариант форума не предоставляет возможности поиска по теме.
Из формы поиска в теме будет методом get передаваться не только поисковое слово keywords, но номер этой темы topic.
Т.е. нужно перед этими запросами проверить наличие этой переменной в get и если она там есть, то всунуть ее в условие. Примерно так

$dop_where = (isset($_GET['topic']) && $_GET['topic'] > 0) ? ' AND t.id='.intval($_GET['topic']) : '';

а $dop_where присоединить в запросы после уже имеющихся условий.

Offline

#7 2011-12-17 06:43:51

Rookie
Участник
Зарегистрирован: 2011-03-23
Сообщений: 53

Re: Поиск в теме

                            if (is_cjk($cur_word))
                            {
                                $where_cond = str_replace('*', '%', $cur_word);

                                $dop_where = (isset($_GET['topic']) && $_GET['topic'] > 0) ? ' AND t.id='.intval($_GET['topic']) : '';


                                $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');

                                $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
                            }
                            else
                                $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());

То есть это в search.php..?
Как то ты сложно для моего ума выразился...ничего не понял я ((

Объясни пожалуйста последовательно,что и где изменить,за ранее спасибо тебе большое!

Редактировался Rookie (2011-12-17 08:09:12)

Offline

#8 2011-12-17 09:13:40

Lexx
Участник
Из Владимирская обл.
Зарегистрирован: 2011-12-17
Сообщений: 23
Сайт

Re: Поиск в теме

Visman пишет:

@Rookie, думаю, что достаточно в файле search.php внести изменения в эти запросы

                            if (is_cjk($cur_word))
                            {
                                $where_cond = str_replace('*', '%', $cur_word);
                                $where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');

                                $result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
                            }
                            else
                                $result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());

когда нужно искать в конкретной теме.
В обоих запросах уже есть обращение к таблице topics, т.е. достаточно в условии для поиска в ТЕМЕ прописать t.id=(int)ТЕМА


Где именно условия вписывать в коде?  В середине? В начале или просто новой строкой?

Offline

#9 2011-12-17 11:57:21

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Поиск в теме

В запросе условие начинается с WHERE. Учим матчасть.
В первом случае меняем

WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql

на

WHERE ('.$where_cond.')'.$dop_where.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql

Во втором

WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql

на

WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.$dop_where.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql

Offline

#10 2011-12-19 14:43:18

Lexx
Участник
Из Владимирская обл.
Зарегистрирован: 2011-12-17
Сообщений: 23
Сайт

Re: Поиск в теме

Visman пишет:

В запросе условие начинается с WHERE. Учим матчасть.
В первом случае меняем

Мне  матчасть учитьне надо.
Просто  решил помочь человеку, показав как верно было бы спросить. В противном случае тема растянулась бы надолго.
Сам ещё не разбирался ни с флюксбб, ни с пунбб - пока некогда.

С уважением хостер.

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens