template

Index :: PHP/MySQL :: Seitenweise in Datensätzen blättern

Wenn als Ergebnis einer Suche sehr viele Datensätze anzuzeigen sind, z.B. hunderte oder gar tausende, dann ist es oft vorteilhaft, dem Benutzer ein seitenweises Blättern anzubieten, wie es auch für die Trefferlisten von Suchmaschinen praktiziert wird. Erstens entfällt dadurch die Zeit für einen umfangreichen Seitenaufbau, und zweitens muss der Benutzer dann nicht meterweise scrollen, nur um den hinteren Teil der Liste zu betrachten.

Je nach Höhe des Datenelements (normalerweise eine oder zwei Tabellenzeilen), der durchschnittlichen Bildschirmauflösung und der Schriftgröße werden meist zwischen 10 und 25 Elemente pro Seite angezeigt.


Optik

Das Blätter-Control selbst besteht aus einer einzeiligen Tabelle, in deren Zellen die relevanten Seiten als anklickbare Verweise untergebracht sind.
Hier 3 Beispiele für verschiedene Positionen (Anfang, Mittelteil und Ende) in einer 28-seitigen Liste:

 Seite 1  2 3 4 ... 28

... 9 10 11  Seite 12  13 14 15 ... 28

... 25 26 27  Seite 28 

Ausgehend von der aktuellen Position kann in Sprüngen von bis zu 3 Seiten vor- bzw. zurückgeblättert werden.

Ressourcen

Zur Darstellung werden vier Images benötigt:
Grafik-Ressourcen
img/i16First.gif Symbol für erstes Element
img/i16Prev.gif Symbol für vorhergehendes Element
img/i16Next.gif Symbol für nächstes Element
img/i16Last.gif Symbol für letztes Element

Funktion: ins_pager()

Generiert wird das Control von einer eigenen Funktion namens ins_pager(), die man am besten in einem allgemeinen Bausteine-Modul wie etwa macros.inc.php unterbringt.

Es stehen folgende Parameter zur Verfügung:
$pgnrSeitennummer [1...N].
Die aktuelle, hervorzuhebende Seitennummer.
$pgcntGesamtanzahl der Seiten.
$targetSkriptname.
Der Name des Skripts, in dem sich das Blättermodul befindet.
[$para](optional) zusätzliche URL-Parameter.
Falls das $target-Skript (unabhängig vom Blättermechanismus) irgendwelche GET-Parameter benötigt, so können sie hier übergegeben werden, z.B. '&id=13&sort=5'; diese Angaben werden dann unverändert durchgeschleust.

Eventuell müssen Farben (Rahmen:#A0A0A0, Infozelle:#D0D0D0, Verweiszelle:#E0E0E0) oder Grafikpfade angepasst werden; im nachfolgenden Quellcode sind die entsprechenden Stellen markiert:
function ins_pager($pgnr,$pgcnt,$target,$para='') { if ($pgcnt<2) return;
  echo '<table bgcolor="#A0A0A0" cellspacing="1" cellpadding="2"><tr bgcolor="#E0E0E0">';
  if ($pgnr>1) { echo '<td><a href="',$target,'?pgnr=1',$para,'" title=" zur ersten Seite ">';
    echo '<img src="img/i16First.gif" border="0"></a></td>';
    if ($pgnr>5) echo '<td bgcolor="#D0D0D0">...</td>';
    if ($pgnr>4) echo '<td><a href="',$target,'?pgnr=',($pgnr-3),$para,'">',($pgnr-3),'</a></td>';
    if ($pgnr>3) echo '<td><a href="',$target,'?pgnr=',($pgnr-2),$para,'">',($pgnr-2),'</a></td>';
    if ($pgnr>2) { echo '<td><a href="',$target,'?pgnr=',($pgnr-1),$para,'" title=" zur vorhergehenden Seite ">';
      echo ($pgnr-1),'<img src="img/i16Prev.gif" border="0" align="absmiddle"></a></td>'; }}
  echo '<td bgcolor="#D0D0D0">&nbsp;Seite <b>',$pgnr,'</b>&nbsp;</td>';
  if ($pgnr<$pgcnt) {
    if ($pgnr<($pgcnt-1)) { echo '<td><a href="',$target,'?pgnr=',($pgnr+1),$para,'" title=" zur n&auml;chsten Seite ">';
      echo '<img src="img/i16Next.gif" border="0" align="absmiddle">',($pgnr+1),'</a></td>'; }
    if ($pgnr<$pgcnt-2) echo '<td><a href="',$target,'?pgnr=',($pgnr+2),$para,'">',($pgnr+2),'</a></td>';
    if ($pgnr<$pgcnt-3) echo '<td><a href="',$target,'?pgnr=',($pgnr+3),$para,'">',($pgnr+3),'</a></td>';
    if ($pgnr<$pgcnt-4) echo '<td bgcolor="#D0D0D0">...</td>';
    echo '<td><a href="',$target,'?pgnr=',$pgcnt,$para,'" title=" zur letzten Seite ">';
    echo '<img src="img/i16Last.gif" border="0" align="absmiddle">',$pgcnt,'</a></td>';
  } echo '</tr></table>';
}
Durch Anklicken einer neuen Seitennummer wird das target-Skript mit dem URL-Parameter pgnr=N aufgerufen, wobei N für die Seitennummer steht.

Verwendung im Dokument

Das simplifizierte Beispiel zeigt, wie im Skript history.php der Inhalt einer MySQL-Tabelle namens hist aufgelistet wird.

Relevant sind folgende Schritte:
Php Einleitung
include('macros.inc.php'); $pglines=10; // Definition: Zeilen pro Seite if (strlen($_GET['pgnr'])) $pgnr=intval($_GET['pgnr']); else $pgnr=1; // URL pruefen $row=mysql_fetch_row(mysql_query('SELECT COUNT(*) FROM hist')); $total=$row[0]; // Anzahl holen if ((($pgcnt=intval($total/$pglines))*$pglines)<$total) ++$pgcnt; // $pgcnt berechnen $pgnr=min(max($pgnr,1),$pgcnt); // $pgnr clipping $result=mysql_query('SELECT * FROM hist LIMIT '.(($pgnr-1)*$pglines).','.$pglines); // Query
Weiter unten, im BODY, die Liste:
Ein Control über der Tabelle
<?php
if ($pgcnt>1) ins_pager($pgnr,$pgcnt,'history.php'); ?>
Aufbau der Tabelle per while-Schleife:
<table> <?php while ($row=mysql_fetch_row($result)) {
... Zeile ausgeben ...
} ?> </table>
Ein Control unter der Tabelle
<?php
if ($pgcnt>1) ins_pager($pgnr,$pgcnt,'history.php'); ?>

Index :: PHP/MySQL


template