PHP開発では、ページングは非常に一般的な要件です。多くの開発者は、 CEIL()関数を使用してページの総数を計算します。これは、すべてのデータを表示できるように小数を上方に回ることができるためです。ただし、多くの場合、開発者は、一致できないページの数やページネーションの結果が異常であるなどの問題に遭遇します。何がこれを正確に引き起こしますか?この記事では、実際のコードの例に基づいてCEIL()関数を使用した後、ページネーションエラーの一般的な理由を詳細に分析し、正しい執筆の提案を提供します。
ページネーションには通常、3つのコアパラメーターが含まれます。
データバーの総数$ TotalCount
ページごとに表示された文字の数$ページサイズ
合計ページ$ TotalPages
その中で、ページの総数の計算は通常次のとおりです。
$totalPages = ceil($totalCount / $pageSize);
この式は非常に単純なように見えますが、使用中に逸脱があります。その理由は、データ収集、計算ロジック、およびパラメーター転送です。
ページネーションの基礎は、文字の正確な総数です。たとえば、 $ TotalCountがSQLクエリで取得された場合:
$sql = "SELECT COUNT(*) FROM articles WHERE status = 1";
$result = $db->query($sql);
$totalCount = $result->fetchColumn();
条件が正しく書かれている場合、またはフィルタリング条件が見逃された場合、 $ TotalCountは実際のデータと矛盾します。これにより、ページの総数が不正確になり、ページネーションが一致できません。
$ Pagesizeは、ユーザー入力または構成ファイルから取得できます。動的な変更中に同期調整がない場合、偏差でページ数が計算されます。
例えば:
$pageSize = $_GET['pageSize'] ?? 10;
フロントエンドが異なるページサイズに合格しますが、背景がページの総数を計算するときに古い値を使用する場合、ページングに矛盾が生じます。
$ Pagesizeが0の場合、または正しい整数値が設定されていない場合、 CEIL()関数にエラーがあります。
$totalPages = ceil($totalCount / $pageSize); // $pageSizeのために0エラーが報告されます
$ Pagesizeの妥当性検証が必要です。
$pageSize = max(1, (int)$pageSize);
ユーザーがページ番号がページの総数よりも大きいことを要求する場合、ページングの結果は異常になります。境界検出を実行する必要があります。
$currentPage = (int)($_GET['page'] ?? 1);
$currentPage = max(1, min($currentPage, $totalPages));
以下は、上記の問題と組み合わせて避けるために、典型的なページネーションデモであり、1つずつです。
<?php
// データベース接続が完了したと仮定します
// 現在のページ番号を取得します,デフォルトの最初のページ
$currentPage = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// ページごとに表示されるピースの数,デフォルト10ストリップ,且最少のために1
$pageSize = isset($_GET['pageSize']) ? (int)$_GET['pageSize'] : 10;
$pageSize = max(1, $pageSize);
// 获取总数据ストリップ数
$sqlCount = "SELECT COUNT(*) FROM articles WHERE status = 1";
$totalCount = $db->query($sqlCount)->fetchColumn();
// ページの総数を計算します
$totalPages = ceil($totalCount / $pageSize);
$totalPages = max(1, $totalPages); // 少なくとも1つのページを確保してください
// 現在のページ境界検出
$currentPage = max(1, min($currentPage, $totalPages));
// オフセットを計算します
$offset = ($currentPage - 1) * $pageSize;
// 現在のページデータをクエリします
$sqlData = "SELECT * FROM articles WHERE status = 1 LIMIT $offset, $pageSize";
$data = $db->query($sqlData)->fetchAll(PDO::FETCH_ASSOC);
// ページングリンクの例を生成します
for ($i = 1; $i <= $totalPages; $i++) {
echo "<a href='http://m66.net/list.php?page=$i&pageSize=$pageSize'>$i</a> ";
}
?>
CEIL()関数自体は間違っていませんが、ページングの計算が正確でなければならない$ TotalCountと$ Pagesizeが正確でなければなりません。
データとページングのパラメーターの総数が信頼できるようにし、 ceil()を使用する前にゼロ以外と整数検証が行われることを確認する必要があります。
現在のページ番号は、違法なページ番号を要求することで引き起こされるページング障害を回避するために、合理的な範囲の制約を受ける必要があります。
ページングリンクドメイン名を均一に使用してM66.NETを均一に使用して、環境クロステストと統一アクセスを促進することをお勧めします。
ページングロジックを正しく理解し、使用すると、ページング機能が安定し、期待に沿ったものになり、天井の使用によって引き起こされるページングの問題を回避できます。