Nedenstående script er flyttet til:
http://www.sourcerally.net/Scripts/17-Paging-with-PHP-and-MySQL
F.eks. på Google hvor der ofte repræsenteres store database udtræk er paging en nødvendig. Paging vil sige at præsentere data udtrækket på flere sider. Til at udføre paging hurtigt og simpelt har jeg udviklet klassen dblister. Hvor vidt metoden er den mest skalerbare måde at gøre det på skal jeg ikke garantere. Selv mener jeg det går pænt stærkt og har testet det mod andre metoder! I er selvfølgelig velkomne til at udfordre det.
NB: Der ligger to forskellige scripts på denne side et som virker for alle mysql databaser og et som virker for alle mysql databaser fra og med MySql 4.0. Køres 4.0+ anbefaler jeg dette - det er hurtigere og nemmere at bruge.
Mysql 4.0+
<?php
/*
#Copyright Regin Gaarsmand - email: regin(snabela)gaarsmand.dk
#www.reginscorner.dk
Hurtigt eksempel på brug:
1: Opret en tabel med rækkerne id (autoincrement) og name
2: Fyld databasen med 1000 forskellige navne
3: Eksekver nedenstående kode hvor der er oprettet forbindelse til databasen
<eksempel>
$sql = "SELECT * FROM users where 1";
$dblister = new dblister1($sql,'page',15);
while($row = mysql_fetch_array($dblister->result)
{
echo $row['id']." ".$row['name']."<br>";
}
echo $dblister->show();
</eksempel>
//Jeg må ærligt indrømme jeg er for doven til at kommentere resten!
//Men I kan se hvordan det virker!!!!
*/
class dblister1
{
var $sql;
var $getvar;
var $rows;
var $start;
var $getvar_val;
var $pager;
var $result;
function dblister1($sql,$getvar,$length)
{
$this->result=null;
$this->sql = $sql;
$this->getvar = $getvar;
$this->rows = 0;
$this->start = 0;
$this->getvar_val = 1;
$this->pager = null;
$this->SetLength($length);
$this->GetStart();
$this->doQuery();
}
//Sets $length
function SetLength($length)
{
$this->length = (int)$length;
if($this->length<0)
{
$this->length = 0;
}
}
function doQuery()
{
$sql = trim($this->sql);
$sql = substr($sql,6);
$sql = 'SELECT SQL_CALC_FOUND_ROWS '.$sql.' limit '.$this->start.', '.$this->length;
$this->result = mysql_query($sql);
$sql = "SELECT FOUND_ROWS()";
$result = mysql_query($sql);
$this->rows = mysql_result($result,0);
}
//getvar_val() gets the
//$getvar_val is a positive integer - > 0
function Set_Getvar_val()
{
$this->getvar_val = (int)$_GET[$this->getvar];
if($this->getvar_val<1)
{
$this->getvar_val = 1;
}
}
//Gets the start of the data
function GetStart()
{
$this->Set_Getvar_val();
$this->start = (($this->getvar_val-1)*$this->length);
}
function show($next="Next",$last="Last",$separator=" ")
{
$array = $this->pager();
$str = array();
foreach($array as $k => $v)
{
if($k!='next'&&$k!='last')
{
if($k==$this->getvar_val)
{
$str[] = $k;
}
else
{
$str[] = '<a href="'.$v.'">'.$k.'</a>';
}
}
}
$str = implode($separator, $str);
$rt = $array['last']===null?"":'<a href="'.$array['last'].'">'.$last.'</a>'.$separator;
$rt .= $str.$separator;
$rt .= $array['next']===null?"":'<a href="'.$array['next'].'">'.$next.'</a>';
return $rt;
}
//Returns an array of the links arround the given point
//['next'] => next page
//['last'] => last page
function pager($margin=10)
{
$path = $_GET;
$newpath = $PHP_SELF."?";
foreach($path as $key => $value)
{
if($key!=$this->getvar)
{
$newpath .= $key."=".$value;
$newpath .="&";
}
}
$newpath .= $this->getvar;
$linkpaths = array();
$current = $this->start / $this->length + 1;
$pages = ceil(($this->rows/$this->length));
$pagerstart = $current-$margin;
$pagerstart = ($pagerstart<1)?1:$pagerstart;
$pagerend = $current+$margin;
$pagerend = ( $pagerend > $pages ) ? ( ceil( ( $this->rows / $this->length ) ) ): $pagerend;
for($i=$pagerstart;$i < ($pagerend+1);$i++)
{
$linkpaths[$i] = $newpath."=".($i);
}
if($linkpaths[($current+1)]!=null)
{
$linkpaths['next']=$linkpaths[($current+1)];
}
if($linkpaths[($current-1)]!=null)
{
$linkpaths['last']=$linkpaths[($current-1)];
}
return $linkpaths;
}
}
?>
Før (og efter) Mysql 4.0
<?php
/*
#Copyright Regin Gaarsmand - email: regin(snabela)gaarsmand.dk
#www.reginscorner.dk
Hurtigt eksempel på brug:
1: Opret en tabel med rækkerne id (autoincrement) og name
2: Fyld databasen med 1000 forskellige navne
3: Eksekver nedenstående kode hvor der er oprettet forbindelse til databasen
<eksempel>
$sql1 = "SELECT count(id) from tablename where 1";
$sql2 = "SELECT id, name from tablename where 1 order by id";
$dblister = new dblister($sql1,$sql2,'page',15);
while($row = mysql_fetch_array($dblist->result2)
{
echo $row['id']." ".$row['name']."<br>";
}
echo $dblister->show();
</eksempel>
//Jeg må ærligt indrømme jeg er for doven til at kommentere resten!
//Men I kan se hvordan det virker!!!!
*/
class dblister
{
//sql which counts number of rows matching the query
var $sqlcount;
//sql which extract information the information from the query
var $sqlextract;
//Result from $sqlcount
var $result1;
//Result from $sqlextract
var $result2;
//Number of rows from $sqlcount
var $rows;
//$_GET[$getvar] used to do the paging
//Also gives the $start of the extract
//The start row is calculated $length*$getvar
var $getvar;
//$getvar_val the extracted value from $_GET[$getvar]
//Is recalculated!
var $getvar_val;
//Start row of the extract
//Is a positive integer and treated as PRIVATE
//Calculated $length*$_GET[$getvar]
var $start;
//$length of the extract
var $length;
//constructor
function dblister($sqlcount,$sqlextract,$getvar,$length)
{
$this->sqlcount = $sqlcount;
$this->sqlextract = $sqlextract;
$this->getvar = $getvar;
$this->rows = 0;
$this->start = 0;
$this->getvar_val = 1;
$this->pager = null;
$this->SetLength($length);
$this->get_num_rows();
$this->GetStart();
$this->doextract();
}
//Sets $length
function SetLength($length)
{
$this->length = (int)$length;
if($this->length<0)
{
$this->length = 0;
}
}
//getvar_val() gets the
//$getvar_val is a positive integer - > 0
function Set_Getvar_val()
{
$this->getvar_val = (int)$_GET[$this->getvar];
if($this->getvar_val<1)
{
$this->getvar_val = 1;
}
}
//Gets the start of the data
function GetStart()
{
$this->Set_Getvar_val();
$this->start = (($this->getvar_val-1)*$this->length);
}
//Gets number of rows matching the query
function get_num_rows()
{
$this->result1 = mysql_query($this->sqlcount);
$this->rows = mysql_result($this->result1,0);
}
//Does the data extraction
function doextract()
{
if($this->rows<=$this->start)
{
//Don't do a useless query!
$this->result2 = false;
}
else
{
$this->result2 = mysql_query($this->sqlextract." limit ".$this->start.", ".$this->length);
}
}
//Returns an array of the links arround the given point
//['next'] => next page
//['last'] => last page
function pager($margin=10)
{
$path = $_GET;
$newpath = $PHP_SELF."?";
foreach($path as $key => $value)
{
if($key!=$this->getvar)
{
$newpath .= $key."=".$value;
$newpath .="&";
}
}
$newpath .= $this->getvar;
$linkpaths = array();
$current = $this->start / $this->length + 1;
$pages = ceil(($this->rows/$this->length));
$pagerstart = $current-$margin;
$pagerstart = ($pagerstart<1)?1:$pagerstart;
$pagerend = $current+$margin;
$pagerend = ( $pagerend > $pages ) ? ( ceil( ( $this->rows / $this->length ) ) ): $pagerend;
for($i=$pagerstart;$i < ($pagerend+1);$i++)
{
$linkpaths[$i] = $newpath."=".($i);
}
if($linkpaths[($current+1)]!=null)
{
$linkpaths['next']=$linkpaths[($current+1)];
}
if($linkpaths[($current-1)]!=null)
{
$linkpaths['last']=$linkpaths[($current-1)];
}
return $linkpaths;
}
//Showing the pager object (primitive!)
function show($next="Next",$last="Last",$separator=" ")
{
$array = $this->pager();
$str = array();
foreach($array as $k => $v)
{
if($k!='next'&&$k!='last')
{
if($k==$this->getvar_val)
{
$str[] = $k;
}
else
{
$str[] = '<a href="'.$v.'">'.$k.'</a>';
}
}
}
$str = implode($separator, $str);
$rt = $array['last']===null?"":'<a href="'.$array['last'].'">'.$last.'</a>'.$separator;
$rt .= $str.$separator;
$rt .= $array['next']===null?"":'<a href="'.$array['next'].'">'.$next.'</a>';
return $rt;
}
}
?>