Je suis bloqué sur la partie où il faut afficher les messages sur plusieurs pages.
J'ai réussi à créer la pagination.
Par exemple si je veux 5 messages par page, je n'arrive pas à trouver la bonne requête avec LIMIT qui pourrait m'afficher les 5 messages en fonctions de la page où on a cliqué.
Merci pour ta réponse, j'ai bien réussi avec ce calcul, par contre j'ai un autre problème, par exemple si j'affiche 1 message par page, sur la page 1 on affiche bien 1 message et quand je passe une page ca rajoute 1 à chaque fois, ducoup page 10 j'ai 10 messages.
Normal que ça t'affiche 2 messages puis 3, etc. car en SQL la clause LIMIT c'est offset, limit ou limit est le nombre d'élement à prendre
Si je veux 3 élements à partir de la première ligne je ferai LIMIT 0, 3 et si je veux 3 élements à partir de la 5ième ligne je ferai LIMIT 4, 3
Voici ton code avec 2 3 petit changement lié à php 7 :
<?php
// id c'est pas vraiment le nom adequat
$reqCount = $bdd->query('SELECT COUNT(*) AS nb FROM minichat');
$nbMessage = $reqCount->fetch();
// closeCursor je le fais plus mais tu peux le
// mettre de ton côté si tu préfère
$messageByPage = 1;
// Il manque le ceil qui permet de traduire 4.5 en 5
// car tu aura 4 page pleine et une page à moitier complète
$nbMaxPage = ceil($nbMessage / $messageByPage);
// Nouveauté php 7 le ??
$page = intval($_GET['page'] ?? 1);
// Ajout des conditions pour pas aller vers une page inexistante
if ($page < 1) {
$page = 1;
}
if ($page > $nbMaxPage) {
$page = $nbMaxPage;
}
$offset = ($page - 1) * $messageByPage;
// Même si la c'est pas des données utilisateur
// je préfère quand même préparer les requêtes
// Petit point aussi la vrai version du LIMIT c'est
// LIMIT maxElementAPrendre OFFSET position de début
$reqMessages = $bdd->prepare('SELECT Pseudo, Message FROM minichat ORDER BY ID DESC LIMIT :messageByPage OFFSET :offset');
$reqMessages->bindValue(':messageByPage', $messageByPage, PDO::PARAM_INT);
$reqMessages->bindValue(':offset', $offset, PDO::PARAM_INT);
$reqMessages->execute();
// Enfin et ça c'est une préférence personel mais je préfère
foreach ($reqMessages as $message) {
?>
<p>
<strong><?= htmlspecialchars($message['Pseudo']) ?></strong> :
<?= htmlspecialchars($message['Message']); ?>
</p>
<?php
}
echo "Page : ";
for($i = 1; $i <= $nbMaxPage; $i++) {
?>
<a href="minichat.php?page=<?= $i ?>">
<?= $i ?>
</a>
<?php
}
Normal que ça t'affiche 2 messages puis 3, etc. car en SQL la clause LIMIT c'est offset, limit ou limit est le nombre d'élement à prendre
Si je veux 3 élements à partir de la première ligne je ferai LIMIT 0, 3 et si je veux 3 élements à partir de la 5ième ligne je ferai LIMIT 4, 3
Voici ton code avec 2 3 petit changement lié à php 7 :
<?php
// id c'est pas vraiment le nom adequat
$reqCount = $bdd->query('SELECT COUNT(*) AS nb FROM minichat');
$nbMessage = $reqCount->fetch();
// closeCursor je le fais plus mais tu peux le
// mettre de ton côté si tu préfère
$messageByPage = 1;
// Il manque le ceil qui permet de traduire 4.5 en 5
// car tu aura 4 page pleine et une page à moitier complète
$nbMaxPage = ceil($nbMessage / $messageByPage);
// Nouveauté php 7 le ??
$page = intval($_GET['page'] ?? 1);
// Ajout des conditions pour pas aller vers une page inexistante
if ($page < 1) {
$page = 1;
}
if ($page > $nbMaxPage) {
$page = $nbMaxPage;
}
$offset = ($page - 1) * $messageByPage;
// Même si la c'est pas des données utilisateur
// je préfère quand même préparer les requêtes
// Petit point aussi la vrai version du LIMIT c'est
// LIMIT maxElementAPrendre OFFSET position de début
$reqMessages = $bdd->prepare('SELECT Pseudo, Message FROM minichat ORDER BY ID DESC LIMIT :messageByPage OFFSET :offset');
$reqMessages->bindValue(':messageByPage', $messageByPage, PDO::PARAM_INT);
$reqMessages->bindValue(':offset', $offset, PDO::PARAM_INT);
$reqMessages->execute();
// Enfin et ça c'est une préférence personel mais je préfère
foreach ($reqMessages as $message) {
?>
<p>
<strong><?= htmlspecialchars($message['Pseudo']) ?></strong> :
<?= htmlspecialchars($message['Message']); ?>
</p>
<?php
}
echo "Page : ";
for($i = 1; $i <= $nbMaxPage; $i++) {
?>
<a href="minichat.php?page=<?= $i ?>">
<?= $i ?>
</a>
<?php
}
Salut,
Merci pour ta réponse, malheureusement le OFFSET ne passe pas dans la requête, j'ai vérifié avec un phpinfo et je suis bien en version 7. Une idée ?
Normal que ça t'affiche 2 messages puis 3, etc. car en SQL la clause LIMIT c'est offset, limit ou limit est le nombre d'élement à prendre
Si je veux 3 élements à partir de la première ligne je ferai LIMIT 0, 3 et si je veux 3 élements à partir de la 5ième ligne je ferai LIMIT 4, 3
Voici ton code avec 2 3 petit changement lié à php 7 :
<?php
// id c'est pas vraiment le nom adequat
$reqCount = $bdd->query('SELECT COUNT(*) AS nb FROM minichat');
$nbMessage = $reqCount->fetch();
// closeCursor je le fais plus mais tu peux le
// mettre de ton côté si tu préfère
$messageByPage = 1;
// Il manque le ceil qui permet de traduire 4.5 en 5
// car tu aura 4 page pleine et une page à moitier complète
$nbMaxPage = ceil($nbMessage / $messageByPage);
// Nouveauté php 7 le ??
$page = intval($_GET['page'] ?? 1);
// Ajout des conditions pour pas aller vers une page inexistante
if ($page < 1) {
$page = 1;
}
if ($page > $nbMaxPage) {
$page = $nbMaxPage;
}
$offset = ($page - 1) * $messageByPage;
// Même si la c'est pas des données utilisateur
// je préfère quand même préparer les requêtes
// Petit point aussi la vrai version du LIMIT c'est
// LIMIT maxElementAPrendre OFFSET position de début
$reqMessages = $bdd->prepare('SELECT Pseudo, Message FROM minichat ORDER BY ID DESC LIMIT :messageByPage OFFSET :offset');
$reqMessages->bindValue(':messageByPage', $messageByPage, PDO::PARAM_INT);
$reqMessages->bindValue(':offset', $offset, PDO::PARAM_INT);
$reqMessages->execute();
// Enfin et ça c'est une préférence personel mais je préfère
foreach ($reqMessages as $message) {
?>
<p>
<strong><?= htmlspecialchars($message['Pseudo']) ?></strong> :
<?= htmlspecialchars($message['Message']); ?>
</p>
<?php
}
echo "Page : ";
for($i = 1; $i <= $nbMaxPage; $i++) {
?>
<a href="minichat.php?page=<?= $i ?>">
<?= $i ?>
</a>
<?php
}
Salut,
Merci pour ta réponse, malheureusement le OFFSET ne passe pas dans la requête, j'ai vérifié avec un phpinfo et je suis bien en version 7. Une idée ?
Merci
Je me reprend, ça fonctionne bien, j'avais juste oublier de mettre les PDO::PARAM_INT dans les parametres des bindvalue.
Merci
Mini chat amélioré
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
N'oubliez pas d'activer les erreurs PDO.
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL