• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Paginierung im php Skript funktioniert nicht - offenbar wird Link falsch übergeben

Ich habe es ja schonmal angekündigt, dass ich mich demnächst mal mit einem PHP-Skript, das mir seit längerem Kopfzerbrechen bereitet, mal an euch wenden werden. Ich hoffe, dass ihr Experten mir wieder so toll helfen könnt.

Zum Skript: Es ist nur zum Testen und Üben, deshalb nicht wundern über die Sinnlosigkeit. Es werden die Spieler von 5 Bundesligavereinen über mysql ausgegeben, wobei jeder Verein eine eigene SQL-Tabelle hat, wo die jeweiligen Spielerdaten eingetragen sind.

Es besteht desweiteren die Möglichkeit, nach Nummern und Spielernamen zu sortieren. Und hier liegt das Problem: Das Skript funktioniert gut, aber in den Sortiersachen funktioniert die Paginierung nicht. Ich meine, das hat mit den header-Befehlen irgendwas zu tun,weiß aber auch nicht, wie ich es anders machen könnte, um die Funktionalität des Skripts nicht zu beeinträchtigen.

Ich hoffe, ihr habt einen schlauen Tipp :)

P.S. Bitte gnädig sein - wie ich in meinem Thread schon erwähnte, bin ich Anfänger und man kann meinen Code sicher besser, effektiver usw schreiben.

Ok, genug der Vorrede - hier mal der Code: (und schonmal ein herzliches Danke an alle Helfer)

EDIT: Sorry, musste den Code auf mehrere Beiträge teilen wegen maximaler Zeichenanzahl.
 
