ru en uk

  авторизація



   Ціни

Власне розбивка, точніше арифметика, 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'];
& n
bsp;)
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) (
& nb
sp; $ end_pos = $ counted;
)
?>
<p> Знайдено: <? = $ counted?> </ p>
<? = $ currentpage?>
з <? = $ countedpages?> </ p>
<p> <? php
/ / Вивести сторінки для вибору
& nb
sp; for ($ i = 1; $ i <= $ countedpages; $ I + +) (
if ($ currentpage!
= $ i) (
& nb
sp; echo "<a href = " ". $ PHP_SELF."? show = ". $showperpage. "& page =". $ i. ""> ". $ i nt>. "</ a>";
) Else (
echo
$ i;
)
&
nbsp; 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;
)
echo
00 ">" <li> ". $ Row [ 'field1']." </ Li> ";
&
nbsp; $ 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> 4.0.x то зробити так:

    <? php
    $ sql
    = "SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE & n
    bsp ;..... LIMIT 0, 200 ";
    $ result = mysql_query ($ sql);
    ont> $ sql = "SELECT FOUND_ROWS ()";
    $ count_row = mysql_fetch_rowolor = "# 007700"> (mysql_query ($ sql));
    $ counted = $ count_row [0];
    ?>


  • Попередньо зробити SELECT COUNT (id) FROM table WHERE ...

Чи будуть ці варіанти ефективніше у вашому конкретному випадку вирішувати вам, досвідченім шляхом. Варіант з новим MySQL напевно буде краще, а варіант з окремим підрахунком буде прийнятний тільки у випадку нескладній вибірки WHERE по індексам. Останній варіант, для прикладу, реалізований у phpMyAdmin

 
Введення в PHP5
29.05.2007
Робота з базами даних
29.05.2007
Блокування файлів
29.05.2007