IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - PHP: Seitenweises Blättern



PHP: Seitenweises Blättern

Ein Tutorial über die Erstellung von Navigationslinks auf Webseiten mit PHP.


Autor: Patrick Faes (dreamer)
Datum: 13-07-2005, 21:59:43
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 20201x
Rating: 8 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einführung

Dieses Script erzeugt eine Reihe von Links womit zwischen den einzelnen Seiten geblättert werden kann. So etwas kennt man von Newsseiten her, wo mann damit zwischen den einzelnen Seiten mit z.B. je 15 Einträgen blättern kann. Ein Beispiel davon sehen Sie hier:

Anfang Zurück ... 3 4 5 ... Weiter


Damit kann man zwischen den einzelnen Seiten blättern. Mit diesem Script ist es möglich zu bestimmen wieviele Links angezeigt werden sollen. Zusätzlich wird dieses Script ein Formularfeld erzeugen womit der Besucher die ausgewählte Seite sofort anspringen kann.

Seiten: 34
Gehe zu Seite


Die Erklärung über das Funktionieren des Scripts steht in der Form von Kommentaren im Script. Sie können es deshalb komplett kopieren (der generierte HTML-Code ist (X)HTML-kompatibel) und müssen nur an einigen Stellen das Script nach Bedarf anpassen. An wichtige Stellen wird hierauf hingewiesen.

