La Pagination de l'utilisation de MySQL LIMITE, OFFSET
J'ai un code qui Limite les données à afficher seulement 4 articles par page. La colonne que j'utilise est d'environ 20 à 30 éléments, donc j'ai besoin de faire ces réparties à travers les pages.
Sur la première page, j'ai:
$result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4");
{
echo "<tr>";
echo "<td align='center'><img src=\"" . $row['picturepath'] . "\" /></td>";
echo "<td align='center'>" . $row['name'] . "</td> <td align='center'> <input type='button' value='More Info'; onclick=\"window.location='more_info.php?';\"> </td>";
echo "<td align='center'>" . $row['price'] . "</td> <td align='center'> <input type='button' value='Add to Order' onclick=''> </td>";
echo "</tr>";
}
echo "</table>";
mysqli_close($con);
?>
<table width="1024" align="center" >
<tr height="50"></tr>
<tr>
<td width="80%" align="right">
<a href="itempage2.php">NEXT</a>
</td>
<td width="20%" align="right">
<a href="">MAIN MENU</a>
</td>
</tr>
</table>
Vous remarquerez vers le bas de la page ma balise d'ancrage dans les listes de la deuxième page, "itempage2.php". Dans la page de l'article 2, j'ai le même code, à l'exception de mon instruction select listes de l'offset de 4.
$result = mysqli_query($con,"SELECT * FROM menuitem LIMIT 4 offset 4");
Cela fonctionne, de cette façon quand il y a un nombre prédéterminé d'éléments de ma base de données. Mais il n'est pas bon. J'ai besoin de créer une nouvelle page que si il y a plus d'éléments, pas codées en dur dans comme il est maintenant.
Comment puis-je créer plusieurs pages sans avoir à coder en dur chaque nouvelle page, et le décalage?
- À l'aide de $_GET dans la partie supérieure. Si pas de $_GET, le décalage est de 0. Limite pourrait être codé en dur comme un système de pagination (par ex. 10 articles par page)
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, de ne pas avoir un serveur distinct script pour chaque page, c'est juste de la folie. La plupart des applications en œuvre de la pagination, grâce à l'utilisation de la pagination paramètre dans l'URL. Quelque chose comme:
Vous pouvez accéder à la page demandée par l'
$_GET['page']
.Cela rend votre SQL formulation très facile:
Ainsi, par exemple, si l'entrée était ici
page=2
, avec 4 lignes par page, votre requête serait"De sorte que c'est le problème de base de la pagination. Maintenant, vous avez l'ajout de l'exigence que vous voulez comprendre, le nombre total de pages (de sorte que vous pouvez déterminer si "PAGE SUIVANTE" doit être affichée ou si vous voulez autoriser l'accès direct à une page via un lien).
Pour ce faire, vous devez comprendre le nombre de lignes dans la table.
Vous pouvez simplement le faire avec un DB d'appel avant d'essayer de renvoyer votre jeu d'enregistrements défini (je l'ai dit AVANT, puisque de toute évidence vous souhaitez valider que la page demandée n'existe).
C'est en fait assez simple:
mysqli_query
sans aucun impact sur le travail avec l'ensemble de résultats.$offset = (2 - 1) * 10
Qui vous laisse avec une valeur de 10, vous avez voulu le nombre de décalage pour votre requête.Utilisation
.. LIMIT :pageSize OFFSET :pageStart
Où
:pageStart
est lié à the_page_index (c'est à dire 0 pour la première page) * number_of_items_per_pages (par exemple 4) et:pageSize
est lié à number_of_items_per_pages.À détecter pour "a plus de pages", soit utiliser SQL_CALC_FOUND_ROWS ou de l'utilisation
.. LIMIT :pageSize OFFSET :pageStart + 1
et de détecter des manque une dernière (pageSize+1) enregistrement. Inutile de dire que, pour les pages avec un index > 0, il existe une page précédente.Si la page index de valeur est incorporée dans l'URL (par exemple, dans "prev page" et "page suivante" liens), alors il peut être obtenu par le
$_GET
élément.Si vous voulez le garder simple pour aller de l'avant et essayer cela.
Le reste est à vous.
Si vous avez de la suite à venir de deux tables, je vous suggère d'essayer une approche différente.
Une dizaine de pages n'est pas un gros problème lors de l'utilisation de
OFFSET
. Mais lorsque vous avez des centaines de pages, vous trouverez queOFFSET
est mauvais pour la performance. C'est parce que toutes les lignes ignorées doivent être lues à chaque fois.Il est préférable de rappelez-vous où vous l'avez laissée.