# Seitensystem mit php und js



## Cury (9. Jun 2020)

Hey,
Ich bin garde dabei ein Seitensystem in einem Forum zu machen und habe grade ein paar Probleme.



```
include_once '../db_connect.php';
include_once '../config.php';


$posts = "";
$page = 21; //ja ist grade hardcode...ist nur aus Testzecken so

function getAmountofPosts($mysqli){
  $stmt = $mysqli->prepare("SELECT id FROM posts Limit 1 ORDER BY id DESC");
  $stmt->execute();

  $result = $stmt->get_result();

  while ($row = $result->fetch_assoc()) {
    $posts = $row['id'];
  }
}


function getAmountofPages($mysqli) {
  if((getAmountofPosts($mysqli) / 20) % 0) {
    $page = getAmountofPosts($mysqli) / 20;
  }else {
    $page = (getAmountofPosts($mysqli) / 20) + 1;
  }

  return $page;

}

echo getAmountofPages($mysqli);
```


Reslutat:


*Fatal error*:  Uncaught Error: Call to a member function execute() on bool in C:\xampp\htdocs\CoasterMC\include\Forum\Seitensystem.php:14 Stack trace: #0 C:\xampp\htdocs\CoasterMC\include\Forum\Seitensystem.php(25): getAmountofPosts(Object(mysqli)) #1 C:\xampp\htdocs\CoasterMC\include\Forum\Seitensystem.php(43): getAmountofPages(Object(mysqli)) #2 {main}  thrown in *C:\xampp\htdocs\CoasterMC\include\Forum\Seitensystem.php* on line *14* 

Ich frage mich nur warum. Und ob ich in meiner getAmountofPages einen Loginfehler habe.

Danke im vorraus. 
LG


----------



## mihe7 (9. Jun 2020)

Cury hat gesagt.:


> Ich frage mich nur warum. Und ob ich in meiner getAmountofPages einen Loginfehler habe.


Die prepare-Methode liefert im Fall eines Fehlers FALSE. Probier es mal so

```
if ($stmt = $mysqli->prepare("SELECT id FROM posts Limit 1 ORDER BY id DESC")) {
    $stmt->execute();
    ...
}
```

Dann sollte die Funktion auch etwas zurückgeben (return fehlt).

In getAmountOfPages ist "% 0" eine ganz schlechte Idee, da das Ergebnis einer Division durch 0 bekanntermaßen nicht definiert ist.


----------



## Cury (9. Jun 2020)

Ja. Stimmt. Wenn ich die If abfrage drum mache. Wird immer mein echo ausgegeben. Aber wie kann ich es fixen. Und das gleiche beim Modulo operatoer. Wie sollte ich es da machen?



```
function getAmountofPosts($mysqli){


  if ($stmt = $mysqli->prepare("SELECT id FROM posts Limit 1 ORDER BY id DESC")) {
      $stmt->execute();
      $result = $stmt->get_result();

      while ($row = $result->fetch_assoc()) {
        $posts = $row['id'];
      }

    return $posts;
  }else {
    echo "Das wird immer ausgegeben, da es oben einen Fehler gibt :(";
  }
}
```


----------



## Cury (9. Jun 2020)

Achso...das Limit muss ans Ende...
🙄

Aber immer noch das Problem mit dem Modulo operator da


----------



## mihe7 (9. Jun 2020)

Cury hat gesagt.:


> Achso...das Limit muss ans Ende...
> 🙄
> 
> Aber immer noch das Problem mit dem Modulo operator da


Du willst die Zahl der Seiten haben? Das ist einfach `return intdiv(getAmountofPosts($mysqli) + itemsPerPage - 1, itemsPerPage);`


----------



## Cury (10. Jun 2020)

Genau. Ich möchte die Anzahl der Seiten bekommen. Ich habe die Zahl der Posts, z.B 59. Ich möchte, dass auf jeder Seite 20 Posts angezeigt werden. Also müsste ich eine Rechung haben, bei der am Ende 3 herrauskommt. Also 20, 20 19.


----------



## mihe7 (10. Jun 2020)

Dann solltest Du die genannte Formel verwenden können. Wenn itemsPerPage 20 ist und getAmountofPosts 59 liefert, dann ist 59+20-1=78 und 78/20=3, bei ganzzahliger Division. Bei 60 ergibt es immer noch 3 (79/20) und bei 61 hast Du dann 4 Seiten.


----------



## Cury (10. Jun 2020)

dann muss ich aber auch noch die round() funktion benutzen oder? Ich will ja keine Dezimal Zahl haben


----------



## Cury (10. Jun 2020)

Ich muss auch meine Datenbank abfrage veränder. Es sollen einmal nur die Posts aus einem bestimmten Forum geladen werden. Außerdem kann ich nicht einfach die Tabelle umdrehen und dann die oberste id nehemen, da man auch posts löschen kann. Dann ist die Oberste id vieleicht 46, aber es gibt nur 22 Posts, da der rest gelöscht wurde. Ich muss das also verändern. z.B. mit der count funktion oder?


