# Seitensystem mit seek Methode



## Cury (14. Jun 2020)

Hey,
Ich weiß nicht ob es unnötig ist noch ein neues Thema zu eröffnen, falls ja tut es mir leid.

So, jetzt einmal zu meinem Problem. Ich bin dabei ein Seitensystem mit php und sql zu erstellen. Um alle Daten performant zu laden, möche ich die Seek Methode nutzen.



```
$page = $_GET['page'];

//Ersten post aus der Datenbank laden
  $stmt = $mysqli->prepare("SELECT id FROM posts ORDER BY id LIMIT 1");
  $stmt->execute();

  $firstEntry = -1;

  $result = $stmt->get_result();
  if ($result->num_rows > 0) {
      while ($row = $result->fetch_assoc()) {
        $firstEntry = $row['id'];
      }
    }


  $firstEntry = (($page - 1) * 15) + $firstEntry;
  $firstEntry = $firstEntry-1;

  $stmt = $mysqli->prepare("SELECT posts.*, foren.id AS fid, foren.name AS fname, users.profilbild AS upb, users.username FROM posts
      LEFT JOIN foren ON posts.forum = foren.id
      LEFT JOIN users ON posts.von = users.username
      WHERE forum = ? AND posts.id > ? ORDER BY pinned DESC, datum DESC LIMIT 15");
  $stmt->bind_param('ii', $id, $firstEntry);
  $stmt->execute();
```

Ich möchte auf jeder Seite 15 Posts anzeigen lassen, die nach datum und pinned geordnet sind. 
Das Problem ist jetzt aber, dass manche Posts gar nicht angezeigt werden und mache werden auf Seite 1 und 2 angezeigt...

Ich hoffe, dass mir jemand helfen kann.
MFG Cury


----------



## kneitzel (14. Jun 2020)

Also das kann doch so nicht funktionieren:
a) Hast Du immer zuerst die pinned Datensätze. Das ist also direkt ein Problem.
b) Gehst Du wieder über die id. Aber Du hast doch im anderen Thread schon erkannt, dass es in den ids auch Lücken geben dürfte. Daher ist deine Kalkulation von wegen $firstentry + (($page-1) * 15) schlicht falsch.

Und damit danke für die perfekte Demonstration, dass diese tollen Optimierungen unsinnig und fehleranfällig sind. Dir wurde doch bereits eine Abfrage genannt, die dir erlauben, gezielt einzelne Seiten aufzurufen. Dein Versuch, alles zu optimieren, führten zu diesen Fehlern da Du alles schlicht verkomplizierst und so zu schwer wartbarem Code kommst.

Edit: Das mit a) ist nicht ganz korrekt. Du bekommst die pinned Datensätze immer auf der Seite zu oberst, auf denen diese auf Grund der id sind. Du filterst ja mit > $firstEntry. Pinned mit einer id kleiner, werden natürlich nicht angezeigt ...


----------



## mrBrown (14. Jun 2020)

Wie im anderen Thread auch schon angesprochen: seek und page-basiertes Suchen lassen sich nicht sinnvoll kombinieren 

Das ist Vergleichbar mit einen Taxiservice für Familien anzubieten und dann einen Ferrari kaufen, weil der schneller fährt. Das du die Performance gar nicht brauchst und das einfach nicht zu deinen Anforderungen passt, vergisst du dabei, weil du nur "schnell" hörst


----------

