Небольшой баг с поиском в нескольких компонентах системы

+21
1.42K
Доброго времени суток, дорогое сообщество!
Случайно наткнулся на код файла psearch.php в компоненте FAQ, который отвечает за поиск по БД компонентов.
Решил посмотреть и в остальных компонентах. Выявилось, что везде один недочёт.

И так, в чём заключается баг?
Некорректный поиск по след. компонентам:
Доска объявлений;
Универсальный каталог;
Вопросы и ответы;
Форум;
Фотоальбомы;
Прайс.


В запросе есть проверка записей на "публикуемость", но нет проверки публикации категории записей. Это означает, что в базе(неважно чего… доски объявлений, каталога и т.д.) у нас, к примеру, 100 записей и все они публикуемые. И в один момент мы решили закрыть какую-то категорию. И при поиске информации (компонент "Поиск"), мы можем получить данные этой категории, не смотря на то, что категория не публикуется.



Давайте решим этот вопрос.
Файл /components/board/psearch.php

Заменяем:
  1.  
  2. $sql = "SELECT f.*, f.title as title, a.title as cat, a.id as cat_id
  3. FROM cms_board_items f
  4. INNER JOIN cms_board_cats a ON a.id = f.category_id
  5. WHERE MATCH(f.title, f.content) AGAINST ('$query' IN BOOLEAN MODE) AND f.published = 1 LIMIT 100";
на:
  1.  
  2. $sql = "SELECT f.*, f.title as title, a.title as cat, a.id as cat_id
  3. FROM cms_board_items f
  4. INNER JOIN cms_board_cats a ON a.id = f.category_id
  5. WHERE MATCH(f.title, f.content) AGAINST ('$query' IN BOOLEAN MODE)
  6. AND f.published = 1 AND a.published = 1 LIMIT 100";
Файл /components/catalog/psearch.php

Заменяем:
  1.  
  2. $sql = "SELECT i.*, c.title as cat, c.id as cat_id
  3. FROM cms_uc_items i
  4. INNER JOIN cms_uc_cats c ON c.id = i.category_id
  5. WHERE MATCH(i.title, i.fieldsdata) AGAINST ('$query' IN BOOLEAN MODE) AND i.published = 1 LIMIT 100";
на:
  1.  
  2. $sql = "SELECT i.*, c.title as cat, c.id as cat_id
  3. FROM cms_uc_items i
  4. INNER JOIN cms_uc_cats c ON c.id = i.category_id
  5. WHERE MATCH(i.title, i.fieldsdata) AGAINST ('$query' IN BOOLEAN MODE)
  6. AND i.published = 1 AND c.published = 1 LIMIT 100";
Файл /components/content/psearch.php

Заменяем:
  1.  
  2. $sql = "SELECT con.*, cat.title cat_title, cat.id cat_id, cat.seolink as cat_seolink, cat.parent_id as cat_parent_id
  3. FROM cms_content con
  4. INNER JOIN cms_category cat ON cat.id = con.category_id
  5. WHERE MATCH(con.title, con.content) AGAINST ('$query' IN BOOLEAN MODE) AND con.is_end = 0 AND con.published = 1 LIMIT 100";
на:
  1.  
  2. $sql = "SELECT con.*, cat.title cat_title, cat.id cat_id, cat.seolink as cat_seolink, cat.parent_id as cat_parent_id
  3. FROM cms_content con
  4. INNER JOIN cms_category cat ON cat.id = con.category_id
  5. WHERE MATCH(con.title, con.content) AGAINST ('$query' IN BOOLEAN MODE)
  6. AND con.is_end = 0 AND con.published = 1 AND cat.published = 1 LIMIT 100";
Файл /components/faq/psearch.php

Заменяем:
  1.  
  2. $sql = "SELECT con.*, cat.title cat_title, cat.id cat_id
  3. FROM cms_faq_quests con
  4. INNER JOIN cms_faq_cats cat ON cat.id = con.category_id
  5. WHERE MATCH(con.quest, con.answer) AGAINST ('$query' IN BOOLEAN MODE) AND con.published = 1 LIMIT 100";
на:
  1.  
  2. $sql = "SELECT con.*, cat.title cat_title, cat.id cat_id
  3. FROM cms_faq_quests con
  4. INNER JOIN cms_faq_cats cat ON cat.id = con.category_id
  5. WHERE MATCH(con.quest, con.answer) AGAINST ('$query' IN BOOLEAN MODE)
  6. AND con.published = 1 AND cat.published = 1 LIMIT 100";
