# 1.0 Имя файла: engine/modules/favorites.php
# Найти:
if( $user_group[$member_id['user_group']]['allow_short'] ) $stop_list = "";
# 2.0 Добавить выше: (заменить существующий код, либо со старого убрать чекбокс и добавить новый код ниже)
if (isset($_GET['list']) && $fav_access) {
$list = intval($_GET['list']);
// Сначала получаем количество записей
$count_query = $db->super_query("SELECT COUNT(*) as total FROM " . PREFIX . "_favorites WHERE type = '{$list}' AND name = '{$user}'");
$total_records = $count_query['total'];
// Определяем максимальное количество записей для GROUP_CONCAT
$max_group_concat = 1000; // Ваше ограничение
if ($total_records <= $max_group_concat) {
// Используем GROUP_CONCAT для небольшого количества записей
$list_ids = $db->super_query("SELECT GROUP_CONCAT(news_id ORDER BY date DESC) as news_id FROM " . PREFIX . "_favorites WHERE type = '{$list}' AND name = '{$user}'");
if (!empty($list_ids['news_id'])) {
$all_found = true;
$list_found = true;
// Обрабатываем список ID
$olist = explode(',', $list_ids['news_id']);
// Проверяем и фильтруем ID
$valid_olist = array();
foreach ($olist as $news_id) {
$clean_id = intval($news_id);
if ($clean_id > 0) {
$valid_olist[] = $clean_id;
}
}
if (!empty($valid_olist)) {
$order_list = "ORDER BY FIND_IN_SET(id, '" . implode(",", $valid_olist) . "')";
if ($mod != 'collections') {
$favorites = "(" . implode(",", $valid_olist) . ")";
}
} else {
$list_found = false;
}
}
} else {
// Для большого количества записей используем обычный SELECT с пагинацией
$all_found = true;
$list_found = true;
// Получаем ID с пагинацией
$limit = $config['news_number'];
$pagination_ids = $db->query("SELECT news_id FROM " . PREFIX . "_favorites WHERE type = '{$list}' AND name = '{$user}' ORDER BY date DESC LIMIT {$cstart}, {$limit}");
$valid_olist = array();
while ($row = $db->get_row($pagination_ids)) {
$clean_id = intval($row['news_id']);
if ($clean_id > 0) {
$valid_olist[] = $clean_id;
}
}
if (!empty($valid_olist)) {
// Для пагинации не используем FIND_IN_SET, так как порядок уже задан в основном запросе
$order_list = "";
if ($mod != 'collections') {
$favorites = "(" . implode(",", $valid_olist) . ")";
}
} else {
$list_found = false;
}
// Обновляем счетчик для пагинации
$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_post p {$cat_join} WHERE {$stop_list}approve=1 AND id IN (SELECT news_id FROM " . PREFIX . "_favorites WHERE type = '{$list}' AND name = '{$user}')";
}
if (!$list_found) {
$all_found = true;
if ($mod != 'collections') {
$favorites = "(0)";
}
}
$url_page .= "/list/{$list}";
$user_query .= "&list={$list}";
} elseif (isset($_GET['cat']) && $fav_access) {
$cat_ids = $_GET['cat'];
// Валидация категорий
$cat_ids_t = explode(',', $cat_ids);
$valid_cats = array();
foreach ($cat_ids_t as $cat_id) {
$clean_cat = intval($cat_id);
if ($clean_cat > 0) {
$valid_cats[] = $clean_cat;
}
}
if (!empty($valid_cats)) {
$cat_found = true;
$all_found = true;
$clean_cat_ids = implode('|', $valid_cats);
// Используем более безопасное регулярное выражение
$category_ids = " AND category REGEXP '(^|,)({$clean_cat_ids})(,|$)' ";
if ($mod != 'collections') {
$favorites .= $category_ids;
}
$url_page .= "/cat/" . implode(',', $valid_cats);
$user_query .= "&cat=" . implode(',', $valid_cats);
} else {
// Если категории невалидны, показываем все
$all_found = true;
}
} else {
$all_found = true;
}
/* ------------------------------------------- */
# То есть старый код заменить на код из пункта 2
$cat_found = false;
$all_found = false;
if (isset ( $_GET['list'] ) AND $fav_access ) {
$list_found = false;
$list = intval($_GET['list']);
$list_ids = $db->super_query("SELECT GROUP_CONCAT(news_id ORDER BY date DESC) as news_id FROM " . PREFIX . "_favorites WHERE type = '{$list}' and name = '" . $name . "'");
if( $list_ids['news_id'] != null ) {
$list_found = $all_found = true;
$olist = explode(',', $list_ids['news_id']);
$order_list = implode( ",", $olist );
$order_list = "ORDER BY FIND_IN_SET(id, '".$order_list."') ";
} else $all_found = true;
if( $mod != 'collections' ) $favorites = "(" . $list_ids['news_id'] . ")";
if( !$list_found ) $favorites = "(0)";
$url_page .= "/list/{$list}";
$user_query .= "&list={$list}";
} elseif( isset($_GET['cat']) AND $fav_access ) {
$cat_found = $all_found = true;
$cat_ids = $_GET['cat'];
$cat_ids_t = explode(',', $cat_ids);
$category_ids = " AND category REGEXP '[[:<:]](" . $cat_ids . ")[[:>:]]' ";
if( $mod != 'collections' ) $favorites .= $category_ids;
$url_page .= "/{$cat_ids}";
$user_query .= "&cat={$cat_ids}";
} else $all_found = true;