Flitze
|
Administrator
|
|
registriert
|
17.10.2006
|
wohnt in
|
Eschwege
|
Beiträge
|
332
|
|
Also, das ganze beruht auf der LIMIT-Expression in der Datenbankabfrage. Dieser Ausdruck gibt an, ab wo und wie viele Datensätze aus der Datenbank ausgelesen werden. Sinnvoll ist es in diesem Zusammenhang auch, die Datensätze vorher zu sortieren.
So, nehmen wir mal an, du willst die letzten 10 Nachrichten aus der Tabelle auslesen, dann sieht das so aus:
PHP:
<?php
$sql = "SELECT
Nachricht
FROM
Tabelle
ORDER BY
Datum DESC
LIMIT
0,10
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
while($row = mysql_fetch_assoc($result)) {
// Daten anzeigen
}
?>
Der Query sortiert jetzt alle Nachrichten nach dem Datum (älteste zuerst) und gibt nur den 0.,1.,2.,3.,...,9. Datensatz aus, also insgesamt 10 Stück, angefangen bei 0. Damit kann man zwar noch nicht blättern, aber der "Grundstein" ist gelegt.
Um das ganze etwas "variable" zu gestalten, lege ich anstatt der 0 eine Variable an. Da sich die Variable später je nachdem, welche Seite der Benutzer sehen will, ändern muss, muss es entweder eine $_GET oder eine $_POST Variable sein. Für $_POST bräuchte ich ein Formular, das ist mir aber zu aufwendig und deshalb entscheide ich mich für das $_GET. Die Daten werden also über die URL übergeben, aber dazu später mehr. Ich nenne die Variable einfach mal $_GET['seite'].
Der Query sieht dann folgendermaßen aus:
PHP:
<?php
$sql = "SELECT
Nachricht
FROM
Tabelle
ORDER BY
Datum DESC
LIMIT
".$_GET['seite'].",10
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
while($row = mysql_fetch_assoc($result)) {
// Daten anzeigen
}
?>
Das reicht aber noch nicht ganz, denn wenn du das Skript jetzt mit datei.php?seite=2 (datei.php musst du eben durch den Dateinamen ersetzen), aufrufst, dann steht folgendes in dem Query:
PHP:
<?php
$sql = "SELECT
Nachricht
FROM
Tabelle
ORDER BY
Datum DESC
LIMIT
2,10
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
while($row = mysql_fetch_assoc($result)) {
// Daten anzeigen
}
?>
Eigentlich wollten wir ja die nächsten 10 Nachrichten ausgeben lassen, also die 10., 11., 12., ... , 19. aber stattdessen bekommen wir die 2., 3., 4., ..., 12. ! Deshalb müssen wir dem Skript noch sagen, wo es denn auf der 2. Seite anfangen soll zu zählen. Ich erinnere, wie wollen den 10., 11., 12., ... , 19. Datensatz auslesen, also müssen wir bei 10 anfangen. Wie kommen wir jetzt aber von seite=2 auf 10?
Nun, indem man einfach -1 und *10 rechnet: (2-1)*10 = 10. Also fügen wir das noch unserem Query hinzu:
PHP:
<?php
$seite = ($_GET['seite']-1)*10;
$sql = "SELECT
Nachricht
FROM
Tabelle
ORDER BY
Datum DESC
LIMIT
".$seite.",10
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
while($row = mysql_fetch_assoc($result)) {
// Daten anzeigen
}
?>
So, in $seite steht jetzt unser gewünschter "offset", also der Startpunkt des auslesens.
Kurze Kontrolle mir ?seite=2:
PHP:
<?php
$seite = (2-1)*10;
// $seite = 10;
$sql = "SELECT
Nachricht
FROM
Tabelle
ORDER BY
Datum DESC
LIMIT
10,10
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
while($row = mysql_fetch_assoc($result)) {
// Daten anzeigen
}
?>
Datensätze 10., 11., 12., ... , 19. werden ausgelesen.
So, nun haben wir schonmal den "richtigen" Algorhytmus für die Seitenzahlen gefunden. Nun wäre es aber blöd, wenn der User immer selbst: ?seite=1, ?seite=2, ... eingeben müsste, also erzeugen wir ein paar Links, die das Ganze angenehmer machen, Seitenzahlen eben .
Dazu muss aber zunächst einmal ausgerechnet werdern, wie viele Seiten als Seitenzahlen überhaupt angezeigt werden sollen und dazu muss man wiederum wissen, wie viele Datensätze sich insgesamt in der Datenbank befinden. Dazu benutzt man einfach COUNT(*). Dann muss man das Ergebnis noch durch 10 teilen, weil ja pro Seite 10 Nachrichten angezeigt werden sollen. Bei 25 Nachrichten würde das bedeuten 25/10 = 2.5 Seiten. Da es natürlich keine halben Seiten gibt, müssen wir auf 3 Seiten aufrunden, weil die restlichen 5 Nachrichten ja auch noch angezeigt werden sollen. Das Ganze sieht dann so aus:
PHP:
<?php
$sql = "SELECT
COUNT(*)
FROM
Tabelle
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$anzahl = mysql_result($result, 0);
$seiten_gesamt = ceil($anzahl/10); // Seiten ausrechnen und aufrunden
?>
So, jetzt wo wir wissen, dass es 3 Seiten sind, erzeugen wir auch die 3 Seitenzahlen. Ich erinnere nochmal: Die Seite, die angezeigt werden soll, ergibt sich aus dem $_GET Parameter, so dass nur ein entsprechender Link erzeugt werden muss. Für 3 Seiten würde das bedeuten:
<a href="datei.php?seite=1">1</a>
<a href="datei.php?seite=2">2</a>
<a href="datei.php?seite=3">3</a>
Da wir das natürlich nich von Hand aus eintragen können, weil sich die Anzahl der Nachrichten ja immer weiter erhöht, muss das mit einer Schleife gemacht werden. Das sieht dann so aus:
PHP:
<?php
$sql = "SELECT
COUNT(*)
FROM
Tabelle
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$anzahl = mysql_result($result, 0);
$seiten_gesamt = ceil($anzahl/10); // Seiten ausrechnen und aufrunden
for($i=1; $i<=$anzahl; $i++)
echo "<a href=\"datei.php?seite=".$i."\">$i</a> \n";
?>
Damit wäre die Blätterfunktion eigentlich fertig und funktionstüchtig, aber jetzt müssen noch ein paar Sonderfälle betrachtet werden und zwar:
1. Das Skript wird ohne Parameterübergabe aufgerufen (kein ?seite=1 )
2. Das Skript wird mit einer Paramterübergabe aufgerufen, die kleiner als 1 oder größer als die höchste Seitenzahl ist (im Beispiel oben wären das z.B. ?seite=0 und ?seite=4)
3. Das Skript wird nicht mir einer Zahl, sondern mit einem Buchstaben oder so aufgerufen.
Das alles ist möglich, weil der User die URL ja manipulieren kann, wie er will.
Das Skript muss jetzt also noch um folgendes ergänzt werden:
PHP:
<?php
// zu 1. Prüfen, ob ?seite=.. übergeben wurde, falls nein, Seite 1 laden
$_GET['seite']=isset($_GET['seite'])?(int)$_GET['seite']:1;
// zu 3. Durch (int) 'casten' wir $_GET['seite'] auch gleich als Zahl,
// also kann auch ein Buchstabe drin stehn, ohne das was passiert
// zu 2. höchste Seitenzahl ausrechnen
$sql = "SELECT
COUNT(*)
FROM
Tabelle
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$anzahl = mysql_result($result, 0);
$seiten_gesamt = ceil($anzahl/10); // Seiten ausrechnen und aufrunden
// zu 2. Prüfen, ob der übergeben Wert zu groß oder zu klein ist und
// wenn das der Fall ist, den Wert anpassen
if($_GET['seite'] < 1)
$_GET['seite'] = 1;
if($_GET['seite'] > $seiten_gesamt)
$_GET['seite'] = $seiten_gesamt;
?>
So, jetzt haben wir glaube ich alles beachtet. Eventuell sollte man noch abbrechen, wenn sich keine Datensätze in der Datenbank befinden, also wenn $anzahl == 0 ist, aber das kriegste sicher selber hin 
Das komplette, fertige Skript sieht dann so aus:
PHP:
<?php
// 1. Prüfen, ob ?seite=.. übergeben wurde, falls nein, Seite 1 laden
$_GET['seite']=isset($_GET['seite'])?(int)$_GET['seite']:1;
// 3. Durch (int) 'casten' wir $_GET['seite'] auch gleich als Zahl,
// also kann auch ein Buchstabe drin stehn, ohne das was passiert
// 2. höchste Seitenzahl ausrechnen
$sql = "SELECT
COUNT(*)
FROM
Tabelle
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
$anzahl = mysql_result($result, 0);
$seiten_gesamt = ceil($anzahl/10); // Seiten ausrechnen und aufrunden
// 2. Prüfen, ob der übergeben Wert zu groß oder zu klein ist und
// wenn das der Fall ist, den Wert anpassen
if($_GET['seite'] < 1)
$_GET['seite'] = 1;
if($_GET['seite'] > $seiten_gesamt)
$_GET['seite'] = $seiten_gesamt;
// Seitenzahlen anzeigen
for($i=1; $i<=$anzahl; $i++)
echo "<a href=\"datei.php?seite=".$i."\">$i</a> \n";
// Starpunkt für das Auslesen berechnen
$seite = ($_GET['seite']-1)*10;
// Datensätze auslesen
$sql = "SELECT
Nachricht
FROM
Tabelle
ORDER BY
Datum DESC
LIMIT
".$seite.",10
";
$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
while($row = mysql_fetch_assoc($result)) {
// Daten anzeigen
}
?>
Soo.. können Syntaxfehler drin sein, ist nicht getestet! Aber die Funktionsweise sollte klar sein 
Gruß Flitze
Dieser Beitrag wurde am 27.01.2007 um 00:01:13 Uhr von Flitze zum 5. Mal editiert.
|