Rolf B: PHP: Variablen nehmen falsche Werte an

Beitrag lesen

Hallo Yadgar,

folgende Hinweise hätte ich zu deinem Code:

  • nach DB-Abfragen muss man zwingend überprüfen, ob die API-Methoden einen Fehler gemeldet haben

  • es ist kompakter und meiner Meinung nach besser lesbar, <?= ... ?> statt <?php echo ...; ?> zu verwenden

  • Ein Webserver weiß (ohne besondere Maßnahmen) nichts über frühere Requests, insbesondere merkt sich ein PHP Script nicht die Werte von Variablen aus früheren Seitenabrufen. Deswegen enthält deine $offset Variable den Wert vom letzten Seitenabruf nicht mehr.

  • Aus diesem Grund ist es auch ungeschickt, einen Link so zu konstruieren, dass er relativ arbeitet. Den aktuellen Offset in einer Datei zu speichern ist grundfalsch. In der Session würde funktionieren, aber richtig ist es, die Links so zu erzeugen, dass der nächste Offset direkt vom Link übergeben wird. Also: erste 10: ?listpos=0, vorige 10: ?listpos=<?=$prev10 ?>, nächste 10: ?listpos=<?=$next10 ?>, letzte 10: ?listpos=<?=$last10?>

  • Da stehen Variablen $prevPage, $nextPage, $lastPage, und nicht einfach $offset-10, $offset+10 und $all-10. Grund 1: Die Seitengröße mag variieren. Grund 2: Du musst diese Werte basierend auf $offset und $all berechnen, aber du musst auch prüfen, ob die Werte plausibel sind. Es muss gelten: $prevPage >= 0, $lastPage >= 0 und $nextPage <= $lastPage. Beim Wert für $lastPage solltest Du ggf. auf den nächsten Zehner aufrunden. Hast Du bspw. 12 Einträge, möchtest Du die letzte Seite vermutlich ab Offset 10 anzeigen und nicht 2.

  • Beim Seitenaufruf darfst Du den in listPos übergebenen neuen $offset natürlich nicht blindlings verwenden, sondern musst sicherstellen, dass es ein Integer-Wert im Bereich 0 bis $all-1 ist.

  • die geposteten Werte für $liststart und $listend mit trim und htmlspecialchars zu behandeln ist sinnlos.

    • Das sind Eingabeparameter, die Werte werden nicht ausgegeben. htmlspecialchars braucht man nur zur Ausgabe.
    • Du erwartest hier Zahlen, und du rechnest sogar damit. Also konvertiere die Werte auch in Zahlen (mit intval). Sie vorher von Leerstellen zu befreien, ist nicht nötig. Du kannst sie, wenn Du magst, vorher mit einer Regex auf eine Ziffernfolge prüfen,
  • Beschäftige Dich mit Flexbox und Grid. Es ist weder geschickt noch Stand der Technik, die Zonen auf einer Seite mit position:absolute zu platzieren. Sowas gehört ohnehin nicht in ein style-Attribut, sondern ein einen <style> Abschnitt im <head>, bzw. in eine CSS Datei. Wenn Du die Seite nur für Dich brauchst und sie nicht auf einem Gerät mit kleinem Bildschirm darstellen willst, will ich nicht auf responsivem Layout herumreiten. Aber - sollte das mal kommen, ist es mit Grid VIEL einfacher machbar als mit absolut positionierten Brocken.

Rolf

--
sumpsi - posui - clusi