Власне розбивка, точніше арифметика, 3-ий клас
<? php $ showperpage = 0; ff8000 "> / / скільки показувати на сторінку if (isset ($ HTTP_GET_VARS [ 'show'])) ( 0bb "> $ showperpage = (int) $ HTTP_POST_VARS [ 'show']; ) if (isset ($ HTTP_POST_VARS 700 "> [ 'show'])) ( $ showperpage = (int) $ HTTP_POST_VARS [ 'show'7700 ">]; )
/ / Скільки показувати на сторінку за замовчуванням if (($ showperpage <1) | | ($ Showperpage> 100)) ( $ showperpage = 20 )
/ / Скільки записів вийшло $ counted = mysql_num_rows ( color = "# 0000bb"> $ result); / / Скільки сторінок $ countedpages = ceil= "# 007700"> ($ counted / $ showperpage);
/ / Отримати з урл поточну сторінку $ currentpage = 0; if (isset ($ HTTP_GET_VARS [ 'page' $ currentpage = (int) $ HTTP_GET_VARS [ 'page']; & nbsp;) if ($ currentpage> $ countedpages) ( $ currentpage = $ countedpages; ) if ($ currentpage <1 font>) ( $ currentpage = 1; )
/ / перша позиція $ start_pos = ($ currentpage - 1) * $ showperpage # 007700 "> + 1; / / Остання позиція $ end_pos = $ start_pos +r = "# 0000bb"> $ showperpage - 1; if ($ end_pos> $ counted) ( & nbsp; $ end_pos = $ counted; ) ?> <p> Знайдено: <? = $ counted?> </ p> <? = $ currentpage?> з <? = $ countedpages?> </ p> <p> <? php / / Вивести сторінки для вибору & nbsp; for ($ i = 1; $ i <= $ countedpages; $ I + +) ( if ($ currentpage! = $ i) ( & nbsp; echo "<a href = " ". $ PHP_SELF."? show = ". $showperpage. "& page =". $ i. ""> ". $ i nt>. "</ a>"; ) Else ( echo $ i; ) echo ""; )
?> </ P> <? php if (! mysql_num_rows ($ result)) ( echo "<p> За запитом нічого не знайдено </ p>"; ) Else ( & n bsp; $ i = $ start_pos; echo "<ol start = " "700 ">. $ I." ">"; / / Перейти на початкову позицію mysql_data_seek ($ result, $ i - 1) or echo "Could not seek to row ". ($ i - 1); / / Вивести знайдені результати до позиції $ end_pos while ($ row = mysql_fetch_array ($ result)) ( & nb sp; if ($ i> $ end_pos) ( break; ) echo00 ">" <li> ". $ Row [ 'field1']." </ Li> "; $ i + +; ) echo "</ ol>"; ) ?> <br />
Ефективність Як бачите, в коді закладена не зовсім ефективна концепція. Спочатку ми повертаємо всі результати з SQL запиту, а потім робимо навігацію в отриманому результаті. З точки зору правильного підходу неефективно витягувати всі ст роки а потім виводити тільки потрібні. MySQL дозволяє ще на стадії написання SQL запиту обмежити результат тільки поточний сторінкою через інструкцію LIMIT. Наприклад щоб вивести 3-ю сторінку з 20 рядками досить написати
000bb "> <? Php $ result = mysql_query ( "SELECT * FROM table WHERE .... LIMIT 40, 20"); while($ Row = mysql_fetch_array ($ result)) ( echo $ row ['field1']; ) ?>
але тоді виникає проблема підрахунку всіх сторінок. Як дізнатися скільки б повернув запит записів без обмеження LIMIT? Виходу два:
Чи будуть ці варіанти ефективніше у вашому конкретному випадку вирішувати вам, досвідченім шляхом. Варіант з новим MySQL напевно буде краще, а варіант з окремим підрахунком буде прийнятний тільки у випадку нескладній вибірки WHERE по індексам. Останній варіант, для прикладу, реалізований у phpMyAdmin |