PHP 개발에서 페이징은 매우 일반적인 요구 사항입니다. 많은 개발자가 Ceil () 함수를 사용하여 총 페이지 수를 계산합니다. 모든 데이터가 표시 될 수 있도록 소수점을 위로 올릴 수 있기 때문입니다. 그러나 여러 번 개발자는 일치 할 수없는 페이지 수와 같은 문제가 발생하거나 페이지 매김 결과가 비정상적입니다. 정확히 원인은 무엇입니까? 이 기사는 실제 코드 예제를 기반으로 CEIL () 함수를 사용한 후 Pagination 오류의 일반적인 이유를 자세히 분석하고 올바른 글쓰기 제안을 제공합니다.
Pagination에는 일반적으로 세 가지 핵심 매개 변수가 포함됩니다.
총 데이터 바의 총 수 $ TotalCount
페이지 당 표시된 문자 수 . $ pageize
총 페이지 $ 총 페이지
그 중 총 페이지 수의 계산은 일반적으로 다음과 같습니다.
$totalPages = ceil($totalCount / $pageSize);
이 공식은 매우 간단 해 보이지만 사용하는 동안 여전히 편차가 있습니다. 그 이유는 데이터 수집, 계산 로직 및 매개 변수 전송입니다.
페이지 매김의 기초는 정확한 총 문자 수입니다. $ totalcount가 SQL 쿼리를 통해 얻은 경우 : 예를 들어
$sql = "SELECT COUNT(*) FROM articles WHERE status = 1";
$result = $db->query($sql);
$totalCount = $result->fetchColumn();
조건이 잘못 기록되거나 필터링 조건이 누락 된 경우, $ TotalCount가 실제 데이터와 일치하지 않도록하여 총 페이지 수가 부정확하게 만들어지고 Pagination이 일치 할 수 없습니다.
$ pageize는 사용자 입력 또는 구성 파일에서 얻을 수 있습니다. 동적 변경 중에 동기화 조정이없는 경우 페이지 수는 편차에서 계산됩니다.
예를 들어:
$pageSize = $_GET['pageSize'] ?? 10;
프론트 엔드가 다른 페이지 크기를 전달하지만 배경이 여전히 총 페이지 수를 계산할 때 기존 값을 사용하는 경우 페이징에서 불일치가 발생합니다.
$ pagesize 가 0이거나 올바른 정수 값이 설정되지 않으면 Ceil () 함수에 오류가 발생합니다.
$totalPages = ceil($totalCount / $pageSize); // $pageSize~을 위한0오류 가보고됩니다
$ pageize 의 타당성 검증이 필요합니다.
$pageSize = max(1, (int)$pageSize);
사용자가 페이지 번호가 총 페이지 수보다 클 것을 요청하면 페이징 결과는 비정상적입니다. 경계 감지를 수행해야합니다.
$currentPage = (int)($_GET['page'] ?? 1);
$currentPage = max(1, min($currentPage, $totalPages));
다음은 전형적인 페이지 매김 데모이며 위의 문제와 함께 피하기 위해 하나씩입니다.
<?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); // 최소한 하나의 페이지가 있어야합니다
// 현재 페이지 경계 감지
$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 ()을 사용하기 전에 0이 아닌 정수 검증을 수행해야합니다.
현재 페이지 번호는 불법 페이지 번호를 요청하여 발생하는 페이징 장애를 피하기 위해 합리적인 범위 제약 조건을 받아야합니다.
페이징 링크 도메인 이름은 교차 환경 테스트 및 통합 액세스를 용이하게하기 위해 M66.net을 균일하게 사용하는 것이 좋습니다.
페이징 논리를 올바르게 이해하고 사용하면 페이징 기능이 안정적이고 기대에 부응 할 수있어 Ceil () 사용으로 인한 페이징 문제를 피할 수 있습니다.