Autor Zpráva
stitch123
Profil
Zdravím,

do školy máme za úkol napsat chatroom s registracemi. Většinu z toho už mám, ale momentálně se mi všechny příspěvky vypisují na domovské stránce, což asi není úplně nejlepší. Ideální by bylo, kdyby se příspěvky "stránkovaly" (nevím, jak to nazvat, ale určitě víte, co myslím), jenže to by asi bylo složitější.
Takže mně napadlo, že by se na domovské stránce ukazovalo jen posledních třeba 30 příspěvků a po kliknutí na odkaz by se otevřelo nový okno se všemi příspěvky.

Jedinej problém je, že nevím, jak vypsat jenom ten určitej počet příspěvků. Napadl mě cyklus for, ale nechápu, jak ho mám zakomponovat, aby to fungovalo.

Tady je screenshot stránky.

A tu je PHP část kódu:

<?php

  if (isset($_POST['msg'])) {

    $data = [
      "user_id" => $user['user_id'],
      "msg" => $_POST['msg'],
      "date" => Date("Y-m-d H:i:s")
    ];
    
    dibi::query("INSERT INTO dis_msg", $data);
    
  }

  $messages = dibi::query("SELECT * FROM dis_msg ORDER BY date DESC")->fetchAll();
  echo "<table>";
  foreach ($messages as $value) {
    $users = dibi::query("SELECT * FROM dis_users WHERE user_id = %i", $value["user_id"])->fetchAll()[0];
    echo '<tr><td><img src="'.$users["avatar"].'" alt="user avatar" height="40" width="40" /> <strong>'.$users["nickname"].
    ': </strong></td><td style="padding-right: 6px" valign="bottom">'.$value["msg"].' <span style="font-size: 10px">['.
    date("d. m. Y, H:i", strtotime($value["date"])).']</span></td>';
  }
  echo "</table>";
  
  ?>


Díky předem.
juriad
Profil
Ouha.
Stránkování se řeší pomocí klauzule LIMIT v SELECT dotazu:
SELECT * FROM dis_msg ORDER BY date DESC LIMIT 30
SELECT * FROM dis_msg ORDER BY date DESC LIMIT 30, 30

První dotaz vrátí 30 příspěvků a 0 přeskočí
Druhý dotaz vrátí také 30 příspěvků, ale prvních 30 přeskočí.


Je opravdu špatný nápad provádět druhý dotaz pro každý přispěvek. Informace o uživateli si můžeš vytáhnout rovnou:
SELECT * FROM dis_msg m JOIN dis_users u ON m.user_id = u.user_id ORDER BY m.date DESC LIMIT 30

Opraven dotaz. Změna spočívá v nedělitelné mezeře za JOIN a za ON.
stitch123
Profil
juriad:
S PHP teprve začínám, tak se omlouvám, jestli je ten kód moc nepřehlednej.

Limitování mě vůbec nenapadlo...

Druhej dotaz jsem zkusil uložit do proměnné users a přesunul ho mimo cyklus, pod první dotaz:
$users = dibi::query("SELECT * FROM dis_msg m JOIN dis_users u ON m.user_id = u.user_id ORDER BY m.date DESC LIMIT 30")->fetchAll()[0];

Teď to místo příspěvků vypisuje tuhle chybu:
Fatal error: Uncaught exception 'Dibi\DriverException' with message 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN dis_users u ON m.user_id = u.user_id ORDER BY m.date DESC LIMIT 30' at line 1' in /home/prijmeni.jmeno/public_html/dibi-3.0.7/src/Dibi/Drivers/MySqliDriver.php:179 Stack trace: #0 /home/prijmeni.jmeno/public_html/dibi-3.0.7/src/Dibi/Drivers/MySqliDriver.php(156): Dibi\Drivers\MySqliDriver::createException('You have an err...', 1064, 'SELECT * FROM d...') #1 /home/prijmeni.jmeno/public_html/dibi-3.0.7/src/Dibi/Connection.php(316): Dibi\Drivers\MySqliDriver->query('SELECT * FROM d...') #2 /home/prijmeni.jmeno/public_html/dibi-3.0.7/src/Dibi/Connection.php(234): Dibi\Connection->nativeQuery('SELECT * FROM d...') #3 /home/prijmeni.jmeno/public_html/dibi-3.0.7/src/Dibi/dibi.php(176): Dibi\Connection->query(Array) #4 /home/prijmeni.jmeno/public_html/SAPE/09_databaze/home.php(48): dibi::query('SELECT * FROM d...') #5 {m in /home/prijmeni.jmeno/public_html/dibi-3.0.7/src/Dibi/Drivers/MySqliDriver.php on line 179

Je možný že by Dibi knihovna neuměla joinovat?

Každopádně moc díky za odpověď!
juriad
Profil
stitch123:
Chybu jsem měl v dotazu já. dibi nikterak neomezuje to, co umí databáze.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: