Paging
Regins Corner...  
 
  Freelance | Søgemaskine-optimering | Referencer | PHP Scripts | Nyheder | Sitemap  
   Mails fra PHP
   Dropdowns - Selects
   Upload med PHP
   MySQL Sortering
   Du er her
   Paging
   Træstruktur
   Tilfældigt kodeord
   Headers håndtering
   Procentbar
   Dansk dato format
   Tell a friend
   Google placering

Paging

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 .="&amp;"
;
            }
        }
        
$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 .="&amp;"
;
            }
        } 
        
$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
;
    }
}
?>

 
 
  © Copyrights Regin Gaarsmand 2002-2007
Kontakt | ButikListen.dk | Aestetik-priser.dk | Precios-Esteticos.com | ListaDeTiendas.com | annoncelisten.dk