ru en uk

  авторизация

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


   Цены

Home   |   WEB development   |   Articles   |   Programming in PHP

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

 


 $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;
 }
?>

Найдено: 


Страница:  из 


// вывести страницы для выбора
  
for ($i 1$i <= $countedpages$i++) {
    if (
$currentpage!=$i) {
     echo 
".$PHP_SELF."?show=".$showperpage."&page=".$i."\">".$i."";
    } else {
    echo 
$i;
    }
   echo 
" ";
  }

?>


if (!mysql_num_rows($result)){
 echo 
"

По запросу ничего не найдено

"
;
} else {
      
$i $start_pos;
    echo 
".$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 
"
  • "
  • .$row['field1']."";
           
    $i++;
          }
       echo 
    "";
    }
    ?>


     

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


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

    У нас создание сайта Одесса подразумевает так же разработку сложных скриптов.
    $result=mysql_query("SELECT * FROM table WHERE .... LIMIT 40, 20");
    while (
    $row=mysql_fetch_array($result)){
     echo 
    $row['field1'];
    }
    ?>


    но тогда возникает проблема подсчета всех страниц. Как узнать сколько бы вернул запрос записей без ограничения LIMIT? Выхода два:


    • Если Вам повезло с версией MySQL > 4.0.x то сделать так:

      $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