Gregor: Nach 5 Einträgen neue Seite

Hi,

Ich hab ma ne Frage.

Wenn ich mit

  
 $ergebnis = mysql_query($abfrage);  
 $menge = mysql_num_rows($ergebnis);  
 echo($menge);  

die Anzahl meiner Einträge rausbekomme, wie muss ich dann die if-Abfragen stellen, die die MySQl Auslesungen beinflussen?

Ich hatte mir es jetzt so gedacht: Zuerst fragt der mit if ab ob es mehr als 5 einträge sind.
Dann werden Links generiert
<< Vorherige Seite Nächste Seite >>
Diese Links haben im href sowas wie ?page=1 oder so stehen.
Doch wie weiß ich jetzt, wann nur noch
Nächste Seite >>
oder halt
<< Vorherige Seite steht.

Und außerdem muss ich ja für jede ?page bestimmen welche Mysql Einträge ausgelesen werden...

Vielen Dank

Gregor

  1. Hallo Gregor!

    Zunächst: Ich habe keine Ahnung von Datenbanken. Dein Anliegen sieht aber aus, wie die Präsentation eines Gästebuchs oder sowas in der Art. Dabei möchtest Du 5 Einträge pro Seite präsentieren, sehe ich das richtig?

    Ich hatte mir es jetzt so gedacht: Zuerst fragt der mit if ab ob es mehr als 5 einträge sind.

    Du hast bereits ermittelt, wie vie viele Einträge es insgesamt gibt. Jetzt musst Du die Anzahl der Seiten ermitteln.

    Anzahl der Eintrage / 5 = Anzahl Seiten

    Aber halt... was ist, wenn Anzahl der Einträge nicht genau durch 5 teilbar ist?

    Hier lautet das Stichwort: Modulo-Division.

    Anzahl Seiten = (Anzahl der Einträge / 5) + 1 WENN Anzahl der Einträge % 5 > 0

    Dann werden Links generiert
    << Vorherige Seite Nächste Seite >>
    Diese Links haben im href sowas wie ?page=1 oder so stehen.
    Doch wie weiß ich jetzt, wann nur noch
    Nächste Seite >>

    Wenn es die erste Seite ist.

    oder halt
    << Vorherige Seite steht.

    Wenn es die letzte Seite ist.

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --
    _ - jenseits vom delirium - _

       Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
    1. Hallo Korrekteur!

      Anzahl Seiten = (Anzahl der Einträge / 5) + 1 WENN Anzahl der Einträge % 5 > 0

      ^^^^^^^^^^^^^^^^^^^^^^^^^

      Muss in einem Integer umgewandelt werden: int(Anzahl der Einträge / 5) in Perl (php wahrscheinlich auch).

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --
      _ - jenseits vom delirium - _

         Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
      J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
      1. Hallo :)

        Anzahl Seiten = (Anzahl der Einträge / 5) + 1 WENN Anzahl der Einträge % 5 > 0
                           ^^^^^^^^^^^^^^^^^^^^^^^^^

        Muss in einem Integer umgewandelt werden: int(Anzahl der Einträge / 5) in Perl (php wahrscheinlich auch).

        Herr Lehrer, ich weiss was:

        PHP
        $Anzahl_Seiten = ceil($Anzahl_der_Einträge / 5) ;

        ceil rundet auf ganze Zahl auf

        mfg
        cygnus

        --
        Die Sache mit der Angel und dem  ><o(((°>  hat immer einen Haken ...
        1. Hallo cygnus!

          Herr Lehrer, ich weiss was:

          Herr Lehrersohn, wenn ich bitten darf. Erklärt meine Manie, Tippfehler von anderen anzumaulen und über die eigenen hinwegzusehen...

          $Anzahl_Seiten = ceil($Anzahl_der_Einträge / 5) ;
          ceil rundet auf ganze Zahl auf

          Perl kennt das nicht direkt, aber:

          C:>perldoc -f int
              int EXPR
              int     Returns the integer portion of EXPR. If EXPR is omitted, uses
                      $_. You should not use this function for rounding: one because
                      it truncates towards 0, and two because machine representations
                      of floating point numbers can sometimes produce counterintuitive
                      results. For example, "int(-6.725/0.025)" produces -268 rather
                      than the correct -269; that's because it's really more like
                      -268.99999999999994315658 instead. Usually, the "sprintf",
                      "printf", or the "POSIX::floor" and "POSIX::ceil" functions will
                      serve you better than will int().

          Aha. Geht mit (s)printf oder übers POSIX-Modul.

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --
          _ - jenseits vom delirium - _

             Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
          1. Hallo :)

            Herr Lehrer, ich weiss was:

            Herr Lehrersohn, wenn ich bitten darf. Erklärt meine Manie, Tippfehler von anderen anzumaulen und über die eigenen hinwegzusehen...

            Das ist ja harmlos.
            Ich habe zwar keinen Lehrer unter meinen Eltern,
            bin aber noch viel schlimmer.

            Mir hat gestern Abend jemand gestattet, den in Entwicklung stehenden Adminbereich seines Projektes zu betreten und dort etwas auszuprobieren.
            Als ich zufällig entdeckte, dass ich auch dort die vorhandenen Files editieren kann, habe ich sämtliche Tippfehler in allen Files die ich erwischen konnte korrigiert.

            mfg
            cygnus

            --
            Die Sache mit der Angel und dem  ><o(((°>  hat immer einen Haken ...
            1. Als ich zufällig entdeckte, dass ich auch dort die vorhandenen Files editieren kann, habe ich sämtliche Tippfehler in allen Files die ich erwischen konnte korrigiert.

              So ein Tool wünsch ich mir auch manchmal :-)

              Struppi.

  2. echo $begrüßung;

    Ich fang mal von hinten an.

    Und außerdem muss ich ja für jede ?page bestimmen welche Mysql Einträge ausgelesen werden...

    Du weißt, welche Seite du darstellen willst, weißt wieviele Einträge pro Seite sein sollen, also kannst du mit einer simplen Multiplikation das erste Element der Seite errechnen. Das und die Anzahl pro Seite sind die beiden Parameter für die LIMIT-Klausel. Das Rechnen wird einfacher, wenn du immer mit 0 zu zählen anfängst.

    Seite 0 × 5 Elemente pro Seite = Startelement 0
      Seite 1 × 5 Elemente pro Seite = Startelement 5
      Seite 2 × 5 Elemente pro Seite = Startelement 10

    Ich hatte mir es jetzt so gedacht: Zuerst fragt der mit if ab ob es mehr als 5 einträge sind.

    Wenn ein MySQL-SELECT-Statement mit einer LIMIT-Klausel versehen wird, kann man ihm auch noch SQL_CALC_FOUND_ROWS mit auf den Weg geben (nach dem SELECT einzufügen). Eine zweite Abfrage nach SELECT FOUND_ROWS() liefert die Gesamtanzahl, die das Statement ohne LIMIT ergeben hätte. Mit etwas Division bekommst die Anzahl der Seiten für die Blätterfunktionalität.

    24 gefundene Zeilen minus 1 : 5 Elemente pro Seite = 0..4 Seiten
      25 gefundene Zeilen minus 1 : 5 Elemente pro Seite = 0..4 Seiten
      26 gefundene Zeilen minus 1 : 5 Elemente pro Seite = 0..5 Seiten
      27 gefundene Zeilen minus 1 : 5 Elemente pro Seite = 0..5 Seiten

    Das "minus 1" ergibt sich aus der Zählung ab 0. 25 Zeilen sind 0..24, 26 Zeilen sind 0..25. Das Element 25 ist das erste auf Seite 5.

    wie muss ich dann die if-Abfragen stellen, die die MySQl Auslesungen beinflussen?

    Mit obiger Vorgehensweise beschränkt sich das Manipulieren auf die Berechnung der LIMIT-Parameter.

    Dann werden Links generiert

    Du weißt ja, auf welcher Seite du bist und anhand der Berechnung, wieviele Seiten es gibt, sollte die Entscheidung, welche Blätterelemente anzuzeigen sind nicht schwerfallen. [1]

    Ein Problem ist allerdings noch. Jemand könnte als gewünschte Seite einen negativen Wert, einen zu großen, einen mit Kommastellen oder einen Nicht-Zahlenwert angeben. Mit intval() bekommt man erst einmal garantiert einen Integerwert und im Zweifelsfall eine 0. Diesen kann man noch, wenn er kleiner als 0 ist, auf 0 festsetzen. Die maximale Seitenanzahl ergibt sich erst nach der Abfrage und der Berechnung. Das sieht nach einem Problem aus. Ist es aber nicht. Ein zu großer Anfangswert bei LIMIT wirkt sich nicht schädlich aus. Es gibt dann nur eine leere Ergebnismenge und damit eine leere Ergebnisanzeige im Browser. Pech gehabt - wer manipuliert ist eh nicht am echten Ergebnis interessiert. SQL_CALC_FOUND_ROWS und FOUND_ROWS() liefern trotzdem das gewünschte Ergebnis und die Berechnung der Blätterelemente kann problemlos erfolgen.

    [1] Eine zu große Seitenzahl (?page=...) ist unschädlich bei der Ermittlung der Ergebnismenge. Beim Berechnen der Blätterelemente kann (der FOUND_ROWS()-Wert steht ja jetzt zur Verfügung) und muss der page-Wert in seinen erlaubten Rahmen zurückgebracht werden.

    echo "$verabschiedung $name";