Christian Wermelinger: Nur 10 Datensätze pro Seite anzeigen

Hallo zusammen

Ich entwickle gerade eine Datenbanklösung auf Basis von PHP und MySQL. Nun mache ich unter anderem Abfragen (SELECT) die mir sehr viele Datensätze zurückliefern (ca. 100). Ich möchte bei der Ausgabe auf der Seite nur immer 10 Datensätze anzeigen. D.h zuerst erscheinen die Datensätze 1-10. Der Anwender soll mittels 'Nächste Datensätze' nun die 10 nächsten Datensätze ansehen können (11-20) etc. bzw. bei der Anzeige der Datensätze 11-20 sollen via 'Vorherige Datensätze'-Link die Datensätze 1-10 angezeigt werden. Wie muss ich das in PHP umsetzen bzw wie lautet das SQL-Statement, dass mir von einer Anzahl gefunden Datensätze (z.B. 100) nur die Datensätze 11-20 anzeigt? Vielen Dank für jeden Ratschlag!

Gruss Christian

  1. Moin!

    Wie muss ich das in PHP umsetzen bzw wie lautet das SQL-Statement, dass mir von einer Anzahl gefunden Datensätze (z.B. 100) nur die Datensätze 11-20 anzeigt? Vielen Dank für jeden Ratschlag!

    Das SQL-Statement der Wahl ist ein angehängtes "LIMIT x,y". Damit kannst du angeben, wieviele und ab dem wievielten normalerweise ausgegebenen Element deine SQL-Abfrage Elemente ausgeben soll.

    Folgende Problematiken mußt du dir dabei noch überlegen:

    1. Eine LIMIT-Abfrage erzeugt keinen Schnappschuß, den man mit weiteren Abfragen einfach weiter ausgeben kann, sonder er befragt die Datenbank immer wieder neu. Wenn also zwischendurch neue Datensätze hinzukommen oder gelöscht werden, dann kriegt der Benutzer das nicht zwingend mit.

    Beispiel: Ein Datensatz kommt hinzu. Aufgrund der Ordnung (ORDER BY) ist es der fünfte. Wenn vorher die Datensätze 1-10 schon gezeigt wurden, wird durch den neuen Datensatz die alte Nr. 10 zur neuen Nr. 11 und deshalb auf der Seite "11-20" quasi als Duplikat erneut angezeigt.

    Umgekehrt wird der eigentliche Datensatz Nr. 11 nicht angezeigt, wenn Datensatz Nr. 5 gelöscht wird und alle nachfolgenden Datensätze aufrücken.

    2. Problem: Du wirst den Link "nächste Seite" natürlich nur anzeigen wollen, wenn da auch noch Datensätze folgen. Das ist fast immer kein Problem: Wenn du 10 Datensätze auf die Seite packen willst, die Datenbankabfrage aber nur einen bis neun Sätze liefert, ist deine Seite wohl die letzte. Was aber, wenn noch genau 10 Datensätze in der Datenbank stehen? Die nächste Seite würde dann Null Datensätze anzeigen. Das ist natürlich nicht sonderlich schön. Deshalb: Wenn du 10 Datensätze anzeigen lassen willst, frage 11 Datensätze in der Datenbank ab und gib den letzten einfach nicht mit aus. Wenn es den aber gibt, gibt es einen Grund für die "nächste Seite".

    3. Die Problematik "Vorige Seite" läßt sich relativ leicht erschlagen, indem du guckst, welche Seite gerade angezeigt wird.

    4. Bedenke: Ohne ein ORDER BY wirst du keine vernünftige Liste anzeigen lassen können, weil eine Datenbank grundsätzlich unsortiert arbeitet - möglicherweise auch während zweier Abfragen unterschiedlich "unsortiert" Datensätze ausgibt.

    - Sven Rautenberg

    --
    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
  2. Hi,

    Wie muss ich das in PHP umsetzen bzw wie lautet das SQL-Statement, dass mir von einer Anzahl gefunden Datensätze (z.B. 100) nur die Datensätze 11-20 anzeigt? Vielen Dank für jeden Ratschlag!
    Schau dir mal LIMIT an. Siehe auch http://www.mysql.de/doc/de/index.html. Mit der ersten Zahl hinter Limit gibst du den ersten anzuzeigenden Datensatz mit dem zweiten den letzten. Allerdings solltest du die Datensätze davor sortiert haben, da das ganze sonst Unsinn ist.

    Grüße Andres Freund

    --
    ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|
    1. Moin!

      Schau dir mal LIMIT an. Siehe auch http://www.mysql.de/doc/de/index.html. Mit der ersten Zahl hinter Limit gibst du den ersten anzuzeigenden Datensatz mit dem zweiten den letzten.

      Nein, der zweite Parameter gibt die ANZAHL der auszugebenden Datensätze an. Wenn immer gleichviel Sätze pro Seite ausgegeben werden sollen, bleibt diese Zahl immer konstant.

      - Sven Rautenberg

      --
      ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
      1. Hi,

        Nein, der zweite Parameter gibt die ANZAHL der auszugebenden Datensätze an. Wenn immer gleichviel Sätze pro Seite ausgegeben werden sollen, bleibt diese Zahl immer konstant.

        Arg. Sorry, dass passiert, wenn man schneller schreibt als man denkt. Wie blöde kann man eigentlich sein? (Rhetorische Frage! ;-)).

        Grüße *ein sich an den Kopf langender* Andres Freund

        --
        ss:) zu:) ls:} fo:) de:] va:) ch:| n4:& rl:° br:^ js:( ie:% fl:( mo:|