de.comp.lang.php.* FAQ

17.10. Ich habe eine Tabelle mit n Einträgen und möchte auf jeder Seite m davon anzeigen

Keywords: SQL | Datenbank | MySQL | blaettern | vor | zurueck | limit

Antwort von Kristian Köhntopp

In MySQL kann man zu diesem Zweck die LIMIT-Direktive verwenden, die m Einträge ab Position s einer geordneten Tabelle anzeigt. In anderen Datenbanken muss man sich eine Zeilennummer definieren und kann dann einen Teil der Tabelle mittels einer BETWEEN-Clause auswählen.

# MySQL
mysql> SELECT * FROM tabelle LIMIT s,m;

Es ist nicht effizient, alle n Datensätze der Tabelle zu selektieren und dann alle Datensätze vor Position s zu überlesen.

Antwort von Daniel T. Gorski

Mit Hilfe eines solchen SQL-Statements kann man sich dann leicht eine Funktion schreiben, die den entsprechenden Ausschnitt der Tabelle anzeigt und Links zum vorhergehenden und folgenden Tabellenausschnitt enthält. Im Folgenden möchten wir hier diese einfache "Blättern"-Funktion realisieren, die uns erlaubt, über die Ergebnisse einer Datenbank-Query vor- und zurück zu browsen.

Es wird davon ausgegangen, dass eine einfache MySQL-Datenbank (deren Name über die Variable $database definiert wird) vorhanden ist. Diese enthält die von uns benötigte Tabelle (Variable $table), über die wir "blättern" wollen.

CREATE DATABASE nameDerDatenbank;
USE nameDerDatenbank;
CREATE TABLE nameDerTabelle (ID int(10) unsigned NOT NULL,
                             INHALT text NOT NULL);

Diese Datenbankstruktur kann z.B. mit phpMyAdmin, einem anderem PHP-Script oder direkt mit dem MySQL-Monitor erstellt werden. Um Ausgabeergebnisse zu erhalten, muss die Tabelle selbstverständlich zuerst mit Inhalt gefüllt werden - an dieser Stelle gehen wir davon aus, dass die Tabelle mehrere Einträge enthält.

<?php
// Daniel T. Gorski  dtg/240900/18:49/01
// Achtung: die Definition der $user- und $passwort-Variablen
// _sollte_ in einer externen Datei außerhalb des Document-Root
// festgelegt werden. Diese Datei muss dann an dieser Stelle
// [mit include() oder require()] importiert werden.
// Mehr dazu in dieser dclp-FAQ unter: "Wie kann ich mein
// Datenbankpasswort gegen Spionage sichern?"

// Datendefinition für Datenbankverbindung.
$host     = "localhost";  // MySQL - Zielrechner.
                          // Normallerweise ist es "localhost", bzw.
                          // synonym "127.0.0.1", also der Rechner,
                          // auf dem auch _dieses_ Script läuft.
$user     = "deinLogin";         // Dein Userlogin.
$password = "deinPasswort";      // Dein Datenbankpasswort.

$database = "nameDerDatenbank";  // Gewünschte Datenbank
                                 // innerhalb von MySQL
$table    = "nameDerTabelle";    // Der Name der Datenbanktabelle

// Datendefinition für die Clientausgabe
$start = (isset($start)) ? abs((int)$start) : 0;
$limit = 10;                     // Datensätze pro Ausgabeseite

// Verbindung zu MySQL-Datenbank herstellen oder sterben.
@mysql_connect($host,$user,$password)
   or die("Abbruch: Verbindung zu '$host'"
         ." konnte nicht hergestellt werden.");

// Benötigte Datenbank auswählen oder sterben.
@mysql_select_db($database)
   or die("Abbruch: Datenbank '$database' konnte nicht"
         ." selektiert werden.<br><br>MySQL sagt: ".mysql_error());

// Feststellen der Anzahl der verfügbaren Datensätze.
$resultID = @mysql_query("SELECT COUNT(ID) FROM ".$table);
$total    = @mysql_result($resultID,0);

// Ggf. $start korrigieren (falls Parameter in
// der URL manipuliert wurde)
$start    = ($start >= $total) ? $total - $limit : $start;

// Datenbankabfrage ausführen.
$query    = "SELECT ID,INHALT FROM ".$table
           ." LIMIT ".$start.",".$limit;
$resultID = @mysql_query($query);

// Ergebnisse lesen und an den Client ausgeben
while ($data = mysql_fetch_array($resultID))
{
  echo $data["ID"].": ".$data["INHALT"]."<br>";
}

// Zurück- und Vorblättern
if ($start > 0)
{
  $newStart = ($start - $limit < 0) ? 0 : ($start-$limit);
  echo "<a href=".$_SERVER['PHP_SELF']."?start=".$newStart
      .">&lt;&lt; zurück</a>";
}

if ($start + $limit < $total)
{
  $newStart = $start + $limit;
  echo " <a href=".$_SERVER['PHP_SELF']."?start=".$newStart
      .">vor &gt;&gt;</a>";
}

// Die benutzte (nichtpersistente) Verbindung zu der MySQL-Datenbank,
// wird nach dem Script-Ende automatisch geschlossen.
// That's it.
?>

Antwort von Frank Wiegand

Arbeitet man mit dem DB-Abstraktionslayer aus dem PEAR, kann man komfortabel die Pakete DB_Pager und Pager_Sliding einsetzen.

Valid HTML 4.01! Valid CSS!

17.10. Ich habe eine Tabelle mit n Einträgen und möchte auf jeder Seite m davon anzeigen
http://www.php-faq.de/q/q-mysql-seitenweise.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team