Script
<?php
$db = mysql_connect('Host','User','Passwort');
mysql_select_db('Datenbank', $db);
$sql = "select Preis from Waren";
/* Da die Daten aus einer Datenbank kommen sollen, wird hier eine Verbindung zur Datenbank erstellt. In der Variablen $sql wird der Querycode gespeichert, allerdings jetzt noch ohne dem limit-Statement. Die Erklärung dafür folgt gleich. */
if (!isset($_REQUEST['Total']))
{
  $result = mysql_query($sql);
  $Total = mysql_num_rows($result);
  unset($result);
}
else
{
  $Total = $_REQUEST['Total'];
}
/* Das Script muss berechnen können wieviele Links zum Blättern angezeigt werden sollen. Für diese Berechnungen braucht das Script die genaue Zahl der Datenbankeinträgen die der Query zurückgeben würde, z.B. 300 Waren aus einem Laden. Mit der Funktion mysql_num_rows() wird errechnet wieviele das sind. Das ist auch der Grund warum das limit-Statement noch nicht hinzugefügt wurde. */
if (!isset($_REQUEST['Seite']))
{
  $Seite = 1;
}
else
{
  $Seite = $_REQUEST['Seite'];
}
if ($Seite > $Total) $Seite = $Total;
/* Die Variable $Seite kann vom Besucher kommen. Wenn noch kein Wert da ist, befindet sich der Besucher noch auf der ersten Seite. Deshalb wird, wenn $_REQUEST['Seite'] nicht gesetzt wurde, die Variable $Seite automatisch auf 1 gesetzt.*/
$ProSeite = 15;
$LinksZahl = 7;
$SeitenZahl = ceil($Total/$ProSeite);
if ($LinksZahl % 2 == 0) $LinksZahl++;
$NumerischeLinks = ($LinksZahl - 1) / 2;
$url = $_SERVER['PHP_SELF'];
/* In diesem Abschnitt werden einige, sehr wichtige, Variablen initialisiert. Sie müssen aber nur die ersten zwei davon nach Belieben ändern. Die Variablen haben folgende Zwecke:
- $ProSeite: Anzahl der Datenbankeinträge (z.B. News oder Warenpreise) pro Seite angezeigt werden müssen (können Sie nach Belieben ändern)
- $LinksZahl: Anzahl der numerischen Links die es geben soll (z.B. 5). Diese Zahl soll ungerade sein (wenn das nicht so ist, dann erhöht das Script diese Zahl automatisch um eins). Die Links "Anfang", "zurück", "weiter" und "Ende" werden hier nicht mitgerechnet.
- $SeitenZahl: errechnet automatisch wieviele Seiten es gibt. Dies geschieht indem das Resultat von der Teilung "Anzahl der Datenbankeinträge" geteilt durch "Anzahl der Treffer die pro Seite gezeigt werden" nach oben abzurunden.
- $NumerischeLinks: errechnet die Zahl der Links die links und rechts von der aktuellen Seite stehen (z.B. wenn der Besucher auf Seite 5 sich befindet, stehen links die Links für die Seiten 2, 3 und 4 und rechts davon die Links für die Seiten 6, 7 und 8). Die Zahl wird wie folgt berechnet: "die Zahl der Navigationslinks die gezeigt werden sollen minus 1 und danach geteilt durch 2".
- $url: die Links verweisen immer zur selben URL */
$sql .= " limit ". ($Seite * $ProSeite - $ProSeite) .", ".$ProSeite;
$result = mysql_query($sql);
mysql_close($db);
/* Hier wird das limit-Statement am Query hinzugefügt und somit werden dann die zu zeigende Datensätze aus der Datenbank geholt, wonach die Verbindung zur Datenbank geschlossen werden kann. Das limit-Statement braucht zwei Parameter: der Startindex (wobei von null angefangen wird zu zählen) und die Anzahl der Datensätze die geholt werden müssen. Der erste Parameter ergibt sich aus folgender Berechnung: $Seite mal $ProSeite minus $ProSeite (Beispiel um zweiter Satz von 15 Datensätze zu sehen: 2 * 15 - 15 = 15. */
$AuslassungszeichenVorn = '';
$AuslassungszeichenHinten = '';
$AnfangLink = '';
$EndeLink = '';
$ZurueckLink = '';
$WeiterLink = '';
$SichtbareLinks = '';
/* Hier werden die Variablen für die einzelne Links deklariert. Sie werden erst nachher einen Wert bekommen um dann am Ende auf dem Bildschirm gezeigt zu werden. Wenn ein Link nicht vorkommen soll (z.B. der "Ende-Link" wenn der Besucher auf der letzten Seite ist), dann wird diese Variable leer gelassen und wird der Link nicht gezeigt. */
if ($SeitenZahl > 1)
{
  $Nr = $Seite - $NumerischeLinks;
  $Anzeige = 0;

  while ($Nr <= $SeitenZahl)
  {
     if ($Nr < 1) {$Nr++; continue;}
     elseif ($Nr > $Seite + $NumerischeLinks) {break;}
     if ($Nr == $Seite) {$SichtbareLinks .= " $Nr";}
     else {$SichtbareLinks .= ' <a href="'.$url.'?Seite='.$Nr.'&Total='.$Total.'">'.$Nr.'</a>';}
     $Nr++;
     $Anzeige++;
  }
}
/* Dieser Code sorgt dafür, dass die numerischen Links hinzugefügt werden. Das ist nur notwendig wenn es mehr als eine Seite gibt. Der Code fängt an mit der Initialisierung von zwei Variablen. $Nr ist gleich $Seite minus $NumerischeLinks. Diese Variable wird dazu verwendet die Schleife, die die einzelne Links generiert, nur so oft durchlaufen zu lassen wie nötig. Die Variable $Anzeige wird verwendet um später noch nachgehen zu können wieviele Links auf dem Bildschirm gezeigt werden.

Die Schleife wird so oft wiederholt bis $Nr größer ist als $SeitenZahl (in der Praxis wird die Schleife schon früher beendet). Wenn $Nr kleiner ist als 1, dann wird $Nr um eins erhöht und fängt die Schleife mit dem nächsten Durchlauf an. Wenn $Nr größer ist als $Seite plus $NumerischeLinks (z.B. 9 ist größer als 5 + 3), dann müssen keine weiteren Links mehr generiert werden und wird die Schleife abgebrochen.
Jetzt muss man die Links generieren. Dabei ist es unsinnig den Besucher einen Link zu zeigen der zur Seite führt auf dem er sich befindet. Wenn ein Besucher sich z.B.auf Seite 4 befindet, währe es sinnlos ihm einen zu dieser Seite anzubieten. Deshalb wird das Script einen Unterscheid machen: wenn $Nr gleich $Seite ist, dann wird kein Link ausgegeben, sondern einfach die Seitennummer. Ansonsten wird ein Link generiert der die Variablen $Nr und $Total an der aktuellen Adresse ($url) hängt. */
if ($Seite > 1)
{
  $AnfangLink = ' <a href="'.$url.'?Seite=1&Total='.$Total.'">Anfang</a>';
  if ($Seite - 1 > 1)
  {
    $ZurueckLink = ' <a href="'.$url.'?Seite='.($Seite-1).'&Total='.$Total.'">Zurück</a>';
  }
}
/* In diesem Abschnitt werden die Links "Anfang" und "zurück" hinzugefügt. Dies soll nur so sein wenn $Seite größer ist als 1. Der Anfang-Link wird dann automatisch hinzugefügt. Der zurück-Link wird nur hinzugefügt wenn $Seite minus eins auch größer ist als 1 (dies ist der Fall wenn der Besucher sich auf Seite 2 befindet, wobei ein zurück-Link in Kombination mit einem Anfang-Link überflüssig ist).
Beachten Sie, dass im obigen Code vor jedem Link noch steht. Dies erzeugt eine Leerstelle mit n-Breite (der Breite des Buchstaben 'n'). Somit "kleben" die Links nachher nicht aneinander. Der Unterschied mit liegt darin, dass die einzelnen Links nicht auf einer Linie gezwungen werden wenn unzureichend Platz da ist. Natürlich können Sie das nach Belieben ändern. */
if ($Seite < $SeitenZahl)
{
  $EndeLink = ' <a href="'.$url.'?Seite='.$SeitenZahl.'&Total='.$Total.'">Ende</a>';
  if ($Seite + 1 < $SeitenZahl)
  {
    $WeiterLink = ' <a href="'.$url.'?Seite='.($Seite+1).'&Total='.$Total.'">Weiter</a>';
  }
} 
/* Genau wie Anfang- und zurück-Links gibt es auch die weiter- und Ende-Links. Diese werden nach dem gleichen Prinzip hinzugefügt: wenn $Seite kleiner ist als $SeitenZahl, dann befindet der Besucher sich nicht auf der letzten Seite. Der Ende-Link wird dann automatisch hinzugefügt. Der weiter-Link wird nur hinzugefügt wenn $Seite plus eins kleiner ist als $SeitenZahl, dann befindet der Besucher sich noch nicht auf der vorletzten Seite und wird der weiter-Link auch hinzugefügt. */
if ($Seite - $NumerischeLinks > 1)
{
  $AuslassungszeichenVorn = ' ...';
}
if ($Seite + $NumerischeLinks < $SeitenZahl)
{
  $AuslassungszeichenHinten = ' ...';
}
/* Jetzt werden noch die Variablen für die Auslassungszeichen (...) initialisiert. Diese werden dazu verwendet um die numerischen Angaben der Seiten zu trennen von die "zurück-" und "weiter-links". Diese dürfen nur verwendet werden wenn es mehr Seiten gibt als Links zur Anzeige davon.

Die Berechnung erfolgt so:
- für das Auslassungszeichen links (Beispiel: '... 3 4 5 6 7'): wenn $Seite minus $NumerischeLinks größer ist als 1, dann gibt es mindestens einen Link an der linken Seite der nicht sichtbar ist, und muss also das Auslassungszeichen links sichtbar sein.
- für das Auslassungszeichen rechts (Beispiel: '3 4 5 6 7 ...'): wenn $Seite plus $NumerischeLinks kleiner ist als $SeitenZahl, dann gibt es mindestens einen Link an der rechten Seite der nicht sichtbar ist, und muss also das Auslassungszeichen rechts sichtbar sein. */
$Nav = $AnfangLink;
$Nav .= $ZurueckLink;
$Nav .= $AuslassungszeichenVorn;
$Nav .= $SichtbareLinks;
$Nav .= $AuslassungszeichenHinten;
$Nav .= $WeiterLink;
$Nav .= $EndeLink;
print $Nav;
/* Hier werden die einzelne Links (wovon die HTML-Codes in verschiedene Variablen gespeichert sind) zusammen gesetzt in der Variable $Nav. Dieser wird dann auf dem Bildschirm gezeigt. Dieses Stück Code können Sie an beliebiger Stelle auf Ihrer Seite stellen, jedoch muss es unter dem anderen PHP-Code stehen. */
if ($SeitenZahl > $Anzeige)
{
  print "<br />Seiten: $SeitenZahl <br />Gehe zu Seite <br />";

  echo '
  <form action="'.$url.'" method="post">
  <input type="text" size="3" name="Seite"></input> 
  <input type="submit" value="Los"></input>
  <input type="hidden" name="Total" value="'.$Total.'"></input>
  </form>
  ';
}
/* Zum Schluss soll noch das Formular hinzugefügt werden, so dass der Besucher eine beliebige Seite besuchen kann. Hierzu muss er dann einfach nur eine Zahl angeben. Natürlich hat dies nur Sinn wenn es mehr Seiten gibt als es Navigationslinks gibt. Die Zahl der Navigationslinks wurde vorher schon gespeichert in der Variablen $Anzeige. Wenn $SeitenZahl größer ist als $Anzeige, dann soll das Formular hinzugefügt werden. Das Formular hat einem Submit-Button, ein Textfeld für die Variable Seite und ein verstecktes Feld für die Variable Total. Natürlich werden auch hier die Daten an der selben URL geschickt.*/
?>
Ergänzung