PHP:
1  <?php
     2  ob_start();
     3  session_start();
     4  ?>
     5
     6  <?php
     7  error_reporting(-1);
     8  ini_set('display_errors', TRUE);
     9  ?>
    10
    11  <?php
    12  if (isset($_GET['_nummer'])) {
    13      $_SESSION['sort_nummer_aktiv'] = true;
    14      $_SESSION['nummer'] = $_GET['nummer'];
    15
    16
    17       header('Location: index4.php');
    18       exit;
    19       }
    20
    21  if (isset($_GET['spieler'])) {
    22          $_SESSION['sort_spieler_aktiv'] = true;
    23          $_SESSION['spieler'] = $_GET['spieler'];
    24
    25          header('Location: index4.php');
    26          exit;
    27  }
    28  ?>
    29
    30  <!DOCTYPE html>
    31
    32  <html lang="de">
    33
    34  <head>
    35
    36  <meta charset="utf-8">
    37
    38  <title>Titel</title>
    39
    40  <meta name="viewport" content="width=device-width, initial-scale=1.0">
    41
    42  <link href="design.css" rel="stylesheet">
    43
    44  </head>
    45
    46  <body>
    47
    48  <div id="Kopfzeile">
    49
    50  <div id="links"><img src="./Bilder/logo.JPG" alt="logo"></div>
    51
    52  <div id="Ueberschrift"><h1>Spieler bekannter Vereine</h1></div>
    53
    54  <div id="rechts"><img src="./Bilder/logo.JPG" alt="logo"></div>   //Kopfzeile
    55
    56  </div>
    57
    58  <div id="Abstand"></div>
    59
    60  <div id="Seitenlayout">
    61
    62  <div id="Menu">
    63  <h2> Verein </h2>
    64
    65  <ul>
    66
    67  <li><a href="?id=münchen">München</a></li>
    68  <li><a href="?id=dortmund">Dortmund</a></li>
    69  <li><a href="?id=frankfurt">Frankfurt</a></li>
    70  <li><a href="?id=stuttgart">Stuttgart</a></li>
    71  <li><a href="?id=bremem">Bremen</a></li>
    72
    73  </ul>
    74
    75  </div>
    76
    77  <div id="Inhalt">
    78  <p>Lorem ipsum</p>
    79
    80  <?php
    81
    82                  include('sqlconnection.php');
    83
    84                  if (isset($_GET['id'])) {
    85                          echo $_GET['id'];
    86                          session_unset();
    87                  }
    88
    89
    90                  if (isset($_SESSION['suche_nummer_aktiv']) && $_SESSION['suche_nummer_aktiv'] == true) {
    91
    92
    93                          $reihen = $conn->prepare("SELECT COUNT(*) AS anzahl FROM {$_SESSION['verein']} WHERE nummer = {$_SESSION['nummer']}");
    94                          $reihen->execute();
    95                          $reihenanzahl = $reihen->get_result();
    96                          $anzahl = $reihenanzahl->fetch_assoc()['anzahl'];
    97
    98
    99                          $seiten = berechneSeiten($anzahl);
   100
   101                          for($i=1; $i<=$seiten; $i++) {
   102                                  //echo "<a href=\"?seite=" . $i . "\">" . "Seite: " . $i . "</a>";
   103                                  echo "<a href=\"?id=" . $_SESSION['verein'] .  "&suche=" . $_SESSION['nummer'] . "&seite=" . $i . "\">" . $i . "</a>";
   104                          }
   105
   106
   107
   108                          if (!isset($_GET['seite'])) {
   109                                  echo "Seite nicht gesetzt";
   110                                  $_GET['seite'] = 1;
   111                          }
   112
   113                          if ($_GET['seite'] == 1) {
   114                                  $offset = 0;
   115                          } else {
   116                                  $offset = berechneOffset($_GET['seite']);
   117                          }
   118                          echo $_GET['seite'];
   119
   120                          echo $offset;
   121
   122
   123                          $abfrage = $conn->prepare("SELECT verein,position,nummer,tore,vorlagen,name FROM {$_SESSION['verein']} WHERE nummer = ? LIMIT 4 OFFSET $offset");
   124                          $abfrage->bind_param("i", $_SESSION['nummer']);
   125                          $abfrage->execute();
   126                          $abfrage->bind_result($result_verein, $result_pos, $result_nummer, $result_tore, $result_vorl, $result_name);
   127                          echo "<table id=\"Spielerliste\">";
   128                          echo "<tr>"."<th>Verein</th>"."<th>Position</th>"."<th>Nummer</th>"."<th>Tore</th>"."<th>Vorlagen</th>"."<th>Name</th></tr>";
   129                          while ($abfrage->fetch()) {
   130                                 
   131                                  echo "<tr><td>".$result_verein."</td>.<td>".$result_pos."</td><td><a href=\"?id=" . $_SESSION['verein'] . "&seite=" . $_GET['seite'] . "&nummer=" . $_SESSION['nummer'] . "\">" .$result_nummer. "</a></td><td>".$result_tore."</td><td>".$result_vorl."</td><td><a href=\"?id=" . $_SESSION['verein'] . "&seite=" . $_GET['seite'] . "&spieler=" . $result_name . "\">" . $result_name . "</a></td></tr>";
   132                          }
   133                          echo "</table>";
   134                          unset($_SESSION['suche_nummer_aktiv']);
   135
   136                  } elseif (isset($_SESSION['suche_spieler_aktiv']) && $_SESSION['suche_spieler_aktiv'] == true) {
   137                          $reihen = $conn->prepare("SELECT COUNT(*) AS anzahl FROM {$_SESSION['verein']} WHERE spieler = ?");
   138                          $reihen->bind_param("s", $_SESSION['autor']);
   139                          $reihen->execute();
   140                          $reihenanzahl = $reihen->get_result();
   141                          $anzahl = $reihenanzahl->fetch_assoc()['anzahl'];
   142
   143                          $seiten = berechneSeiten($anzahl);
   144
   145                          for($i=1; $i<=$seiten; $i++) {
   146                                  //echo "<a href=\"?seite=" . $i . "\">" . "Seite: " . $i . "</a>";
   147                                  echo "<a href=\"?id=" . $_SESSION['fach'] . "&seite=" . $i . "&autor=" . $_SESSION['autor'] . "\">" . $i . "</a>";
   148                          }
   149
   150                          if (!isset($_GET['seite'])) {
   151                                  $_GET['seite'] = 1;
   152                          }
   153
   154                          if ($_GET['seite'] == 1) {
   155                                  $offset = 0;
   156                          } else {
   157                                  $offset = berechneOffset($_GET['seite']);
   158                          }
   159
   160                          $abfrage = $conn->prepare("SELECT verein,position,nummer,tore,vorlagen,name from {$_SESSION['verein']} WHERE name = ? LIMIT 4 OFFSET $offset");
   161                          $abfrage->bind_param("s", $_SESSION['spieler']);
   162                          $abfrage->execute();
   163                          $abfrage->bind_result($result_verein, $result_pos, $result_nummer, $result_tore, $result_vorl, $result_name);
   164                          echo "<table id=\"Spielerliste\">";
   165                          echo "<tr>"."<th>Verein</th>"."<th>Position</th>"."<th>Nummer</th>"."<th>Tore</th>"."<th>Vorlagen</th>"."<th>Name></tr>";
   166                          while ($abfrage->fetch()) {
   167                                 
   168                                  echo "<tr><td>".$result_verein>.<td>".$result_pos/td><td><a href=\"?id=" . $_SESSION['verein']&seite=" . $_GET['seite'] . "&suche=" . $result_nummer . "\">" .$result_nummer. "</a></td><td>".$result_tore."</td><td>".$result_vorl."</td><td><a href=\"?id=" . $_SESSION['verein'] . "&seite=" . $_GET['seite'] . "&spieler=" . $result_name . "\">" . $result_name . "</a></td></tr>";
   169                          }
   170                          echo "</table>";
   171                          unset($_SESSION['suche_spieler_aktiv']);
   172
   173                  } else {
   174
   175
   176                  if (!isset($_GET['id'])) {
   177                          echo "Wähle einen Verein aus";
   178                  } else {
   179
   180
   181                 
   182                  $verein = $_GET['id'];
   183                  $_SESSION['verein'] = $_GET['id'];
   184
   185
   186
   187
   188                  if (!isset($_GET['seite'])) {                           // schauen, welche Seite gewählt wurde
   189                          $_GET['seite'] = 1;
   190                  }
   191
   192
   193                  if ($_GET['seite'] == 1) {
   194                          $offset = 0;
   195                  } else {
   196                          $offset = berechneOffset($_GET['seite']);
   197                  }
   198
   199                  //Offset berchnen für Datenbankabfrage
   200
 
Teil2:
PHP:
$datensaetze = $conn->prepare("SELECT COUNT(*) AS anzahl FROM $verein"); // Anzahl der Datensätze in Tabelle ermitteln
   203                  if (!$datensaetze) {
   204                          echo "SQL-Fehler: " . implode(" ", $conn->errorInfo());
   205
   206                  } else {
   207                          $datensaetze->execute();
   208                          $resultat = $datensaetze->get_result();
   209                          $erg = $resultat->fetch_assoc();
   210                          //echo "Es wurden " .$erg['anzahl']."Datensaetze gefunden";
   211                  }
   212
   213                  $sql = "SELECT * FROM $fach LIMIT 4 OFFSET $offset";                    // SQL-Query
   214                  $statement = $conn->query($sql);
   215
   216
   217                  if ($statement->num_rows >= 1) {                                        // Darstellung der Tabelle - Ergebnis als assoc-Array
   218                          echo "<table id=\"Spieleliste\">";
   219                          echo "<tr>"."<th>Verein</th>"."<th>Positiion</th>"."<th>Nummer</th>"."<th>Tore</th>"."<th>Vorlagen</th>"."<th>Name</th>" . "</tr>";
   220                          while ($resultat = $statement->fetch_assoc()) {
   221                                  echo "<tr><td>".$resultat['verein']."</td>.<td>".$resultat['position']."</td><td><a href=\"?id=" . $verein . "&seite=" . $_GET['seite'] . "&nummer=" . $resultat['nummer'] . "\">" .$resultat['nummer']. "</a></td><td>".$resultat['tore']."</td><td>".$resultat['vorlagen']."</td><td><a href=\"?id=" . $verein . "&seite=" . $_GET['seite'] . "&spieler=" . $resultat['name'] . "\">" . $resultat['name'] . "</a></td></tr>";
   222                          }
   223                          echo "</table>";
   224                  }
   225
   226
   227
   228
   229
   230                  $seitenanzahl = berechneSeiten($erg['anzahl']);
   231
   232                  for ($i=1; $i <=$seitenanzahl; $i++) {                  // seite mit ampersand - weiterer Parameter
   233                          echo "<a href=\"?id=" . $fach . "&seite=" . $i . "\">" . $i . "</a>";
   234                  }
   235
   236          }
   237
   238  }
   239
   240  function berechneSeiten($a) {
   241          $seiten = ceil($a / 4);
   242          return $seiten;
   243  }
   244
   245  function berechneOffset($b) {
   246          $offset = ($b - 1) * 4;
   247          return $offset;
   248  }
   249
   250  ?>
   251
   252  </div>
   253
   254  </div>
   255
   256  <p>Inhalt</p>
   257
   258  </body>
   259
   260  </html>
 
