Ierakstu dalīšana pa lappusēm

24
Jan
21

Tēma šoreiz nav sareģīta, bet visur ir savs āķis.

Zināms, ka, lai izrēķinātu lappušu skaitu, jāzin kopējais ierakstu skaits, tātad divi pieprasījumi uz datubāzi:

  1. Iegūstam nepieciešamo skaitu ar ierakstiem
  2. Iegūstam kopējo ierakstu skaitu

Bet kur tad optimizācija? Un ja vēl nepieciešams liels skaits dinamiski ģenerētu filtru? Būs jāveido divi gandrīz identiski pieprasījumi – viens ar limitu, viens bez.

Es piedāvāju izmantot vienu no ne tik slavenajām MySQL funkcijām – SQL_CALC_FOUND_ROWS un FOUND_ROWS(). Pieprasījums un tā apstrāde, manā gadījumā, izskatīsies šādi:

1
2
3
4
5
6
7
8
9
10
11
12
<?
  $perpage=10; // ieraksti vienā lappusē
  $_LIMIT=(!empty($_GET['p']) && $_GET['p']>1)?($_GET['p']*$perpage)-$perpage:0; // izrēķinam limita sākuma pozīciju, atkarīgā no atvērtās lappuses, kas padota kā ?p=X
  $_LIMIT.=", ".$perpage;
  $sql="SELECT SQL_CALC_FOUND_ROWS * FROM `tabula` LIMIT ".$_LIMIT;
  $res=mysql_query($sql);
  $count=mysql_fetch_object(mysql_query("SELECT FOUND_ROWS() as c"));
  while($row=mysql_fetch_object($res)){
    var_dump($row);
  }
  $pages=splittopages($count->c,$perpage);
?>

Funkcija, kura izrēķinās lappušu skaitu. Pieejamās lappuses tiek saliktas masīvā, lai būtu vienkāršāk izveidot pogas “Nākamā lappuse” un “Iepriekšējā lappuse” – atliek tikai pārbaudīt vai masīvā eksistē ieraksts ar atbilstošu atslēgu.

1
2
3
4
5
6
7
8
9
10
11
<?
  function splittopages($count,$perpage){
    $pagescount=ceil($count/$perpage);
      $pages=array();
      if($pagescount<2){ return $pages; }
        for($i=1;$i<=$pagescount;$i++){
        $pages[]=$i;
      }
    return $pages;
  }
?>

Lappušu izvade.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  if($_GET['p']<2){ $_GET['p']=1; } // definēsim lappusi paši, ja tā vēl nav definēta
  $now=array_search($_GET['p'],$pages); // atvērtā lappuse
  $prev=$now-1;
  $next=$now+1;
  if(array_key_exists($prev,$pages)){
    echo '<a href="?p='.$pages[$prev].'">Iepriekšējā lappuse</a>';
  }
  foreach($pages as $value){
    $active=$_GET['p']==$value?' class="active"':''; // atzīmējam atvērto lappusi
    echo '<a href="?p='.$value.'"'.$active.'>'.$value.'</a>';
  }
  if(array_key_exists($next,$pages)){
    echo '<a href="?p='.$pages[$next].'">Nākamā lappuse</a>';
  }
?>

Lielākais ieguvums izmantojot šādu risinājumu ir tāds, ka nav jāsūta vēl viens praktiski identisks pieprasījums uz datubāzi, ierakstu skaits jau tiek nokešots MySQL’ā.
Bez liekiem if’iem tiek pie nākamās un iepriekšējās lappuses.