<?php
$conn = mysql_connect('localhost', 'root', '') or die ("Keine Verbindung möglich: ".mysql_error());
mysql_select_db('test') or die ("Kann DB nicht auslesen: ".mysql_error());
//Aktuelle Seitennummer aus dem $_GET auslesen
$actPageNr = ($_GET['nr']) ? $_GET['nr'] : 0;
//Definitionen
$sql = "SELECT * FROM nav";
$itemsPerPage = 5;
//Mein Navigator anlegen (Die Klasse ist weiter unten definiert)
$myNav = new Navigator($sql, $itemsPerPage);
//Aktuelle Seite setzen
$myNav->setPageNr($actPageNr);
//Zu Testzwecken geb ich ma das generierte SQL aus, im normalfall kann man damit die Daten abrufen
echo $myNav->getActSql();
echo "<hr />";
//Aufbau der Navigation
//Erste/Vorhergehende Seite -Links einfügen
if(!$myNav->bof()){
$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getFirstNr()."'><<</a>";
$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getPrevNr()."'><</a>";
}
//Pro Seite einen Link einfügen
foreach($myNav->getPageNumbers() as $nr){
if($nr == $actPageNr){
$navEntries[] = "<b>{$nr}</b>";
}else{
$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr={$nr}'>{$nr}</a>";
}
}
//Nächste/Letzte Seite -Links einfügen
if(!$myNav->eof()){
$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getNextNr()."'>></a>";
$navEntries[] = "<a href='{$_SERVER['PHP_SELF']}?nr=".$myNav->getLastNr()."'>>></a>";
}
//Alle Links mit ' | ' getrennt ausgeben
echo implode(' | ', $navEntries);
/**
* @copyright mpl by ERB software
* All rights reserved
* @author stefan.erb@erb-software.com
*/
Class Navigator{
const C_DEFAULT_ITEMS_PER_PAGE = 10;
protected $sql;
protected $itemsPerPage;
protected $pages = array();
protected $index = array();
protected $actPageNr;
/**
* Constructeur
* @param $sql String SQL das die Daten angrenzt, ohne ; am Schluss
* @param $itemsPerPage Integer Anzahl Datensätze die pro Seite angezeigt werden sollen
*/
public function __construct($sql, $itemsPerPage =C_DEFAULT_ITEMS_PER_PAGE){
$this->sql = $sql;
$this->itemsPerPage = $itemsPerPage;
//Anzahl Datensätze ermitteln
$sql = "SELECT COUNT(*) AS count_items FROM ({$this->sql}) AS data_for_count";
$result = mysql_query($sql);
$countItems = mysql_result($result, 0, 0);
mysql_free_result($result);
//Die Seiten definieren-> array([pageNr] => [LIMIT-Start der DB])
$this->pages = range(0, $countItems-1, $this->itemsPerPage);
$this->index = array_keys($this->pages);
}
/**
* Die aktuelle Seitennummer setzen
* @param $pageNr Integer
*/
public function setPageNr($pageNr){
$this->actPageNr = $pageNr;
}
/**
* Ein SQL ausgeben mit dem man die Daten abrufen kann
* @retrun String SQL-Statement
*/
public function getActSql(){
return "{$this->sql} LIMIT {$this->pages[$this->actPageNr]}, {$this->itemsPerPage}";
}
/**
* @return Array<Integer> Gibt ein Array mit allen Seitennummern aus
*/
public function getPageNumbers(){
return $this->index;
}
/**
* Begin of File
* @param $pageNr Integer Optional: zu prüfende Nr
* @return Boolean Gibt an ob der Zeiger auf dem ersten Element steht
*/
public function bof($pageNr = false){
if(!$pageNr) $pageNr = $this->actPageNr;
return $pageNr <= $this->getFirstNr();
}
/**
* End of File
* @param $pageNr Integer Optional: zu prüfende Nr
* @return Boolean Gibt an ob der Zeiger auf dem letzten Element steht
*/
public function eof($pageNr = false){
if(!$pageNr) $pageNr = $this->actPageNr;
return $pageNr >= $this->getLastNr();
}
/**
* @return Integer Erste Seitennummer
*/
public function getFirstNr(){
return reset($this->index);
}
/**
* @return Integer Letzte Seitennummer
*/
public function getLastNr(){
return end($this->index);
}
/**
* @return Integer Nächste Seitennummer (false falls wir bereits am Ende sind)
*/
public function getNextNr($pageNr = false){
if(!$pageNr) $pageNr = $this->actPageNr;
$nextNr = ((!$pageNr) ? $this->actPageNr : $pageNr) + 1;
return ($this->eof($nextNr)) ? false : $nextNr;
}
/**
* @return Integer Vorhergehende Seitennummer (false falls wir bereits am Anfang sind)
*/
public function getPrevNr($pageNr = false){
if(!$pageNr) $pageNr = $this->actPageNr;
$prevNr = ((!$pageNr) ? $this->actPageNr : $pageNr) - 1;
return ($this->bof($prevNr)) ? false : $prevNr;
}
}
?>