Warum liegt denn da Stroh rum? Soll heißen, warum sind denn da Zeilennummern?
Wie soll man das denn so in einen Editor pasten?
Ich mein', ich hab mir die Mühe gemacht, die per Perl-Skript wieder zu entfernen, und hab' dazu auch noch vernünftige Einrückungen gemacht, aber höflich ist das nicht gerade.
Und wo sind Zeilen Nr. 201, 202?

Und was soll der HTML-Code darin? Wie führt man das aus? Soll das auf einem Server laufen?
Sowas hab' ich nicht. Die Datei "design.css" sowie weitere Bilddateien hab' ich auch nicht.
Also, ich kann damit nichts anfangen, und meine auch, daß über 250 Zeilen Code drüberzuschauen, die auch noch "nur zum Testen und Üben" sind, ein bißchen viel verlangt für das Forum hier ist.
Sowas sollte man, wenn, dann mit einer konkreten Frage in einem PHP-Forum posten. Wobei das Problem auf maximal 20 Code-Zeilen eingegrenzt sein sollte. Und nicht, daß man den Leuten 250 Zeilen vor die Füße wirft und sagt, nun macht mal schön. So funktioniert das nicht.
 
Ok, verstehe ich. Ich entschuldige mich dafür. Ich werde mal den Code posten,wo das Problem ist. Ich habe halt mal das gesamte Skript gepostet, weil oft ja auch etwas, was viel später kommt, noch Auswirkungen haben könnte.

