ru en uk

  авторизация

(044) 362 48 16   (098) 294 41 60


   Цены

Home   |   WEB development   |   Articles   |   Programming in PHP

Собственно разбивка, точнее арифметика, 3-ий класс



<?php
 $showperpage
=0;
// сколько показывать на страницу
 
if (isset($HTTP_GET_VARS['show'])){
  
$showperpage=(int)$HTTP_POST_VARS['show'];
 }
 if (isset(
$HTTP_POST_VARS['show'])){
  
$showperpage=(int)$HTTP_POST_VARS['show'];
 }

// сколько показывать на страницу по умолчанию
 
if (($showperpage<1)||($showperpage>100)) {
  
$showperpage=20;
 } 

// сколько записей получилось
   
$counted=mysql_num_rows($result);
// сколько будет страниц
       
$countedpages=ceil($counted/$showperpage);

// получить из УРЛ текущую страницу
       
$currentpage=0;
     if (isset(
$HTTP_GET_VARS['page'])) {
       
$currentpage=(int)$HTTP_GET_VARS['page'];
        }
   if (
$currentpage>$countedpages) {
    
$currentpage=$countedpages;
        }
   if (
$currentpage<1) {
        
$currentpage=1;
    }

// первая позиция
  
$start_pos=($currentpage-1)*$showperpage+1;
// последняя позиция
 
$end_pos=$start_pos+$showperpage-1;
 if (
$end_pos>$counted) {
     
$end_pos=$counted;
 }
?>
<p>Найдено: <?=$counted?></p>
<p>Страница: <?=$currentpage?> из <?=$countedpages?></p>
<p><?php
// вывести страницы для выбора
  
for ($i 1$i <= $countedpages$i++) {
    if (
$currentpage!=$i) {
     echo 
"<a href=\"".$PHP_SELF."?show=".$showperpage."&page=".$i."\">".$i."</a>";
    } else {
    echo 
$i;
    }
   echo 
" ";
  }

?></p>
<?php
if (!mysql_num_rows($result)){
 echo 
"<p>По запросу ничего не найдено</p>";
} else {
      
$i $start_pos;
    echo 
"<ol start=\"".$i."\">";
// перейти на начальную позицию
  
mysql_data_seek($result$i-1) or echo "Could not seek to row ".($i-1);
// вывести найденные результаты до позиции $end_pos
      
while ($row=mysql_fetch_array($result)){
     if (
$i>$end_pos){
    break;
     }
   echo 
"<li>".$row['field1']."</li>";
       
$i++;
      }
   echo 
"</ol>";
}
?>



Эффективность


Как видите, в коде заложена не совсем эффективная концепция. Сначала мы возвращаем все результаты из SQL запроса, а потом делаем навигацию в полученном результате. С точки зрения правильного подхода неэффективно вытягивать все строки а потом выводить только нужные. MySQL позволяет ещё на стадии написания SQL запроса ограничить результат только текущеё страницей через инструкцию LIMIT. Например чтобы вывести 3-ю страницу с 20 строками достаточно написать

<?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 ..... LIMIT 0, 200";
    $result mysql_query($sql);
    $sql "SELECT FOUND_ROWS()";
    $count_row=mysql_fetch_row(mysql_query($sql));
    $counted=$count_row[0];
    ?>


  • Предварительно сделать SELECT COUNT(id) FROM table WHERE...

Будут ли эти варианты эффективнее в вашем конкретном случае решать вам, опытным путем. Вариант с новым MySQL наверняка будет лучше, а вариант с отдельным подсчетом будет приемлим только в случае несложной выборки WHERE по индексам. Последний вариант, для примера, реализован в phpMyAdmin

 
Работа с базами данных
29.05.2007
Блокировка файлов
29.05.2007
Блокировка файлов
29.05.2007