CCCPaste

favorites

# 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;