ru en uk

  авторизация

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



Home   |   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
    "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
    Если Вам нужно послать сообщение администратору, пользователю, сделать рассылку, отправить отчет по електронной почте, то проще всего это сделать с помощью встроенной функции mail()...
    Блокировка файлов
    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!"