----------



## mihe7 (10. Jun 2020)

Cury hat gesagt.:


> dann muss ich aber auch noch die round() funktion benutzen oder? Ich will ja keine Dezimal Zahl haben


Darum intdiv  



Cury hat gesagt.:


> Ich muss auch meine Datenbank abfrage veränder. Es sollen einmal nur die Posts aus einem bestimmten Forum geladen werden. Außerdem kann ich nicht einfach die Tabelle umdrehen und dann die oberste id nehemen, da man auch posts löschen kann. Dann ist die Oberste id vieleicht 46, aber es gibt nur 22 Posts, da der rest gelöscht wurde. Ich muss das also verändern. z.B. mit der count funktion oder?


?!? 

SELECT * FROM posts ORDER BY id DESC LIMIT 20 OFFSET 20*3 

liefert Dir die max. 20 Posts (in absteigender ID-Reihenfolge) auf Seite 4.


----------



## kneitzel (10. Jun 2020)

Cury hat gesagt.:


> Dann ist die Oberste id vieleicht 46, aber es gibt nur 22 Posts, da der rest gelöscht wurde. Ich muss das also verändern. z.B. mit der count funktion oder?



Ja, hatte mich schon gewundert, dass Du einfach die oberste id nimmst.

Also einfach nur die WHERE Bedingung entsprechend setzen, kein LIMIT mehr und abgefragt wird COUNT(*)...


----------



## Cury (10. Jun 2020)

Ich möchte die offset methode nicht nutzen. Ich will die seek methode benutzen, da diese um einiges performanter ist


----------



## mihe7 (10. Jun 2020)

JustNobody hat gesagt.:


> Ja, hatte mich schon gewundert, dass Du einfach die oberste id nimmst.
> 
> Also einfach nur die WHERE Bedingung entsprechend setzen, kein LIMIT mehr und abgefragt wird COUNT(*)...


Kann mich mal wer aufklären, worum es geht?



Cury hat gesagt.:


> Ich möchte die offset methode nicht nutzen. Ich will die seek methode benutzen, da diese um einiges performanter ist


Das bleibt Dir überlassen, natürlich kannst Du dann nicht einfach zu beliebigen Seiten springen.


----------



## kneitzel (10. Jun 2020)

mihe7 hat gesagt.:


> Kann mich mal wer aufklären, worum es geht?



Nach meinem Verständnis will er die Gesamtzahl der zu berücksichtigenden Artikel in einem Forum ermitteln.

Einfach nur die höchste id zu nehmen ist nicht korrekt, wie der TE in #9 selbst festgestellt hat.


----------



## mihe7 (10. Jun 2020)

JustNobody hat gesagt.:


> Nach meinem Verständnis will er die Gesamtzahl der zu berücksichtigenden Artikel in einem Forum ermitteln.


Ach so...


----------



## mrBrown (10. Jun 2020)

Cury hat gesagt.:


> Ich möchte die offset methode nicht nutzen. Ich will die seek methode benutzen, da diese um einiges performanter ist


Pauschal ist das eher falsch.

Vor allem sind die beiden für unterschiedliche Anforderungen ausgelegt, einfach beliebig tauschen zwischen beiden klappt nicht. Insbesondere passen eine Paginierung und ein Seitenzählen wie du es machst nicht zu einer senk-methode.


----------



## Cury (11. Jun 2020)

@mrBrown Warum sollte ich in diesem Fall nicht die Seek Methode nicht benutzen?


----------



## mrBrown (11. Jun 2020)

Cury hat gesagt.:


> @mrBrown Warum sollte ich in diesem Fall nicht die Seek Methode nicht benutzen?


Du kannst natürlich schon die Seek-Methode nutzen, nur kannst du Seek und Offset nicht einfach mischen. Sie erfüllen nur beide andere Anforderungen und sind nicht einfach austauschbar.

Eine Paginierung mit "X Seiten gibt es, du bist auf Seite Y" ist hauptsächlich mit Offset sinnvoll. Die Seitenzahlen sind für jeden Nutzer identisch, egal was er sich grad anguckt, und er kann beliebig zu jeder Seite springen.

Wenn du die Seek-Methode nutzt, sind die Seitenzahlen und die Anzahl der Seiten für jeden Nutzer unterschiedlich und vor allem kann der Nutzer sie nicht sinnvoll nutzen, ein "Seite 17 öffnen" ist damit eben nicht umsetzbar, nur ein "zur nächsten Seite".


----------



## mihe7 (11. Jun 2020)

mrBrown hat gesagt.:


> Wenn du die Seek-Methode nutzt, sind die Seitenzahlen und die Anzahl der Seiten für jeden Nutzer unterschiedlich und vor allem kann der Nutzer sie nicht sinnvoll nutzen, ein "Seite 17 öffnen" ist damit eben nicht umsetzbar, nur ein "zur nächsten Seite".


"Mehr laden" - die wahrscheinlich am benutzer*un*freundlichsten eingesetzte Funktion, seit es das Web gibt.


----------

