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.
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:
Ausgehend von der aktuellen Position kann in Sprüngen von bis zu 3 Seiten vor- bzw. zurückgeblättert werden.
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 |
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:
$pgnr | Seitennummer [1...N]. Die aktuelle, hervorzuhebende Seitennummer. |
$pgcnt | Gesamtanzahl der Seiten. |
$target | Skriptname. 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"> Seite <b>',$pgnr,'</b> </td>';
if ($pgnr<$pgcnt) {
if ($pgnr<($pgcnt-1)) { echo '<td><a href="',$target,'?pgnr=',($pgnr+1),$para,'" title=" zur nä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.
Das simplifizierte Beispiel zeigt, wie im Skript
history.php der Inhalt einer MySQL-Tabelle namens hist aufgelistet wird.
Relevant sind folgende Schritte:
- Einbindung des entsprechenden Moduls (hier:
macros.inc.php)
- In $pglines die Zeilen pro Seite festlegen (hier: 10)
- Aktuelle Seitennummer $pgnr initialisieren (evtl. aus GET-Parameter)
- Treffer Gesamtanzahl $total holen (per COUNT-Query)
- Seiten Gesamtanzahl $pgcnt berechnen
- Seitennummer $pgnr sicherheitshalber clippen
- Query mit LIMIT offset,anzahl durchführen
- Control per ins_pager() einblenden
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'); ?>
template |
 |