Moin!
Was aber macht man am hinteren Ende, damit man nicht über's Ziel hinausschießt. Es gibt ja den bekannten Trick, einfach einen Satz mehr abzufragen (also $limit + 1) und wenn der nicht mehr da ist, kein "Vorwärts" mehr anzubieten. Aber das ist mir mal wieder zu unsicher in dynamischen Datenbeständen. Es könnten ja seit dem letzten am hinteren Anschlag Angekommen sein Datensätze hinzugekommen sein (durch andere User).
Ja, und? Du hast bei dynamischen Datenbanken _immer_ das Problem, dass die generierte und im Browser angezeigte Sicht eben nur dem Stand zum Zeitpunkt der Abfrage entspricht, und spätere Änderungen in der Datenbank nicht auf magische Weise zum Browser gelangen.
Wenn man am hinteren Ende nicht mehr weiterblättern kann, und neue Datensätze hinzukommen, hilft ein Reload, und schon kann man weiterblättern.
Du ignorierst übrigens ja auch das Problem, dass - abgängig von der Sortierung - mittendrin neue Datensätze entstehen könnten, die der Blätterer nicht sieht.
Allerdings: Wenn du tatsächlich 40.000 Bewegungen pro Tag erwartest, dann ist ein "Blättern", wie auch immer es realisiert wird, für die Benutzer nicht zielführend. Es ist schlichtweg unmöglich, in großen Datenbanken zu "blättern" wie in einem Karteikasten. Und auch in einem Karteikasten "blättert" man nicht, um den Gesamtbestand durchzugehen, sondern man sucht gezielt einen oder wenige Datensätze, um sie zu lesen oder zu ändern.
Biete den Benutzern eine sinnvolle, zielführende Abfragemaske für die Datenbank an, damit diese schnell zu ihrem Datensatz kommen. Es ist bei sowas wenig hilfreich, beispielsweise alle dreitausens "Meier" als durchblätterbare Seiten aufzulisten. Das blättert niemand durch, sondern wird im Zweifelsfall den Vornamen, das Geburtsdatum oder den Wohnort zu Hilfe nehmen, um die Suche weiter einzugrenzen. Die Mitgliedsnummer würde natürlich auch helfen. :)
Welches Statement würdet Ihr benutzen um nun vorab nur die Geamtanzahl der dem Filterkriterium (wahrscheilich "where ...") entsprechenden Datensätze herauszufinden. Felder benötigt man ja eigentlich nicht.
Select count(ID)from table where...;
Ist das das performanteste, was man sich denken könnte?
Wenn du zwingend die Gesamtzahl aller Datensätze benötigst, dann ist das das schnellste, was geht.
Allerdings: Auch für diese Gesamtzahl gilt natürlich, dass sie im Moment der Abfrage schon wieder veraltet ist und nachfolgende neue Datensätze nicht anzeigt.
Insofern ist es eben vollkommen egal, ob dein "Weiterblättern"-Button nun aufgrund des fehlenden überzähligen Datensatzes nicht angezeigt wird, oder aufgrund der absolut ermittelten Datensatzzahl. Das Ergebnis ist dasselbe - und bei der einen Methode weiß der Benutzer, was er geleistet hat, wenn er 30.000 Datensätze durchblättert hat und am Ende angekommen ist. ;)
Eine kleine Unsicherheit gibt's dann ja trotzdem noch, weil zwischen dem Zähl-Select und dem gefüllten mit limit auch wieder Zeit vergeht. Aber damit könnte man leben, da das ja erst relevant wird, wenn $offset > $count werden würde.
Wenn du die absolute Zahl an Datensätzen weißt, kannst du eine Seitensprungnavigation anbieten. Diese wäre umso hilfreicher, wenn sie nicht nur die Seiten durchnumerieren würde, sondern (damit man nicht durch Seitenaufruftaktik wie Intervallhalbierung trotzdem noch suchen muß) ein relevantes Kriterium (bei einer Namenssuche beispielsweise ein Namensfragment - genau wie beim Telefonbuch oder beim mehrbändigen Lexikon das "Mei - Mue", "Mue - Nas"...) ausgeben würde.
- Sven Rautenberg
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)