Seitensystem mit php und js

Cury

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


PHP:
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

Top Contributor
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
PHP:
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

Aktives Mitglied
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?


PHP:
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

Aktives Mitglied
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

Top Contributor
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

Aktives Mitglied
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

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

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.
 
K

kneitzel

Gast
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

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

mihe7

Top Contributor
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?

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.
 

mrBrown

Super-Moderator
Mitarbeiter
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.
 

mrBrown

Super-Moderator
Mitarbeiter
@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

Top Contributor
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 benutzerunfreundlichsten eingesetzte Funktion, seit es das Web gibt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Seitensystem mit seek Methode Datenbankprogrammierung 2

Ähnliche Java Themen


Oben