Как да открия на коя страница е мнението?

DownFall

Registered
http://www.simplemachines.org/community/index.php?topic=437328.msg3070330#msg3070330

Както е тук, например в $_GET има зададено id на съобщението (3070330), но как системата го разбира, че е на 3 страница например?
 
http://www.simplemachines.org/community/index.php?topic=437328.100 така е страницирането. Когато е 100 заявката почва с limit 100,120
 
Страницирането е лесно да се разпознае, но виж в линка, който е пуснал DownFall - има id на темата и id на мнението, няма нищо което да е свързано със страницирането.

Проверяват какво им се подава в topic и особено - формата на втората половина, тази след точката. Ако е цяло число, страницирането върви по обичайния си начин. Ако е id на мнението, обикалят през таблицата и го търсят :)


Код:
$start = 0;
$by_page = 20;
$page_num = 1;

for($i = $start; ; $i += $by_page ){
    $sql = "select * from postings where topic = '437328' and answer_id = '3070330'  limit $start, $by_page";
    $resource = mysql_query($sql)  or die(mysql_error());

     if(mysql_num_rows($resource) == 1){
         break;
     }

     $start += $by_page;
     $page_num += 1;
}

пс: между другото - един интересен вариант на for конструкцията - когато не знаеме горната граница

псс: разбира се, би могло, с лека модификация, да се пренапише с while
 
Така няма да стане.. В WHERE клаузата слагаш `answer_id`, което по принцип е уникално за всеки коментар, т.е. ще върне само един резултат при всички случай.

Отделен е въпроса, че с този цикъл заявките ще се изпълнят отвратително много пъти, което е излишен разход на ресурс..

Мерси за предложението, но не е това начина.
Други идей?
 
Ще го обясня по-подробно.

Имаш таблица с отговорите по дадена тема. Лесно можеш да преброиш, има да кажем 200 отговора. Знаеш че един от тях има id = 332456 и трябва да откриеш на коя страница се намира. На всяка страница показваш по 20 резултата.

PHP:
for($i = $start; ; $i += $by_page ){
Създаваме цикъл, който обхожда всяка възможна "страница" с резултати. Максималния брой пъти, който този цикъл ще се изпълни е равен на броя на страниците с резултати:

run #1: (0 - 20)
run #2: (20 - 40)
run #3: (40 - 60)

Във всяка една от тези страници (групи от отговори) търсим отговор с id = 332456 - изпълняваме една-единствена заявка, с цел да открием дали избрания отговор е на тази страница. Ако резултата от тази заявка съдържа един ред, това означава че сме на точната страница, излизаме от цикъла и вече разполагаме с нужната ни информация. Ако ли не, увеличаваме стойността на $start и $page_id и продължаваме със следващия сет от резултати.

Още по-разбираемо ще стане, ако вместо $start и $by_page, вземеш че преброиш резултатите и определиш колко общо страници с резултати имаш.

Не съм го тествал, не гарантирам че работи, но идеята е да откриеш на коя страница от резултатите се намира избраното мнение. За целта обикаляш през страниците, по същия начин както все едно ще показваш резултатите пред потребителя, но вместо това правиш обратното действие - имаш id на мнението, и търсиш дали то се съдържа в масива от мнения за конкретната страница. Изпълнява се максимум една заявка за всяка страница.
 
Най-хубавото на свободния софтуер е, че винаги при ситуция като сегашната, можеш да прегледаш програмния код и да откриеш как го правят!

1. Намира се броя на мненията преди избраното мнение:
[sql]SELECT COUNT(*) messages WHERE id_msg < '332456';[/sql]

2. Страницата, на която се намира избраното мнение, се изчислява като стойността от точка 1 се раздели на броя на мненията които показваме на една страница, плюс 1

PHP:
'current_page' => $_REQUEST['start'] / $context['messages_per_page'] + 1,
 

Back
Горе