hotti: Paging mit Limit-Klause

hi,

nach langer Zeit habe ich mal wieder einen Pager zu bauen, die DB ist MySQL  5.1.40-community. Der Pager ermöglicht das "Blättern" durch eine Tabelle und soll am Frontend (Browser) nur die Seitennummer zeigen. Dazu will ich die Anzahl der Seiten anhand count('spalte_wo_immer_was_drinsteht') ermitteln, durch meine Vorgabe (z.B. 20 Records/Page) ganzzahlig teilen, was dann ggf. zu einem zweiten Limit-Wert führt, der größer ist als die Anzahl der Records im Set. Mein erster Test auf der Konsole wirft zwar keinen Fehler, aber ich möchte sicher gehen, dass da nicht irgendwo (andere Umgebung, andere myVersion) ein error_log geschrieben wird.

Frage also: Aufrunden oder den Rest exakt bestimmen für die Limit-Klause?

Hotti

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. nach langer Zeit habe ich mal wieder einen Pager zu bauen, die DB ist MySQL  5.1.40-community. Der Pager ermöglicht das "Blättern" durch eine Tabelle und soll am Frontend (Browser) nur die Seitennummer zeigen. Dazu will ich die Anzahl der Seiten anhand count('spalte_wo_immer_was_drinsteht') ermitteln, durch meine Vorgabe (z.B. 20 Records/Page) ganzzahlig teilen, was dann ggf. zu einem zweiten Limit-Wert führt, der größer ist als die Anzahl der Records im Set. Mein erster Test auf der Konsole wirft zwar keinen Fehler, aber ich möchte sicher gehen, dass da nicht irgendwo (andere Umgebung, andere myVersion) ein error_log geschrieben wird.

    Frage also: Aufrunden oder den Rest exakt bestimmen für die Limit-Klause?

    Aufrunden auf ganze Seitenzahlen.

    Ich hab' grade zufällig gestern einen auf die schnelle in PHP gebaut - die Grundsammlung der Informationen sieht so aus:

    function pagination($page, $total, $perpage = 10, $mode = NULL) {  
    		$config = array();  
    		$config['page']     = intval($page);  
    		$config['total']    = intval($total);  
    		$config['perpage']  = intval($perpage);  
    		$config['lastpage'] = ceil($config['total']/$config['perpage']);  
    		  
    		if($config['page'] == 0) {  
    			$config['page'] = 1;  
    		}  
    		if($config['page'] > $config['lastpage']) {  
    			$config['page'] = $config['lastpage'];  
    		}  
    		  
    		if ($mode == 'limit') {  
    			return ($config['page']-1)*$config['perpage'] . ',' . $config['perpage'];  
    		}  
    		// rest der die eigentliche Seitennavigation erstellt  
    }
    

    Funktioniert einwandfrei.

    Der Code bzw. die Logik basiert prinzipiell auf dem hier von Malcolm Beck´s.

    1. hi,

      Frage also: Aufrunden oder den Rest exakt bestimmen für die Limit-Klause?

      Aufrunden auf ganze Seitenzahlen.

      OK, danke ;)

      Ich hab' grade zufällig gestern einen auf die schnelle in PHP gebaut - die Grundsammlung der Informationen [sieht so aus...]:

      Für PHP sieht das wirklich gut aus *g. Ich werde das natürlich in Perl machen, da werden die Parameter (page=1 oder page=2...) an das DB-Objekt gebunden und alles Weitere wird in einer privaten Method (Erster Abschnitt im Artikel) ablaufen. Das wird ein Code, der auch schön aussieht ;)

      Funktioniert einwandfrei.

      Das ist unser aller Ziel.

      Der Code bzw. die Logik basiert prinzipiell auf dem hier von Malcolm Beck´s.

      Schönes Design, hab schon gesehen. Bei mir solls eine Liste auf der rechten Seite werden, möglichst als Tab formatiert, also ich habe da noch Einiges in Sachen CSS nachzuholen...

      Viele Grüße,
      Horst Kleinholtz

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
      1. Für PHP sieht das wirklich gut aus *g.

        Eigentlich nicht ;) das geht sicher noch schöner und besser.

        Ich werde das natürlich in Perl machen, da werden die Parameter (page=1 oder page=2...) an das DB-Objekt gebunden und alles Weitere wird in einer privaten Method (Erster Abschnitt im Artikel) ablaufen. Das wird ein Code, der auch schön aussieht ;)

        page=1 würde ich nicht verwenden

        example.com/foo
        example.com/foo?page=2
        example.com/foo?page=3

        aber auf keinen fall
        example.com/foo?page=1

        ansonsten bekommst du zwei URLs für dieselbe Ressouce - also wenn Link zu Seite eins, dann entferne den Parameter.

        Funktioniert einwandfrei.

        Das ist unser aller Ziel.

        Sag' das einem dem entwickler einers Selbstzerstörungsmechanismus:

        A: Und, ist es zerstört?
        B: Nein, funktioniert einwandfrei!
        A: FFFFUUUUU!

        1. hi,

          ansonsten bekommst du zwei URLs für dieselbe Ressouce - also wenn Link zu Seite eins, dann entferne den Parameter.

          Die Parameter sind erst heute abend dran, aber danke für den Tipp ;)

          (es wird ohnehin mehr als einen Parameter geben, das Script macht noch andere schöne Dinge)

          Schöne Grüße an Alle,
          danke auch @dedlfix (Link zur Doku),

          Hotti

        2. Guten Abend,

          Für PHP sieht das wirklich gut aus *g.

          Eigentlich nicht ;) das geht sicher noch schöner und besser.

          Naja, ich bin grad eben mit meinem Perl-Zeugs damit fertig geworden....

          aber auf keinen fall
          example.com/foo?page=1
          ansonsten bekommst du zwei URLs für dieselbe Ressouce - also wenn Link zu Seite eins, dann entferne den Parameter.

          ... und habe es geschafft, es doch mit _einem_ Parameter hinzukriegen, Ehrensache ;)

          Der Parameter heißt so, wie die Teilaufgabe im Script: 'refurl=1', 'refurl=2' usw., wobei 1, 2 ... gleich die Seitenzahl ist, die übergebe ich der Darstellungsfunktion. Darin wir die Seitenzahl an das DB_Objekt als $dbo->{PGE} gehängt und damit die Methode zur Abfrage aufgerufen. Die baut aus der Seitennummer die Limit-Klause, gibt eine Referenz auf das Array zurück und schreibt in $dbo->{PGS} die Anzahl der möglichen Seiten insgesamt, womit in der Darstellungsfunktion die Liste zum Blättern erstellt werden kann.

          Schluss für Heute, in 10 Min ist Talkshow auf die ich mich schon die ganze Woche feue.

          Hotti

  2. Hi!

    Dazu will ich die Anzahl der Seiten anhand count('spalte_wo_immer_was_drinsteht') ermitteln, durch meine Vorgabe (z.B. 20 Records/Page) ganzzahlig teilen, was dann ggf. zu einem zweiten Limit-Wert führt, der größer ist als die Anzahl der Records im Set. Mein erster Test auf der Konsole wirft zwar keinen Fehler, aber ich möchte sicher gehen, dass da nicht irgendwo (andere Umgebung, andere myVersion) ein error_log geschrieben wird.

    Was bedeutet andere Umgebung? Selbst für eine zukünftige andere MySQL-Version kann man keine Garantie geben, aber diesbezüglich (s.u.) wird sich vermutlich nichts ändern.

    Frage also: Aufrunden oder den Rest exakt bestimmen für die Limit-Klause?

    Das ist der LIMIT-Klausel egal. Es gibt im Handbuch zu SELECT eine Empfehlung, den rowcount-Parameter auf einen utopisch hohen Wert zu setzen, wenn man ab einer bestimmten Position an den Rest haben will. Man muss also nicht vorher zählen.

    Ich würde noch nicht einmal das das Offset prüfen und es einfach aus der übertragenen Seitennummer mal Datensätze pro Seite berechnen und das Limit fest auf Datensätze pro Seite stellen. Wenn dabei versucht wird, in einem nicht vorhandenen Bereich abzufragen, gibts nur ein leeres Ergebnis, nichts weiter.

    Lo!

    1. Ich würde noch nicht einmal das das Offset prüfen und es einfach aus der übertragenen Seitennummer mal Datensätze pro Seite berechnen und das Limit fest auf Datensätze pro Seite stellen. Wenn dabei versucht wird, in einem nicht vorhandenen Bereich abzufragen, gibts nur ein leeres Ergebnis, nichts weiter.

      Die aktuelle Seitennummer mit der Anzahl pro Seite muliplizieren liefert dir aber falsche Ergebnisse - von der aktuellen Seitenzahl musst du vorher 1 abziehen.

      Und rede dich jetzt nicht damit raus, dass man bei 0 zu zählen beginnt :)

      1. Hi,

        Ich würde noch nicht einmal das das Offset prüfen und es einfach aus der übertragenen Seitennummer mal Datensätze pro Seite berechnen

        Die aktuelle Seitennummer mit der Anzahl pro Seite muliplizieren liefert dir aber falsche Ergebnisse

        Es war ja auch keine Rede davon, genau diese Berechnung auszuführen.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      2. moin,

        Ich würde noch nicht einmal das das Offset prüfen und es einfach aus der übertragenen Seitennummer mal Datensätze pro Seite berechnen und das Limit fest auf Datensätze pro Seite stellen. Wenn dabei versucht wird, in einem nicht vorhandenen Bereich abzufragen, gibts nur ein leeres Ergebnis, nichts weiter.

        Geht einwandfrei dedlfix, danke!

        Die aktuelle Seitennummer mit der Anzahl pro Seite muliplizieren liefert dir aber falsche Ergebnisse - von der aktuellen Seitenzahl musst du vorher 1 abziehen.

        Oder einfach so rechnen:

          
        my $limit = ($self->{PGE} * $rpp) - $rpp;  
        # {PGE} ist die Seitennummer  
        # $rpp Anzahl der Records per Page, Offset  
        
        

        Das gibt 0 bei Seite 1 ;)

        Hotti