Jnnbo: PHP Blätterfunktion

Moin,

kennt ihr zufällig eine einfache "PHP Blätterfunktion"? Derzeit lese ich bei jedem Seitenaufruf gut 5000 Artikel aus, zieht jedesmal mein ganzen Browser in den Keller. Ich verwende $mysqli->prepare

akzeptierte Antworten

  1. Moin!

    Was? Dazu gibt es kein Video?

    Erster Google-Treffer:

    http://www.w3schools.com/php/php_mysql_select_limit.asp

    2. Kasten.

    Das mit dem Asterix (*) lernst Du aber nicht. w3schools.com hat ab und zu fachlich falsche Beispiele. Quelle für MySQL, SELECT und alles was dazu gehört.

    Jörg Reinholz

    1. Hallo Jörg,

      Was? Dazu gibt es kein Video?

      kein passendes dazu gefunden :/ Bzw. es gibt Videos nur die verstehe ich gleich 0 weil diese auf Spanisch sind.

      http://www.w3schools.com/php/php_mysql_select_limit.asp 2. Kasten. Das mit dem Asterix (*) lernst Du aber nicht. w3schools.com hat ab und zu fachlich falsche Beispiele. Quelle für MySQL, SELECT und alles was dazu gehört.

      Das Beispiel habe ich auch schon gesehen allerdings fehlt hier das wichtigste und zwar die Nummern um zwischen den Einträgen zu wechseln

      1. Moin!

        Das ist eigentlich alles triviales Zeug. Die Idee zum Programm beruht auf der Mathematik aus der 3. Klasse "Textaufgabe" oder so.

        <?php
        define ('LIMIT', 20);
        if ( isset($_GET['seite']) && $_GET['seite'] > 1 ) {
            $offset= ( intval($_GET['seite') - 1 ) * LIMIT;
        }
        $offset=0;
        
        $sql='SELECT `id`, `titel` FROM `artikel` LIMIT ' . LIMIT . ' OFFSET ' . $offset;
        # verbindung
        # abfrage
        foreach ... {
        
           echo '<a href="show_artikel.php?id=',$row['id'],'">', htmlspecualchars($row['titel']), '</a></br>'; 
        }
        if ($offset) {
          echo '<a href="artikel_listen?seite=', $_GET['seite']-1 , '">Vorherige Seite</a> ';
        }
        echo '<a href="artikel_listen?seite=', $_GET['seite']+1 , '">Nächste Seite</a>';
        ?>
        

        Um die maximale Anzahl möglicher Seiten zu ermitteln mache eine SQL-Abfrage ohne Limits:

        $sql='SELECT COUNT(`id`) AS `anzArtikel` FROM `artikel`';
        ...
        $maxSeiten=floor($row['anzArtikel']/LIMIT);
        if ($maxSeiten < $row['anzArtikel']) { $maxSeiten++; }
        

        Das ist jetzt nicht getestet - finde Typos bitte indem Du Dir die Fehler ausgeben lässt und versuchst, diese zu verstehen.

        Jörg Reinholz

        1. Tach!

          Um die maximale Anzahl möglicher Seiten zu ermitteln mache eine SQL-Abfrage ohne Limits:

          Ich nehme dazu das Schlüsselwort SQL_CALC_FOUND_ROWS in die ursprüngliche Query auf und frag dann diese Anzahl mit FOUND_ROWS() ab.

          dedlfix.

      2. Hallo Jörg,

        hab etwas gelesen und daraus ist folgendes entstanden (ohne Video), vielleicht hast du ja kurz Zeit darüber zu schauen ob es OK ist. Hab es online getestet und es funktioniert:

        $sql = "SELECT COUNT(*) AS `amount` FROM web_users";
        $res = $mysqli->prepare($sql);
        $res->execute();
        $res->bind_result($amount);
        $res->fetch();
        $res->close();
        
        $entrysPerPage = 3;
        $pages = ceil($amount/$entrysPerPage);
        
         if(!isset($_GET['id'])){
                
                $page = (isset($_GET['page']) ? $_GET['page'] : 1); 
                $offset = ($page-1) * $entrysPerPage;
                $sql = "SELECT `user_id`, `user_nickname` FROM `web_users` ORDER BY user_id DESC LIMIT ".$offset.", ".$entrysPerPage;
                
                $res = $mysqli->prepare($sql);
                $res->execute();
                $res->bind_result($user_id, $user_nickname);
               
        	    while ($res->fetch())
                {
                    echo $user_nickname . "<br>";
                }
                $res->close();
                
                for($i=1;$i<=$pages;$i++)
                {
                   echo '<a href="a-mitarbeiter2?page='.$i.'">'.$i.'</a>';
                } 
            }
        
        1. Moin!

          Ich würde nicht "SELECT ... LIMIT 3, 9" notieren sondern, der Verständlichkeit wegen "SELECT ... LIMIT 3 OFFSET 9".

          Du musst es später nämlich noch mal verstehen.

          Jörg Reinholz

          1. Hallo Jörg,

            Ich würde nicht "SELECT ... LIMIT 3, 9" notieren sondern, der Verständlichkeit wegen "SELECT ... LIMIT 3 OFFSET 9".

            das habe ich zuerst getestet, als ich dein Posting gelesen hatte:

            $entrysPerPage = 3;
            $pages = ceil($amount/$entrysPerPage);
            
            $offset = ($page-1) * $entrysPerPage;
            
            $sql = "SELECT `user_id`, `user_nickname` FROM `web_users` ORDER BY user_id DESC LIMIT ".$offset." OFFSET ".$entrysPerPage;
            

            Dann erhalte ich zwar auch zwei Seiten allerdings ist auf Seite 1 keine Ausgabe, auf Seite zwei sind die restlichen 2 Einträge.

            1. Hallo Jörg,

              ok hab es hinbekommen, sonst noch ein Einwand?

              define ('LIMIT', 3);
              
              $sql = "SELECT COUNT(*) AS `amount` FROM web_users";
              $res = $mysqli->prepare($sql);
              $res->execute();
              $res->bind_result($amount);
              $res->fetch();
              $res->close();
              
              $offset=0;
              
              if (isset($_GET['page']) && $_GET['page'] > 1 ) {
                  $offset = (intval($_GET['page']) - 1 ) * LIMIT;
              }
              
              $pages = ceil($amount/LIMIT);
              
                    $sql = 'SELECT `user_id`, `user_nickname` FROM `web_users` LIMIT ' . LIMIT . ' OFFSET ' . $offset;
                      
                    $res = $mysqli->prepare($sql);
                    $res->execute();
                    $res->bind_result($user_id, $user_nickname);
                     
              	  while ($res->fetch())
                     {
                        echo $user_nickname . "<br>";
                     }
                    $res->close();
                      
                    for($i=1;$i<=$pages;$i++)
                     {
                       echo '<a href="a-mitarbeiter2?page='.$i.'">'.$i.'</a>';
                     } 
              

              UPDATE 23:45 Uhr:

              Hab noch ein IF hinzugefügt um die Seitenanzahl nur anzuzeigen, wenn mehr Einträge vorhanden sind, also im Limit definiert, sieht schöner aus

              	  if ($amount > LIMIT) { 
              	    
              		  for($i=1;$i<=$pages;$i++)
              		   {
              			 echo '<a href="a-mitarbeiter2?page='.$i.'">'.$i.'</a>';
              		   } 
              	  }
              
              1. Moin!

                Ich habe nichts zu meckern - wenn Du also glücklich bist ist es O.K.

                Jörg Reinholz

                1. Hallo Jörg,

                  Ich habe nichts zu meckern - wenn Du also glücklich bist ist es O.K.

                  ganz Glücklich bin ich noch nicht, eigentlich wollte ich so eine Auflistung erreichen

                  Alternativ-Text

                  Gehe mal davon aus, hat wieder etwas mit Mathematik aus der 3. Klasse zu tun?

                  1. Moin!

                    ganz Glücklich bin ich noch nicht, eigentlich wollte ich so eine Auflistung erreichen

                    Alternativ-Text

                    Gehe mal davon aus, hat wieder etwas mit Mathematik aus der 3. Klasse zu tun?

                    Aber ja doch!

                    <?php
                    # Konfiguration mit Konstante
                    define ('FTX_SHOW_PAGES', 5);
                    
                    ### dein Skript
                    
                    ## Test:
                    echo implode( "<br>\n", Pager(3,2) );
                    
                    
                    function mkButtons ($min, $max, $aktuellePage) {
                        ## Erzeugt die eigentlichen Button, wird von
                        ## Funktion Pager aufgerufen.
                        $ar=array();
                        for ($i=$min; $i<=$max; $i++) {
                            # Link oder nicht?
                            if ( $i != $aktuellePage ) {
                                $ar[] = "<a href=\"?seite=$i\"><button class=\"FTX_Pager\">$i</button></a>";
                            } else {
                                $ar[] = "<button class=\"FTX_Pager\">$i</button>";
                            }
                        }
                        return $ar;
                    }
                    
                    function Pager ($anzahlPages, $aktuellePage) {
                        ## Erzeugt den Pager
                        $firstPage=0;
                        $lastPage=$anzahlPages;
                    
                        ## erster Fall: SHOW_PAGES <= $anzahlPages
                        if ( FTX_SHOW_PAGES >= $anzahlPages ) {
                            return mkButtons( 1, $anzahlPages, $aktuellePage );
                        }
                    
                        ## Zweiter Fall, genug Seiten:
                        # Ermittellen der Mitte
                        # Wenn gerade Zahl, damm links der Mitte:
                        $min =   ceil( $aktuellePage - FTX_SHOW_PAGES / 2 );
                        $max = floor ( $aktuellePage + FTX_SHOW_PAGES / 2 );
                    
                        # Es kann sein, der Ausschnitt muss gerückt werden, wenn die
                        # aktuelle Seite nahe am Anfang oder Ende ist:
                        while ( $min < 1 ) {
                           $min ++;
                           $max ++;
                        }
                        while ( $max > $anzahlPages ) {
                           $min --;
                           $max --;
                        }
                        #die ("Min: $min    Max: $max");
                        return mkButtons( $min, $max, $aktuellePage );
                    }
                    

                    Jörg Reinholz

                    1. Moin!

                      Ein paar Nach- und Verbesserungen:

                      <?php
                      # Konfiguration mit Konstanten
                      define ('FTX_SHOW_PAGES', 5);
                      define ('FTX_PAGER_LINK_ITEM', '<a href="?seite={{NUMMER}}"><button class="FTX_Pager">{{NUMMER}}</button></a>');
                      define ('FTX_PAGER_NOLINK_ITEM', '<button class="FTX_Pager">{{NUMMER}}</button>');
                      define ('FTX_PAGER_BETWEEN_ITEMS', "<br>\n");
                      
                      ### HIER Dein Skript
                      
                      ### Test: mkPager ($anzahlPages, $aktuellePage)
                      echo mkPager(10 , 2), "\n";
                      
                      function mkButtons ($min, $max, $aktuellePage) {
                          ## Erzeugt die eigentlichen Button, wird von
                          ## Funktion Pager aufgerufen.
                          $ar=array();
                          for ($i=$min; $i<=$max; $i++) {
                              # Link oder nicht?
                              if ( $i != $aktuellePage ) {
                                  $ar[] = str_replace('{{NUMMER}}' , $i, FTX_PAGER_LINK_ITEM );
                              } else {
                                  $ar[] = str_replace('{{NUMMER}}' , $i, FTX_PAGER_NOLINK_ITEM );
                              }
                          }
                          return implode( FTX_PAGER_BETWEEN_ITEMS, $ar);
                      }
                      
                      function mkPager ($anzahlPages, $aktuellePage) {
                          ## Erzeugt den Pager
                          $firstPage=0;
                          $lastPage=$anzahlPages;
                      
                          ## erster Fall: SHOW_PAGES <= $anzahlPages
                          if ( FTX_SHOW_PAGES >= $anzahlPages ) {
                              return mkButtons( 1, $anzahlPages, $aktuellePage );
                          }
                      
                          ## Zweiter Fall, genug Seiten:
                          # Ermittellen der Mitte
                          # Wenn gerade Zahl, dann links der Mitte:
                          $min = $aktuellePage  - floor(FTX_SHOW_PAGES / 2 ) + 1 - FTX_SHOW_PAGES % 2;
                          $max = $aktuellePage  + floor(FTX_SHOW_PAGES / 2 );
                      
                          # Es kann sein, der Ausschnitt muss gerückt werden, wenn die
                          # aktuelle Seite nahe am Anfang oder Ende ist:
                          while ( $min < 1 ) {
                             $min ++;
                             $max ++;
                          }
                          while ( $max > $anzahlPages ) {
                             $min --;
                             $max --;
                          }
                          return mkButtons( $min, $max, $aktuellePage );
                      }
                      
                      

                      Jörg Reinholz

                      1. Hallo Jörg,

                        danke für deine Hilfe, hab es mal versucht einzubauen, aber es ist mir einfach eine Nummer zu hoch.

                        Mein Test sieht so aus:

                        define ('FTX_SHOW_PAGES', 1);
                        define ('FTX_PAGER_LINK_ITEM', '<a href="a-mitarbeiter3?page={{NUMMER}}"><button class="FTX_Pager">{{NUMMER}}</button></a>');
                        define ('FTX_PAGER_NOLINK_ITEM', '<button class="FTX_Pager">{{NUMMER}}</button>');
                        define ('FTX_PAGER_BETWEEN_ITEMS', "<br>\n");
                        
                        define ('LIMIT', 1);
                        
                        function mkButtons ($min, $max, $aktuellePage) {
                            ## Erzeugt die eigentlichen Button, wird von
                            ## Funktion Pager aufgerufen.
                            $ar=array();
                            for ($i=$min; $i<=$max; $i++) {
                                # Link oder nicht?
                                if ( $i != $aktuellePage ) {
                                    $ar[] = str_replace('{{NUMMER}}' , $i, FTX_PAGER_LINK_ITEM );
                                } else {
                                    $ar[] = str_replace('{{NUMMER}}' , $i, FTX_PAGER_NOLINK_ITEM );
                                }
                            }
                            return implode( FTX_PAGER_BETWEEN_ITEMS, $ar);
                        }
                        
                        function mkPager ($anzahlPages, $aktuellePage) {
                            ## Erzeugt den Pager
                            $firstPage=0;
                            $lastPage=$anzahlPages;
                        
                            ## erster Fall: SHOW_PAGES <= $anzahlPages
                            if ( FTX_SHOW_PAGES >= $anzahlPages ) {
                                return mkButtons( 1, $anzahlPages, $aktuellePage );
                            }
                        
                            ## Zweiter Fall, genug Seiten:
                            # Ermittellen der Mitte
                            # Wenn gerade Zahl, dann links der Mitte:
                            $min = $aktuellePage  - floor(FTX_SHOW_PAGES / 2 ) + 1 - FTX_SHOW_PAGES % 2;
                            $max = $aktuellePage  + floor(FTX_SHOW_PAGES / 2 );
                        
                            # Es kann sein, der Ausschnitt muss gerückt werden, wenn die
                            # aktuelle Seite nahe am Anfang oder Ende ist:
                            while ( $min < 1 ) {
                               $min ++;
                               $max ++;
                            }
                            while ( $max > $anzahlPages ) {
                               $min --;
                               $max --;
                            }
                            return mkButtons( $min, $max, $aktuellePage );
                        }
                        
                        $sql = "SELECT COUNT(*) AS `amount` FROM web_users";
                        $res = $mysqli->prepare($sql);
                        $res->execute();
                        $res->bind_result($amount);
                        $res->fetch();
                        $res->close();
                        
                        $offset=0;
                        
                        if (isset($_GET['page']) && $_GET['page'] > 1 ) {
                            $offset = (intval($_GET['page']) - 1 ) * LIMIT;
                        }
                        
                        $pages = ceil($amount/LIMIT);
                        
                              $sql = 'SELECT `user_id`, `user_nickname` FROM `web_users` LIMIT ' . LIMIT . ' OFFSET ' . $offset;
                                
                              $res = $mysqli->prepare($sql);
                              $res->execute();
                              $res->bind_result($user_id, $user_nickname);
                               
                        	  while ($res->fetch())
                               {
                                  echo $user_nickname . "<br>";
                               }
                              $res->close();
                              
                        	  if ($amount > LIMIT) { 
                        	    
                        		 echo "<div class=\"pagination\">";
                        		  for($i=1;$i<=$pages;$i++)
                        		   {
                        			 $active = "";
                        	         if ($_SERVER["QUERY_STRING"] == "page=".$i): $active = "active"; endif;
                        			 echo mkPager(10 , 2), "\n";
                        		   } 
                        		 echo "</div>";
                        	  }
                        

                        Die Aussage sieht so aus

                        Alternativ-Text

                        1. Moin!

                          Vermutlich liegt es hieran:

                          		  for($i=1;$i<=$pages;$i++)
                          		   {
                          			 $active = "";
                          	                 if ($_SERVER["QUERY_STRING"] == "page=".$i): $active = "active"; endif;
                          			 echo mkPager(10 , 2), "\n";
                          		   } 
                          		 echo "</div>";
                          

                          mkPager wird demnach mehrfach aufgerufen und zeigt, weil die Konstante 'LIMIT' auf 1 gesetzt ist, genau eine Seite an: die aktuelle - also 2. Die aber für jeden Durchlauf in der for-Schleife.

                          Abhilfe: echo mkPager(10 , 2), "\n"; außerhalb der Schleife.

                          (Und ändere FTX_PAGER_BETWEEN_ITEMS auf ' ' - sonst bekommst Du, wenn es wie von Dir erwartet läuft, Zeilenumbrüche.)

                          Jörg Reinholz

                          1. Hallo Jörg,

                            Abhilfe: echo mkPager(10 , 2), "\n"; außerhalb der Schleife.

                            hab ich geändert, jetzt wird mkPager nicht mehrfach ausgeführt. Was ich aber noch nicht verstehe die Zahlen echo mkPager(6 , 1), "\n"; die müssen doch dynamisch irgendwie gefüllt werden?

                            (Und ändere FTX_PAGER_BETWEEN_ITEMS auf ' ' - sonst bekommst Du, wenn es wie von Dir erwartet läuft, Zeilenumbrüche.)

                            Habe ich geändert. Jetzt werden diese auch nebeneinander angezeigt.

                            1. Moin!

                              Hallo Jörg,

                              Abhilfe: echo mkPager(10 , 2), "\n"; außerhalb der Schleife.

                              hab ich geändert, jetzt wird mkPager nicht mehrfach ausgeführt. Was ich aber noch nicht verstehe die Zahlen echo mkPager(6 , 1), "\n"; die müssen doch dynamisch irgendwie gefüllt werden?

                              Aber ja doch. Klugerweise habe ich sinntragende Variablennamen gewählt:

                              function mkPager ($anzahlPages, $aktuellePage) {
                              

                              $anzahlPages = Anzahl der Seiten. $aktuellePage = Aktuelle Seitennummer.

                              Die Werte müssen natürlich schon fest stehen.

                              Hier hatte ich das berechnet:

                              $sql='SELECT COUNT(`id`) AS `anzArtikel` FROM `artikel`';
                              ...
                              $maxSeiten=floor($row['anzArtikel']/LIMIT);
                              if ($maxSeiten < $row['anzArtikel']) { $maxSeiten++; }
                              

                              Bei Dir wäre das wohl:

                              $pages = ceil($amount/LIMIT);
                              ...
                              $_GET['page']
                              

                              Also Aufruf mit:

                              echo mkPager ($pages, intval($_GET['page']) ), "\n";
                              

                              Jörg Reinholz

                              1. Hallo Jörg,

                                danke für deine Hilfe. Nun werden mir die Seiten auch angezeigt, wenn ich allerdings kein ?page=1 mit übergebe, dann erhalte ich die Meldung "Notice: Undefined index: page" das heißt also, ich muss $page irgendwo vorher mit einem Wert belegen?

                                Wenn ich mir deine Ausgabe nun anschaue erhalte ich dieses:

                                Alternativ-Text

                                Hat sich zu meinem Beispiel von gestern Abend nichts geändert. Was ich auch nicht verstehe ich dieses

                                define ('FTX_SHOW_PAGES', 5);
                                

                                Was wird mit diesem Wert festgelegt. Wenn ich diese Zahl auf 1 ändere, wird mir nur Seite 1 angezeigt, also müsste dieser Wert auch dynamisch sein?

                                Und wenn ich es richtig sehe, erhalte ich mit deinem Script nicht diese Ausgabe, wie gestern Abend noch gefragt? http://forum.selfhtml.org/self/2015/may/24/php-blaetterfunktion/1641353#m1641353

                                1. Moin!

                                  Hallo Jörg,

                                  danke für deine Hilfe. Nun werden mir die Seiten auch angezeigt, wenn ich allerdings kein ?page=1 mit übergebe, dann erhalte ich die Meldung "Notice: Undefined index: page" das heißt also, ich muss $page irgendwo vorher mit einem Wert belegen?

                                  Wenn ich mir deine Ausgabe nun anschaue erhalte ich dieses:

                                  Alternativ-Text

                                  Hat sich zu meinem Beispiel von gestern Abend nichts geändert. Was ich auch nicht verstehe ich dieses

                                  define ('FTX_SHOW_PAGES', 5);
                                  

                                  Was wird mit diesem Wert festgelegt.

                                  Das ist die MAXIMALE Anzahl der Buttons.

                                  Wenn Du nur 20 Artikel hast und 10 (Konstante: LIMIT) pro Seite listen willst, dann steht da zwar 5, aber es gibt nur 2 Seiten. Das Skript begrenzt das also... und es werden nur 2 Buttons angezeigt.

                                  Hast Du aber 200 Artikel und listest 10 (Konstante: LIMIT) pro Seite, dann gibt es 20 Seiten und werden so viele Buttons angezeigt, wie Du in FTX_SHOW_PAGES konfigurierst. wenn Du einen besseren Namens hast, dann ersetze alle Vorkommen von FTX_SHOW_PAGES z.B. durch FTX_MAX_LIST_BUTTONS ...

                                  Und wenn ich es richtig sehe, erhalte ich mit deinem Script nicht diese Ausgabe, wie gestern Abend noch gefragt? http://forum.selfhtml.org/self/2015/may/24/php-blaetterfunktion/1641353#m1641353

                                  Ja doch. Aber die zusätzlichen Button für

                                  • erste Seite (1) (Link nur, wenn aktuelle Seite > 1)
                                  • eine Seite zurück (intval($_GET['page'])+1) (Link nur, wenn aktuelle Seite > 1)
                                  • [Hier die Buttons, die meine Funktion baut]
                                  • eine Seite vor (intval($_GET['page'])+1) (Link nur, wenn $_GET['page'] < $maxPages)
                                  • letzte Seite ($maxPages) (Link nur, wenn $_GET['page'] < $maxPages)

                                  ... habe ich für trivial genug gehalten, als dass Du das selbst schaffst.

                                  Jörg Reinholz

                                  1. Hallo Jörg,

                                    Ja doch. Aber die zusätzlichen Button für

                                    • erste Seite (1) (Link nur, wenn aktuelle Seite > 1)
                                    • eine Seite zurück (intval($_GET['page'])+1) (Link nur, wenn aktuelle Seite > 1)
                                    • [Hier die Buttons, die meine Funktion baut]
                                    • eine Seite vor (intval($_GET['page'])+1) (Link nur, wenn $_GET['page'] < $maxPages)
                                    • letzte Seite ($maxPages) (Link nur, wenn $_GET['page'] < $maxPages)

                                    ... habe ich für trivial genug gehalten, als dass Du das selbst schaffst.

                                    es geht mir eigentlich nicht um das vor und zurück, das ist mir eigentlich egal. Mir geht es eher darum, wenn ich 200 Seiten habe, dass ich eben nicht alle angezeigt bekomme, sondern dazwischen die ... stehen habe. Verstehst du was ich meine?

                                    1. Moin!

                                      es geht mir eigentlich nicht um das vor und zurück, das ist mir eigentlich egal. Mir geht es eher darum, wenn ich 200 Seiten habe, dass ich eben nicht alle angezeigt bekomme, sondern dazwischen die ... stehen habe. Verstehst du was ich meine?

                                      Wenn Du 200 Artikel hast und 10/Seite anzeigst, dann hast Du 20 Seiten. Wenn du aktuell die Seite Nr. 1 angezeigt wird (setze $_GET['page'] auf 1, wenn es nicht gesetzt oder 0 ist) dann siehts Du bei einem LIMIT von FTX_SHOW_PAGES = 5 folgendes:

                                      normal: Link, fett: aktuelle Seite

                                      1 2 3 4 5

                                      Auf Seite 15:

                                      13 14 15 16 17

                                      Auf Seite 19:

                                      16 17 18 19 20

                                      Jörg Reinholz

                                      1. Hallo Jörg,

                                        Wenn Du 200 Artikel hast und 10/Seite anzeigst, dann hast Du 20 Seiten. Wenn du aktuell die Seite Nr. 1 angezeigt wird (setze $_GET['page'] auf 1, wenn es nicht gesetzt oder 0 ist) dann siehts Du bei einem LIMIT von FTX_SHOW_PAGES = 5 folgendes:

                                        normal: Link, fett: aktuelle Seite

                                        1 2 3 4 5

                                        Auf Seite 15:

                                        13 14 15 16 17

                                        Auf Seite 19:

                                        16 17 18 19 20

                                        danke für deine Erklärung, wird für mich aber immer komplizierter. Ist egal, dann werden unten erstmal sehr viele Seiten nebeneinander angezeigt. Wenn ich mal mehr Geld habe, lass ich diese Funktion von jemandem programmieren der es kann oder ich schau mir ein Video dazu an (wenn auch die meisten auf Spanisch sind).

                                        1. Moin!

                                          danke für deine Erklärung, wird für mich aber immer komplizierter. Ist egal, dann werden unten erstmal sehr viele Seiten nebeneinander angezeigt. Wenn ich mal mehr Geld habe, lass ich diese Funktion von jemandem programmieren der es kann oder ich schau mir ein Video dazu an (wenn auch die meisten auf Spanisch sind).

                                          Wieso denn? Das Skript an sich funktioniert. Auch bei 200 Seiten werden immer (höchstens!) nur so viele Buttons angezeigt wie in FTX_SHOW_PAGES; definiert.

                                          Vermutlich übergibst Du falsche Werte. Teste das mit meinem ursprünglichen Skript.

                                          Jörg Reinholz

                                          1. Hallo Jörg,

                                            Vermutlich übergibst Du falsche Werte. Teste das mit meinem ursprünglichen Skript.

                                            wenn ich dein Script 1zu1 kopiere und aus

                                            return implode( FTX_PAGER_BETWEEN_ITEMS, $ar);
                                            

                                            das mache

                                            return implode( ' ', $ar);
                                            

                                            erhalte ich folgende Ausgabe

                                            Alternativ-Text

                                            Ich kann alle Zahlen anklicken, außer die zwei.

                                            1. Moin!

                                              wenn ich dein Script 1zu1 kopiere und aus

                                              return implode( FTX_PAGER_BETWEEN_ITEMS, $ar);
                                              

                                              das mache

                                              return implode( ' ', $ar);
                                              

                                              Das sollst Du nicht. Du sollst FTX_PAGER_BETWEEN_ITEMS als ' ' definieren:

                                              define ('FTX_PAGER_BETWEEN_ITEMS' , ' ');
                                              

                                              Oder was glaubst Du, warum ich das so mache? Damit sich das konfigurieren lässt nämlich...

                                              Ich kann alle Zahlen anklicken, außer die zwei.

                                              Ja. Das ist völlig richtig! Weil der Test behauptet,

                                              ### Test: mkPager ($anzahlPages, $aktuellePage)
                                              echo mkPager(10 , 2), "\n";
                                              

                                              dass die zweite Seite die aktuelle sei. Warum solltest Du zur aktuellen Seite verlinken? Und außerdem wolltest Du diesen Button mit css doch farblich hervorheben ... das geht sehr gut in dem Dein CSS einmal

                                              .pager Button  {
                                                 ...
                                              }
                                              

                                              und einmal

                                              .pager a button {
                                                 ...
                                              }
                                              

                                              unterscheidet, womöglich noch mit a:hover, a:vistited und dem ganzen Kram.

                                              Jörg Reinholz

                                              1. Hallo Jörg,

                                                Das sollst Du nicht. Du sollst FTX_PAGER_BETWEEN_ITEMS als ' ' definieren:

                                                define ('FTX_PAGER_BETWEEN_ITEMS' , ' ');
                                                

                                                Ok, habe ich auch geändert:

                                                define ('FTX_PAGER_BETWEEN_ITEMS', " ");
                                                

                                                Ja. Das ist völlig richtig! Weil der Test behauptet,

                                                ### Test: mkPager ($anzahlPages, $aktuellePage)
                                                echo mkPager(10 , 2), "\n";
                                                

                                                Dann habe ich es erstmal so geschafft, jetzt muss ich mich eben noch um die Darstellung kümmern wie ich es gestern Abend gezeigt habe mit dem VOR und Weiter und dazwischen eben den ....

                                                Erste << .... 3 4 5 6 ... >> Letzte

                                                dass die zweite Seite die aktuelle sei. Warum solltest Du zur aktuellen Seite verlinken? Und außerdem wolltest Du diesen Button mit css doch farblich hervorheben ... das geht sehr gut in dem Dein CSS einmal

                                                Ok, habe ich auch mal eingefügt

                                                .pager .btn {
                                                		padding: 0px 9px;
                                                		margin-right: 4px;
                                                		border-radius: 3px;
                                                		border: solid 1px #c0c0c0;
                                                		text-decoration: none;	
                                                	
                                                }
                                                .pager button  {
                                                		background: #616161;
                                                		color: #fff;
                                                }
                                                .pager a button {
                                                		background: #e9e9e9;
                                                		color: #000;
                                                }
                                                
                                                define ('FTX_PAGER_LINK_ITEM', '<a href="?seite={{NUMMER}}"><button class="btn FTX_Pager">{{NUMMER}}</button></a>');
                                                define ('FTX_PAGER_NOLINK_ITEM', '<button class="btn FTX_Pager">{{NUMMER}}</button>');
                                                
                                2. Hallo Jörg,

                                  [....] wenn ich allerdings kein ?page=1 mit übergebe, dann erhalte ich die Meldung "Notice: Undefined index: page" das heißt also, ich muss $page irgendwo vorher mit einem Wert belegen?

                                  ok, das Problem habe ich so gelöst:

                                  if (empty ($_GET['page']))  {$_GET['page'] = 1;} 
                                  echo mkPager ($pages, intval($_GET['page']) ), "\n";
                                  

                                  Wenn ich jetzt kein ?page= übergebe, wird automatisch die 1 übergeben.

                                  1. Moin!

                                    ok, das Problem habe ich so gelöst:

                                    if (empty ($_GET['page']))  {$_GET['page'] = 1;} 
                                    echo mkPager ($pages, intval($_GET['page']) ), "\n";
                                    

                                    Wenn ich jetzt kein ?page= übergebe, wird automatisch die 1 übergeben.

                                    Richtig! So lernt man PHP.

                                    Jörg Reinholz

                                    1. Hallo Jörg,

                                      Richtig! So lernt man PHP.

                                      hab das Script mal versucht in meine Funktion einzubauen und zwar zuerst so:

                                      function kundenUebersicht1($mysqli, $UserCode=false, $UserRechte=false, $gesperrt=false, LIMIT, $offset) {
                                      		
                                      $select = "SELECT 
                                      		kd_id, 
                                                      [....]
                                      $stmt = $mysqli->prepare($select . ' WHERE kd_status = 0 ORDER by kd_id DESC  LIMIT ' . LIMIT . ' OFFSET ' . $offset);
                                      

                                      funktioniert leider nicht, ich muss diesen Weg gehen

                                      function kundenUebersicht1($mysqli, $UserCode=false, $UserRechte=false, $gesperrt=false, $LIMIT, $offset) {
                                      	    $LIMIT = LIMIT;
                                      		$select = "SELECT 
                                      			    kd_id, 
                                                                  [....]
                                      $stmt = $mysqli->prepare($select . ' WHERE kd_status = 0 ORDER by kd_id DESC  LIMIT ' . LIMIT . ' OFFSET ' . $offset);
                                      

                                      Mein Aufruf sieht so aus

                                      $kundenUebersicht1 = kundenUebersicht1($mysqli, $object->user_code, $object->user_type , $gesperrt, LIMIT, $offset);
                                      

                                      Warum kann ich das LIMIT nicht direkt mit die Funktion packen?

                                      1. Moin!

                                        hab das Script mal versucht in meine Funktion einzubauen und zwar zuerst so:

                                        function kundenUebersicht1($mysqli, $UserCode=false, $UserRechte=false, $gesperrt=false, LIMIT, $offset) {
                                        

                                        Die Paare mit den Ersatzwerten ($UserCode=false, $UserRechte=false, $gesperrt=false) müssten ganz recht stehen, sonst ordnet der Interpreter die Werte den falschen Variablen zu. Der nimmt nämlich einfach die Reihenfolge, in der diese eingegeben werden. Du kannst die nur von rechts nach links weglassen, also nicht $offset angeben und $UserCode weglassen ... Wie soll das gehen?

                                        function kundenUebersicht1($mysqli, $offset, $UserCode=false, $UserRechte=false, $gesperrt=false)
                                        

                                        Um das mal zu zeigen:

                                        Du hast

                                        <?php
                                         ### Murks: ###
                                        function parameterTest ($foo='FOO', $bar) {
                                           echo 'in $bar steht "', $bar, "\"\n";
                                           echo 'in $foo steht "', $foo, "\"\n";
                                        
                                        }
                                        parameterTest ('BAR');
                                        

                                        Erwartungsgemäß kommt ein Rudel Fehlermeldungen:

                                        PHP Warning:  Missing argument 2 for parameterTest(), called in /tmp/test3.php on line 8 and defined in /tmp/test3.php on line 3
                                        
                                        Warning: Missing argument 2 for parameterTest(), called in /tmp/test3.php on line 7 and defined in /tmp/test3.php on line 3
                                        in $bar steht "PHP Notice:  Undefined variable: bar in /tmp/test3.php on line 4
                                        
                                        Notice: Undefined variable: bar in /tmp/test3.php on line 4
                                        "
                                        

                                        und das von Dir nicht erwartete ("falsche") Ergebnis:

                                        in $foo steht "BAR"
                                        

                                        ... welches aber aus PHP-Sicht richtig ist.

                                        Drehen wir das rum:

                                        <?php
                                        function parameterTest ($bar, $foo='FOO') {
                                           echo 'in $bar steht "', $bar, "\"\n";
                                           echo 'in $foo steht "', $foo, "\"\n";
                                        
                                        }
                                        parameterTest ('BAR');
                                        

                                        Erwartungsgemäße (richtige) Ausgaben

                                        in $bar steht "BAR"
                                        in $foo steht "FOO"
                                        

                                        Dein 2. Fall wird also auch nicht immer funktionieren - sondern nur, wenn (und weil) Du alle Parameter tatsächlich übergibst (dann funktioniert auch Beispiel 1):

                                        function kundenUebersicht1($mysqli, $UserCode=false, $UserRechte=false, $gesperrt=false, $LIMIT, $offset) {
                                        	    $LIMIT = LIMIT;
                                        

                                        Aber testen wir das mal:

                                        <?php
                                        define ('KONSTANTE', 'konstante');
                                        parameterTest ('FOO');
                                        
                                        function parameterTest ($bar='BAR', $foo) {
                                            echo 'in $foo steht "', $bar, "\"\n";
                                            echo 'in $bar steht "', $bar, "\"\n";
                                            echo 'in der Konstante steht: "', KONSTANTE, "\"\n";
                                        }
                                        

                                        Erwartungsgemäße Ausgaben:

                                        in $foo steht "BAR"
                                        in $bar steht "BAR"
                                        in der Konstante steht: "konstante"
                                        

                                        Warum kann ich das LIMIT nicht direkt mit die Funktion packen?

                                        Wenn das mit meiner Konstante geht, dann gibt es keinen Grund, warum das mit LIMIT nicht gehen sollte. Ich vermute mal, Du hast in der Funktion wie folgt gearbeitet (statt der definierten KONSTANTE die Variable **$**KONSTANTE verwendet:)

                                        <?php
                                        define ('KONSTANTE', 'konstante');
                                        parameterTest ('FOO');
                                        
                                        function parameterTest ($foo, $bar='BAR') {
                                            echo 'in $foo steht "', $bar, "\"\n";
                                            echo 'in $bar steht "', $bar, "\"\n";
                                            ### Murks: ###
                                            echo 'in der Konstante steht: "', $KONSTANTE, "\"\n";
                                        }
                                        

                                        Erwartete Ausgaben und Fehlermeldungen:

                                        in $foo steht "BAR"
                                        in $bar steht "BAR"
                                        in der Konstante steht: "PHP Notice:  Undefined variable: KONSTANTE in /tmp/test3.php on line 9
                                        
                                        Notice: Undefined variable: KONSTANTE in /tmp/test3.php on line 9
                                        "
                                        

                                        Dem bist Du dann mit $LIMIT=LIMIT aus dem Weg gegangen, hast dabei aber bewiesen, dass die Konstante LIMIT (ohne "$" !) verfügbar war... Du musst diese nur richtig verwenden.

                                        <?php
                                        define ('KONSTANTE', 'konstante');
                                        parameterTest ('FOO');
                                        
                                        ### Murks: ###
                                        function parameterTest ($foo, $bar='BAR', $KONSTANTE ) {
                                            echo 'in $foo steht "', $bar, "\"\n";
                                            echo 'in $bar steht "', $bar, "\"\n";
                                            ### Murks: ###
                                            $KONSTANTE = KONSTANTE;
                                            ### Murks: ###
                                            echo 'in der Konstante steht: "', $KONSTANTE, "\"\n";
                                        }
                                        

                                        Was Murks ist, weil es zwar das erwartete Ergebnis bringt, zuvor aber völlig ohne Not mit Warnungen/Notizen ("Warnung/Notiz" nach Jörg Reinholz: "Programmfehler ohne Abbruch") um sich schmeisst:

                                        PHP Warning:  Missing argument 3 for parameterTest(), called in /tmp/test3.php on line 3 and defined in /tmp/test3.php on line 6
                                        
                                        Warning: Missing argument 3 for parameterTest(), called in /tmp/test3.php on line 3 and defined in /tmp/test3.php on line 6
                                        in $foo steht "BAR"
                                        in $bar steht "BAR"
                                        in der Konstante steht: "konstante"
                                        

                                        Jörg Reinholz

                                        1. Moin!

                                          Jetzt habe ich doch selbst die Skriptstückchen und die Ausgaben schwer durcheinander gebracht. Es ist halt doch mühseelig, weil der Text in der Area wüst springt wenn ich das Programm mit ALT + TAC wechsle...

                                          KORREKTUREN

                                          hab das Script mal versucht in meine Funktion einzubauen und zwar zuerst so:

                                          function kundenUebersicht1($mysqli, $UserCode=false, $UserRechte=false, $gesperrt=false, LIMIT, $offset) {
                                          

                                          Die Paare mit den Ersatzwerten ($UserCode=false, $UserRechte=false, $gesperrt=false) müssten ganz recht stehen, sonst ordnet der Interpreter die Werte den falschen Variablen zu. Der nimmt nämlich einfach die Reihenfolge, in der diese eingegeben werden. Du kannst die nur von rechts nach links weglassen, also nicht $offset angeben und $UserCode weglassen ... Wie soll das gehen?

                                          function kundenUebersicht1($mysqli, $offset, $UserCode=false, $UserRechte=false, $gesperrt=false)
                                          

                                          Um das mal zu zeigen:

                                          Du hast

                                          <?php
                                          ### Murks: ###
                                          function parameterTest ($foo='FOO', $bar) {
                                             echo 'in $bar steht "', $bar, "\"\n";
                                             echo 'in $foo steht "', $foo, "\"\n";
                                          }
                                          parameterTest ('BAR');
                                          

                                          Erwartungsgemäß kommt ein Rudel Fehlermeldungen:

                                          PHP Warning:  Missing argument 2 for parameterTest(), called in /tmp/test3.php on line 7 and defined in /tmp/test3.php on line 3
                                          
                                          Warning: Missing argument 2 for parameterTest(), called in /tmp/test3.php on line 7 and defined in /tmp/test3.php on line 3
                                          in $bar steht "PHP Notice:  Undefined variable: bar in /tmp/test3.php on line 4
                                          
                                          Notice: Undefined variable: bar in /tmp/test3.php on line 4
                                          "
                                          

                                          und das von Dir nicht erwartete ("falsche") Ergebnis:

                                          in $foo steht "BAR"
                                          

                                          ... welches aber aus PHP-Sicht richtig ist.

                                          Drehen wir das rum:

                                          <?php
                                          function parameterTest ($bar, $foo='FOO') {
                                             echo 'in $bar steht "', $bar, "\"\n";
                                             echo 'in $foo steht "', $foo, "\"\n";
                                          }
                                          parameterTest ('BAR');
                                          

                                          Erwartungsgemäße (richtige) Ausgaben

                                          in $bar steht "BAR"
                                          in $foo steht "FOO"
                                          

                                          Dein 2. Fall wird also auch nicht immer funktionieren - sondern nur, wenn (und weil) Du alle Parameter tatsächlich übergibst (dann funktioniert auch Beispiel 1):

                                          function kundenUebersicht1($mysqli, $UserCode=false, $UserRechte=false, $gesperrt=false, $LIMIT, $offset) {
                                          	    $LIMIT = LIMIT;
                                          

                                          Aber testen wir das mal:

                                          <?php
                                          define ('KONSTANTE', 'konstante');
                                          parameterTest ('FOO');
                                          function parameterTest ($foo, $bar='BAR') {
                                              echo 'in $foo steht "', $foo, "\"\n";
                                              echo 'in $bar steht "', $bar, "\"\n";
                                              echo 'in der Konstante steht: "', KONSTANTE, "\"\n";
                                          }
                                          

                                          Erwartungsgemäße Ausgaben:

                                          in $foo steht "FOO"
                                          in $bar steht "BAR"
                                          in der Konstante steht: "konstante"
                                          

                                          Warum kann ich das LIMIT nicht direkt mit die Funktion packen?

                                          Wenn das mit meiner Konstante geht, dann gibt es keinen Grund, warum das mit LIMIT nicht gehen sollte. Ich vermute mal, Du hast in der Funktion wie folgt gearbeitet (statt der definierten KONSTANTE die Variable **$**KONSTANTE verwendet:)

                                          <?php
                                          define ('KONSTANTE', 'konstante');
                                          parameterTest ('FOO');
                                          
                                          function parameterTest ($foo, $bar='BAR') {
                                              echo 'in $foo steht "', $foo, "\"\n";
                                              echo 'in $bar steht "', $bar, "\"\n";
                                              ### Murks: ###
                                              echo 'in der Konstante steht: "', $KONSTANTE, "\"\n";
                                          }
                                          

                                          Erwartete Ausgaben und Fehlermeldungen:

                                          in $foo steht "FOO"
                                          in $bar steht "BAR"
                                          in der Konstante steht: "PHP Notice:  Undefined variable: KONSTANTE in /tmp/test3.php on line 9
                                          
                                          Notice: Undefined variable: KONSTANTE in /tmp/test3.php on line 9
                                          "
                                          

                                          Dem bist Du dann mit $LIMIT=LIMIT aus dem Weg gegangen, hast dabei aber bewiesen, dass die Konstante LIMIT (ohne "$" !) verfügbar war... Du musst diese nur richtig verwenden.

                                          <?php
                                          define ('KONSTANTE', 'konstante');
                                          parameterTest ('FOO');
                                          
                                          ### Murks: ###
                                          function parameterTest ($foo, $bar='BAR', $KONSTANTE ) {
                                              echo 'in $foo steht "', $foo, "\"\n";
                                              echo 'in $bar steht "', $bar, "\"\n";
                                              ### Murks: ###
                                              $KONSTANTE = KONSTANTE;
                                              ### Murks: ###
                                              echo 'in der Konstante steht: "', $KONSTANTE, "\"\n";
                                          }
                                          

                                          Was Murks ist, weil es zwar das erwartete Ergebnis bringt, zuvor aber völlig ohne Not mit Warnungen/Notizen ("Warnung/Notiz" nach Jörg Reinholz: "Programmfehler ohne Abbruch") um sich schmeisst:

                                          PHP Warning:  Missing argument 3 for parameterTest(), called in /tmp/test3.php on line 3 and defined in /tmp/test3.php on line 6
                                          
                                          Warning: Missing argument 3 for parameterTest(), called in /tmp/test3.php on line 3 and defined in /tmp/test3.php on line 6
                                          in $foo steht "FOO"
                                          in $bar steht "BAR"
                                          in der Konstante steht: "konstante"
                                          

                                          Jörg Reinholz