ru en uk

  авторизация

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


   Цены

Собственно разбивка, точнее арифметика, 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

 
Что такое сессии и для чего они нужны?
26.04.2007
Сессии - это механизм, созданный для временного хранения и передачи информации между скриптами в пределах одного сайта...
Блокировка файлов
29.05.2007
"Warning! On most operation systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you cannot rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance!"
Основы безопасности
29.05.2007
Сразу скажем что PHP и Апач в этой области далеко не продвинулись. Нормальная многопользовательская конфигурация веб-сервера должна работать под разными пользователями...

 

Rambler's Top100