Aber nochmals Entschuldigung für mein Fehlverhalten. Ich werde versuchen, es in Zukunft besser zu machen.

Hier nochmal der spezielle Code.

PHP:
    if (isset($_SESSION['suche_nummer_aktiv']) && $_SESSION['suche_nummer_aktiv'] == true) {
    
    
                              $reihen = $conn->prepare("SELECT COUNT(*) AS anzahl FROM {$_SESSION['verein']} WHERE nummer = {$_SESSION['nummer']}");
                              $reihen->execute();
                              $reihenanzahl = $reihen->get_result();
                              $anzahl = $reihenanzahl->fetch_assoc()['anzahl'];
    
    
                              $seiten = berechneSeiten($anzahl);
  
                             for($i=1; $i<=$seiten; $i++) {
                                     //echo "<a href=\"?seite=" . $i . "\">" . "Seite: " . $i . "</a>";
                                     echo "<a href=\"?id=" . $_SESSION['verein'] .  "&suche=" . $_SESSION['nummer'] . "&seite=" . $i . "\">" . $i . "</a>";
                             }
  
  
  
                             if (!isset($_GET['seite'])) {
                                     echo "Seite nicht gesetzt";
                                     $_GET['seite'] = 1;
                             }
  
                             if ($_GET['seite'] == 1) {
                                     $offset = 0;
                             } else {
                                     $offset = berechneOffset($_GET['seite']);
                             }
                             echo $_GET['seite'];
  
                             echo $offset
  
                             $abfrage = $conn->prepare("SELECT verein,position,nummer,tore,vorlagen,name FROM {$_SESSION['verein']} WHERE nummer = ? LIMIT 4 OFFSET $offset");
                             $abfrage->bind_param("i", $_SESSION['nummer']);
                             $abfrage->execute();
                             $abfrage->bind_result($result_verein, $result_pos, $result_nummer, $result_tore, $result_vorl, $result_name);
                             echo "<table id=\"Spielerliste\">";
                             echo "<tr>"."<th>Verein</th>"."<th>Position</th>"."<th>Nummer</th>"."<th>Tore</th>"."<th>Vorlagen</th>"."<th>Name</th></tr>";
                             while ($abfrage->fetch()) {
                                    
                                     echo "<tr><td>".$result_verein."</td>.<td>".$result_pos."</td><td><a href=\"?id=" . $_SESSION['verein'] . "&seite=" . $_GET['seite'] . "&nummer=" . $_SESSION['nummer'] . "\">" .$result_nummer. "</a></td><td>".$result_tore."</td><td>".$result_vorl."</td><td><a href=\"?id=" . $_SESSION['verein'] . "&seite=" . $_GET['seite'] . "&spieler=" . $result_name . "\">" . $result_name . "</a></td></tr>";
                             }
                             echo "</table>";
                             unset($_SESSION['suche_nummer_aktiv']);

aber ich meine das gehört dazu, weil, wie gesagt, der link meine Ansicht nach nicht richtig übergeben wird
PHP:
if (isset($_GET['_nummer'])) {
          $_SESSION['sort_nummer_aktiv'] = true;
          $_SESSION['nummer'] = $_GET['nummer'];
    
    
           header('Location: index4.php');
           exit;
           }
Hoffe, das ist nicht wieder zu lang. Wenn ja, dann tut es mir leid, aber wüsste nicht, was ich noch mehr weglassen könnte.
 

susejunky

Moderator
Teammitglied
Hallo @munchkinnlade ,

... weil oft ja auch etwas, was viel später kommt, noch Auswirkungen haben könnte.
Das ist durchaus richtig!

Ich an Deiner Stelle wäre wie folgt vorgegangen:
  1. Damit das Skript für Dritte verständlicher wird, hätte ich erläuternde Kommentare eingebaut und auch einen "Vorspann", der kurz erläutert, was das Skript leisten soll. Diese Vorgehen hat auch den Vorteil, dass ich - wenn ich das Skript in 12 Monaten anpassen, erweitern, ... will - mich auch wieder schnell in den Skriptablauf einfinden kann.

  2. Wenn ich schon einen bestimmten Code-Bereich im Verdacht hätte, würde ich auch nur diesen zeigen und genau erläutern, was ich damit erreichen will und was aber statt dessen geschieht.

  3. Damit jeder die Möglichkeit hat mein Problem genauer zu analysieren, hätte ich den Quellcode als Anhang beigefügt.

Viele Grüße

susejunky
 
Danke erstmal für die Rückmeldung. @susejunky : so wie du es beschrieben hast, habe ich (versucht) es zumachen.

Also bei mir läuft das ganze (lokal) auf einem apache2-Webserver auf einem raspberry pi. Die sqlconnection.php stellt lediglich per mysqli die Verbindung zu einer maria-db Datenbank her.
 
Wenn ich deine Frage richtig verstehe, hast du ein Problem mit header('Location: index4.php');!?

Dazu ist anzumerken, dass PHP einen Fehler erzeugt, wenn vor dem Aufruf von header() irgendeine Ausgabe an den Browser gesendet wird. Da reicht schon ein Leerzeichen oder auch Editor abhängig ein "BOM" (https://de.wikipedia.org/wiki/Byte_Order_Mark) aus. Du solltest die (Daten-)Verarbeitung und Ausgabe klar trennen.

Was gibt denn das ERRor_reporting aus? Und entferne das ob_start() aus dem Script.
 
Daserror_reporting gibt nichts aus, denn es wird halt einfach nur nicht umgeblättert, wenn eines der sortierungsprogramme angewählt wurde.
Meiner Meinung nach hängt es irgendwie mit dem header-Befehl zusammen, aber mir fehlt die Erfahrung um zu erkennen, was genau da nicht passt.

Das ob_start() kann ich nicht weglassen, sonst gibt das error_reporting folgenden Fehler aus:
PHP:
Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/index3.php:5) in /var/www/html/index4.php on line 17
 
Das ob_start() kann ich nicht weglassen, sonst gibt das error_reporting folgenden Fehler aus:
PHP:
Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/index3.php:5) in /var/www/html/index4.php on line 17
Du kannst keinen Fehler bereinigen, indem du die Fehlerausgabe unterdrückst. ob_start() öffnet lediglich den Ausgabe-Buffer, indem dann die Fehlermeldung zwischengespeichert wird und da du den Ausgabe-Buffer nicht ausliest, wird dir die Warnung nicht mehr angezeigt.

Die header()-Funktion ist äußerst sensibel, wenn es um Ausgaben an den Browser geht. Die Fehlerstelle wird ja in der Warnung angezeigt: /var/www/html/index4.php on line 17. (siehe auch PHP: header - Manual ). Dein Script läuft quasi in einer Art "Endlosschleife". Es wird einmal durchlaufen, wonach es beim zweiten Durchlauf - weiter Blättern erneut auf den header-Aufruf trifft, wodurch der Fehler ausgelöst und die Scriptverarbeitung abgebrochen wird.

Im Grunde ist für deine Zielstellung die header-Funktion gar nicht erforderlich. Durch klare Aufteilung des Scripts in "Input-Verarbeitung-Ausgabe" i.R. in separate Dateien kommst du sicherer ans Ziel. Sieh dir hierzu auch einmal die Doku zu include und require im Handbuch an.
 
Ok, dann danke ich dir erstmal herzlich für deine hilfreiche Antwort und arbeite mich mal ein. Dank Session wird sich die Sortierfunktionen ja sicher in andere Dateien auslagern lassen.
 
Oben