Файл /components/forum/psearch.php
Тут немного посложнее дело. Надо проверять, и категорию, и форум.

Заменяем:
  1.  
  2. $sql = "SELECT t.*, f.title as forum, f.id as forum_id, f.access_list
  3. FROM cms_forum_threads t
  4. INNER JOIN cms_forums f ON f.id = t.forum_id
  5. WHERE MATCH(t.title) AGAINST ('$query' IN BOOLEAN MODE) AND t.is_hidden=0 LIMIT 50";
на:
  1.  
  2. $sql = "SELECT t.*, f.title as forum, f.id as forum_id, f.access_list
  3. FROM cms_forum_threads t
  4. INNER JOIN cms_forums f ON f.id = t.forum_id
  5. INNER JOIN cms_forum_cats cat ON cat.id = f.category_id
  6. WHERE MATCH(t.title) AGAINST ('$query' IN BOOLEAN MODE)
  7. AND t.is_hidden=0 AND cat.published = 1 AND f.published = 1 LIMIT 50";
Файл /components/photos/psearch.php

Заменяем:
  1.  
  2. $sql = "SELECT f.*, a.title as cat, a.id as cat_id
  3. FROM cms_photo_files f
  4. INNER JOIN cms_photo_albums a ON a.id = f.album_id
  5. WHERE MATCH(f.title, f.description) AGAINST ('$query' IN BOOLEAN MODE) AND f.published = 1";
на:
  1.  
  2. $sql = "SELECT f.*, a.title as cat, a.id as cat_id
  3. FROM cms_photo_files f
  4. INNER JOIN cms_photo_albums a ON a.id = f.album_id
  5. WHERE MATCH(f.title, f.description) AGAINST ('$query' IN BOOLEAN MODE)
  6. AND f.published = 1 AND a.published = 1";
Файл /components/price/psearch.php

Заменяем:
  1.  
  2. $sql = "SELECT i.*, c.title as cat, c.id as cat_id
  3. FROM cms_price_items i
  4. INNER JOIN cms_price_cats c ON c.id = i.category_id
  5. WHERE MATCH(i.title) AGAINST ('$query' IN BOOLEAN MODE)";
на:
  1.  
  2. $sql = "SELECT i.*, c.title as cat, c.id as cat_id
  3. FROM cms_price_items i
  4. INNER JOIN cms_price_cats c ON c.id = i.category_id
  5. WHERE MATCH(i.title) AGAINST ('$query' IN BOOLEAN MODE)
  6. AND c.published = 1";
Всё готово. Дело "простятское", но писал на скорую руку, если где ошибся — поправьте.
P.S.

Сначала написал fuze — в версии 1.9.1. это будет исправлено.
Если хотите отблагодарить, то вам СЮДА

0
eoleg eoleg 11 лет назад #
+
+4
WALTERZ WALTERZ 11 лет назад #
Добавил в конец инфу для благодарностей, обратите внимание, это важно.
0
Azura Azura 11 лет назад #
Спасибищи огромное!:) Очень полезнейший пост!:)))
0
eoleg eoleg 11 лет назад #
у меня от гугла поиск )
0
Bubble Gumoff Bubble Gumoff 11 лет назад #
Мало того что категория не публикуется и выпадает в поиск, ее все еще можно найти по старому адресу url
0
Bubble Gumoff Bubble Gumoff 11 лет назад #
Помогите с поиском? В каталоге товар с наименованием "RT 300" - поиск по сайту не находит товар по запросу "RT 300", как так хз ?!
0
IRATE IRATE 11 лет назад #
Если делать общий поиск, то находит, например, по запросу samsung тучу статей, а если выборочно только в статьях - вообще ничего не находит :(

Еще от автора

Урок. Расширяем функционал компонента ПОИСК. Вывод изображений
Долго отсутствовал, точнее не имел возможности. Поэтому рад снова вернуться к Вам! И так, этот пост о доработке поиска.
Баг с регистрацией нового пользователя. Исправляем
И снова здравствуй, дорогое сообщество! Собственно хотел помочь человеку в теме http://instantcms.ru/forum/thread14031-1.
Доработка. Поиск клубов
И снова привет, дорогое сообщество! Писали, что поиск клубов не работает. Взглянул. Оказалось, что поисковик ищет лишь фотографии и блоги клубов.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.