Paginator

September 2009

Folgende Skripte zeigen, wie man Arrays, MySQL-Resultate oder Text auf mehrere Seiten gleichmässig verteilen kann.

Array
Mit folgendem Code wird der Inhalt eines Array auf mehrere Seiten verteilt.
Die einzelnen Objekte von $meinarray werden so auf die Seiten verteilt, damit pro Seite maximal $int_epp Objekte vorhanden sind.
Hier kann man auch mit einem assoziativen und multidimensionalen Array arbeiten.
Die Get-Variable $p beinhaltet die aktuelle Seitennummer.
<?php
# Dein Array
$meinarray = array('A','B','C','D','E','F','G','H','I','J','K','L',
            
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
            
# Anzahl Objekte pro Seite
$int_epp 8;

$int_total count($meinarray); // totale Anzahl Objekte

$int_ttpages ceil($int_total/$int_epp); // totale Anzahl Seiten

$int_tpage = isset($_GET['p']) ? (int)$_GET['p'] : 1// aktuelle Seite
if($int_tpage>$int_ttpages || $int_tpage<1$int_tpage 1;

# Seiten-Navigation
$str_pnav '<div>Seite: ';
if(
$int_tpage >= 4)
  
$str_pnav .= '<a href="?p=1">1</a>'// erste Seite
if($int_tpage >= 2)
  
$str_pnav .= ' <a href="?p='.($int_tpage-1).'">««</a> '// 1 zurück
for($a=1$a<=$int_ttpages$a++){
  if(
$a == $int_tpage)
    
$str_pnav .= '<b>'.$a.'</b>'// wenn diese Seite
  
elseif($a>$int_tpage-&& $a<$int_tpage+3)
    
$str_pnav .= '<a href="?p='.$a.'">'.$a.'</a>'// wenn andere Seite
  
if($a<$int_ttpages && $a>$int_tpage-&& $a<$int_tpage+2)
    
$str_pnav .= ' &middot; '// Trenn-Zeichen
}
if(
$int_tpage <= $int_ttpages-1)
  
$str_pnav .= ' <a href="?p='.($int_tpage+1).'">»»</a> '// 1 vor
if($int_tpage <= $int_ttpages-3)
  
$str_pnav .= '<a href="?p='.$int_ttpages.'">'.$int_ttpages.'</a>'// letzte Seite
$str_pnav .= '</div>';

echo 
$str_pnav// Seiten-Navigation ausgeben

$int_count 0;
foreach(
$meinarray as $value){
  
$int_count++;
  if(
$int_count > ($int_tpage-1)*$int_epp && $int_count <= $int_tpage*$int_epp){
    
## Hier werden die Daten ausgegeben (enthalten in $value)
    ## Beispiel: echo $value.'<br />';
  
}
  elseif(
$int_count <= ($int_tpage-1)*$int_epp)
    continue;
  elseif(
$int_count $int_tpage*$int_epp)
    break;
}

echo 
$str_pnav// Seiten-Navigation nochmal ausgeben
?>

MySQL
Mit diesem Code wird ein MySQL-Resultat auf mehrere Seiten verteilt.
Die einzelnen Einträge, welche mit $sql_query aus der Datenbank geholt wurden, werden so auf die Seiten verteilt, damit pro Seite maximal $int_epp Einträge vorhanden sind.
<?php
# Dein MySQL-Query
$sql_query "SELECT * FROM tabelle WHERE spalte='iwas' ORDER BY iwas";

# Anzahl Objekte pro Seite
$int_epp 10;

$sql_res mysql_query($sql_query) or die(mysql_error()); // Query ausführen
$int_total mysql_num_rows($sql_res); // Objekte zählen 

$int_ttpages ceil($int_total/$int_epp); // totale Anzahl Seiten

$int_tpage = isset($_GET['p']) ? (int)$_GET['p'] : 1// aktuelle Seite
if($int_tpage>$int_ttpages || $int_tpage<1$int_tpage 1;

# Seiten-Navigation
$str_pnav '<div>Seite: ';
if(
$int_tpage >= 4)
  
$str_pnav .= '<a href="?p=1">1</a>'// erste Seite
if($int_tpage >= 2)
  
$str_pnav .= ' <a href="?p='.($int_tpage-1).'">««</a> '// 1 zurück
for($a=1$a<=$int_ttpages$a++){
  if(
$a == $int_tpage)
    
$str_pnav .= '<b>'.$a.'</b>'// wenn diese Seite
  
elseif($a>$int_tpage-&& $a<$int_tpage+3)
    
$str_pnav .= '<a href="?p='.$a.'">'.$a.'</a>'// wenn andere Seite
  
if($a<$int_ttpages && $a>$int_tpage-&& $a<$int_tpage+2)
    
$str_pnav .= ' &middot; '// Trenn-Zeichen
}
if(
$int_tpage <= $int_ttpages-1)
  
$str_pnav .= ' <a href="?p='.($int_tpage+1).'">»»</a> '// 1 vor
if($int_tpage <= $int_ttpages-3)
  
$str_pnav .= '<a href="?p='.$int_ttpages.'">'.$int_ttpages.'</a>'// letzte Seite
$str_pnav .= '</div>';

echo 
$str_pnav// Seiten-Navigation ausgeben

$int_count = ($int_tpage-1)*$int_epp;
mysql_data_seek($sql_res, ($int_tpage-1)*$int_epp); // Zeiger versetzen

while($sql_row mysql_fetch_array($sql_res)){
  if(
$int_count > ($int_tpage-1)*$int_epp && $int_count <= $int_tpage*$int_epp){
    
## Hier werden die Daten ausgegeben (enthalten in $sql_row)
    ## Beispiel: echo $sql_row['iwas'].'<br />';
  
}
  if(
$int_count $int_tpage*$int_epp)
    break;
  
$int_count++;
}

echo 
$str_pnav// Seiten-Navigation nochmal ausgeben
?>

Siehe auch:

Volltext
Mit diesem Code kann ein Volltext auf mehrere Seiten verteilt werden.
Der Text $meintext wird in mehrere Stücke mit Länge $int_bpp zerlegt, wobei immer bei Leerzeichen (Whitespace) getrennt wird.
Auf HMTL und anderen Code im Text wird bei der Teilung keine Rücksicht genommen.
<?php
# Dein Text
$meintext 'Text bezeichnet eine abgegrenzte, zusammenhängende
    Äusserung in geschriebener Sprache, im weiteren Sinne auch
    die nicht geschriebene, aber schreibbare Sprachinformation.'
;

# Anzahl Zeichen pro Seite
$int_bpp 1000// 1000 Zeichen = ~140 Wörter

$int_total strlen($meintext); // totale Anzahl Zeichen

$int_ttpages ceil($int_total/$int_bpp); // totale Anzahl Seiten

$int_tpage = isset($_GET['p']) ? (int)$_GET['p'] : 1// aktuelle Seite
if($int_tpage>$int_ttpages || $int_tpage<1$int_tpage 1;

# Seiten-Navigation
$str_pnav '<div>Seite: ';
if(
$int_tpage >= 4)
  
$str_pnav .= '<a href="?p=1">1</a>'// erste Seite
if($int_tpage >= 2)
  
$str_pnav .= ' <a href="?p='.($int_tpage-1).'">««</a> '// 1 zurück
for($a=1$a<=$int_ttpages$a++){
  if(
$a == $int_tpage)
    
$str_pnav .= '<b>'.$a.'</b>'// wenn diese Seite
  
elseif($a>$int_tpage-&& $a<$int_tpage+3)
    
$str_pnav .= '<a href="?p='.$a.'">'.$a.'</a>'// wenn andere Seite
  
if($a<$int_ttpages && $a>$int_tpage-&& $a<$int_tpage+2)
    
$str_pnav .= ' &middot; '// Trenn-Zeichen
}
if(
$int_tpage <= $int_ttpages-1)
  
$str_pnav .= ' <a href="?p='.($int_tpage+1).'">»»</a> '// 1 vor
if($int_tpage <= $int_ttpages-3)
  
$str_pnav .= '<a href="?p='.$int_ttpages.'">'.$int_ttpages.'</a>'// letzte Seite
$str_pnav .= '</div>';

echo 
$str_pnav// Seiten-Navigation ausgeben

$len_strsp 0;
$int_count 0;
while(
$int_count $int_ttpages){
  
$int_count++;
  
  
$str_text substr($meintext$len_strsp$int_bpp*$int_count-$len_strsp);
  
$str_text preg_replace('#[^\s]*$#s'''$str_text);
  
$len_strsp strlen($str_text)+$len_strsp;
  
  if(
$int_count == $int_tpage){
    
## Text-Fragment ausgeben ##
    
echo $str_text;
    break;
  }
}

echo 
$str_pnav// Seiten-Navigation nochmal ausgeben
?>

Achtung: HTML-Code, welcher im Text enthalten ist, wird bei der Teilung ignoriert, was gegebenenfalls zu einer Fehldarstellung im Browser führen kann!

Siehe auch:
 
PHP


Andere Einträge