Es ist möglich, dass Sie mehrere Variablen brauchen die im Script nicht automatisch angehängt werden. Das können Sie wie folgt lösen:
<?php
$vars = '';

foreach ($_REQUEST as $Name = $Wert)
{
if ($Name == 'Seite' || 'Total') continue;
$vars .= "&$Name=$Wert";
}
?>>
Dieses Script setzt alle REQUEST-Variablen in einer Schleife. Wenn der Name der Variable "Seite" oder "Total" ist, springt das Script weiter zum nächsten Schleifendurchlauf. Ansonsten wird ein Variable an der Variable $Vars hinzugefügt im folgendem Format: "&Variablenname=Variablenwert". Diese Variable muss dann immer an der URL angehängt werden. Dies müssen Sie dann überall im Script ändern wo ein Link zusammengestellt wird.

Sie können dies auch mit dem Formular machen:
<?php
foreach ($_REQUEST as $Name = $Wert)
{
if ($Name == 'Seite' || 'Total') continue;
print "<input type=\"hidden\" name=\"$Name\" value=\"$Wert\">";
}
?>
Alternativ können Sie auch Sessions verwenden, wobei die Variablen zeitlich beim Server gespeichert werden.


loopnlucid
Rookie
Beitrag vom:
07-04-2009, 11:47:41

Lange Listen seitenweise blättern

Ich hab eine einfache Funktion zum blättern langer Listen geschrieben. Die Funktion ist einfach zu implementieren und kann über css formatiert werden.

hier findet ihr den download und eine anleitung wie's funktioniert!

http://blog.polymorph.at/105/finished-scripts/prev-next-1-2-3-page-link-php-function

lg,
Ingo

-----------------------------------------------------


_-DarkPhoeniX-_
Rookie
Beitrag vom:
25-08-2006, 21:48:17

Schon ein interessantes Script nur funktioniert es bei mir nicht so wie es soll...


-----------------------------------------------------
kommt noch.^-^°


Goergi
Developer
Beitrag vom:
14-07-2005, 18:34:31

tipp:
wenn du abfragen machst, bei denen du nur die gesamtanzahl wissen willst, dann solltest du nicht mysql_num_rows machen sondern
"SELECT COUNT(*) AS anzahl FROM Waren"
das geht dann ein paar millisekunden schneller ;-)

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04503
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16551
Queueeinträge:06236
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1137
Comments: 0