본문 바로가기
개발 응용/PHP

PHP - 페이지 클래스(Pagination)

by 륀두 2020. 4. 28.
반응형

MySQL 데이터베이스에 저장되어 있는 데이터가 많아질 수록

웹에서 표시할때 페이지 처리가 필요하게 되었다.

구글에서 "php 페이지네이션" 으로 검색하고 참고한 소스코드는 다음과 같다.

<?php
#
# paging.php
# 페이징 테스트 파일
#
 
$connect = mysql_connect ( "localhost", "아이디", "패스워드" ) or die ("DB에 연결할 수 없습니다.");
$status = mysql_select_db("DB명", $connect) or die ("DB 사용 실패 : ".mysql_error($connect));
 
// 페이지 설정
$page_set = 10; // 한페이지 줄수
$block_set = 5; // 한페이지 블럭수
 
$query = "SELECT count(no) as total FROM board";
$result = mysql_query($query, $connect) or die ("쿼리 에러 : ".mysql_error($connect));
$row = mysql_fetch_array($result);
 
$total = $row[total]; // 전체글수
 
$total_page = ceil ($total / $page_set); // 총페이지수(올림함수)
$total_block = ceil ($total_page / $block_set); // 총블럭수(올림함수)
 
if (!$page) $page = 1; // 현재페이지(넘어온값)
$block = ceil ($page / $block_set); // 현재블럭(올림함수)
 
$limit_idx = ($page - 1) * $page_set; // limit시작위치
 
// 현재페이지 쿼리
$query = "SELECT no FROM board ORDER BY no DESC LIMIT $limit_idx, $page_set";
$result = mysql_query($query, $connect) or die ("쿼리 에러 : ".mysql_error($connect));
$rows = mysql_num_rows($result);
// 리스트 뿌리기
echo "<pre>";
while ($row = mysql_fetch_array($result)) {
echo $row[no]."\n";
}
echo "</pre>";
 
// 페이지번호 & 블럭 설정
$first_page = (($block - 1) * $block_set) + 1; // 첫번째 페이지번호
$last_page = min ($total_page, $block * $block_set); // 마지막 페이지번호
 
$prev_page = $page - 1; // 이전페이지
$next_page = $page + 1; // 다음페이지
 
$prev_block = $block - 1; // 이전블럭
$next_block = $block + 1; // 다음블럭
 
// 이전블럭을 블럭의 마지막으로 하려면...
$prev_block_page = $prev_block * $block_set; // 이전블럭 페이지번호
// 이전블럭을 블럭의 첫페이지로 하려면...
//$prev_block_page = $prev_block * $block_set - ($block_set - 1);
$next_block_page = $next_block * $block_set - ($block_set - 1); // 다음블럭 페이지번호
 
// 페이징 화면
echo ($prev_page > 0) ? "<a href='$PHP_SELF?page=$prev_page'>[prev]</a> " : "[prev] ";
echo ($prev_block > 0) ? "<a href='$PHP_SELF?page=$prev_block_page'>...</a> " : "... ";
 
for ($i=$first_page; $i<=$last_page; $i++) {
echo ($i != $page) ? "<a href='$PHP_SELF?page=$i'>$i</a> " : "<b>$i</b> ";
}
 
echo ($next_block <= $total_block) ? "<a href='$PHP_SELF?page=$next_block_page'>...</a> " : "... ";
echo ($next_page <= $total_page) ? "<a href='$PHP_SELF?page=$next_page'>[next]</a>" : "[next]";
 
?>
//[출처] http://www.joshi.co.kr/index.php?mid=board_EudV58&document_srl=293374

우선 MySQL 접속을 PDO로 사용하여 바꾸어 보았다.

try {
    $dbHost = "localhost";      // 호스트 주소(localhost, 120.0.0.1)
    $dbName = "dbname";      // 데이타 베이스(DataBase) 이름
    $dbUser = "id";          // DB 아이디
    $dbPass = "password";        // DB 패스워드

    // PDO 연결하기
    $db = new PDO("mysql:host={$dbHost};dbname={$dbName}", $dbUser, $dbPass); //mySQL conneting

} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

페이지에서 사용할 메소드들은 데이터베이스의 데이터를 쿼리를 작성하여 받아와야 하므로 class를 선언하기 전 MySQL접속정보를 삽입해주고 작성하였다.

try {
    $dbHost = "localhost";      // 호스트 주소
    $dbName = "dbname";      // 데이타 베이스(DataBase) 이름
    $dbUser = "id";          // DB 아이디
    $dbPass = "password";        // DB 패스워드

    // PDO 연결하기
    $db = new PDO("mysql:host={$dbHost};dbname={$dbName}", $dbUser, $dbPass); //mySQL conneting

} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

class Pagination {
  	
    //클래스 내부에서 하단 페이지넘버 처리에 필요한 변수
    private
    $page,
    $total_page,
    $first_page,
    $last_page,
    $prev_page,
    $next_page,
    $total_block,
    $next_block,
    $next_block_page,
    $prev_block,
    $prev_block_page,
    $PHP_SELF = "현재페이지 경로";
    //설정에서 register_globals=Off 인 경우에 $PHP_SELF 수퍼변수는 동작하지 않기때문에 경로를 지정해주는것이 좋다.
	
    //클래스 외부에서 필요한 변수
    public
    $limit_idx,
    $page_set;
      
    //페이지 줄수, 블럭수, 데이터베이스이름을 받아 데이터 정리
    public function __construct($pg, $bl, $dbName) {
        
        //외부 데이터베이스 접속정보 선언
        global $db;

        $this->page_set = $pg; // 한페이지 줄수
        $block_set = $bl; // 한페이지 블럭수
        $query = 'SELECT count(id) AS total FROM ' . $dbName;
 
        $stmt = $db->prepare($query);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        $total = $result['total']; // 전체글수
    
        $this->total_page = ceil($total / $this->page_set); // 총페이지수(올림함수)
        $this->total_block = ceil($this->total_page / $block_set); // 총블럭수(올림함수)
    
        $this->page = ($_GET['pg']) ? $_GET['pg'] : 1; //파라미터로 현재 페이지정보를 받아옴
        $block = ceil($this->page/$block_set); // 현재블럭(올림함수)
        $this->limit_idx = ($this->page - 1) * $this->page_set; // limit시작위치
    
        $this->first_page = (($block - 1) * $block_set) + 1; // 첫번째 페이지번호
        $this->last_page = min ($this->total_page, $block * $block_set); // 마지막 페이지번호
   
        $this->prev_page = $this->page - 1; // 이전페이지
        $this->next_page = $this->page + 1; // 다음페이지
    
        $this->prev_block = $block - 1; // 이전블럭
        $this->next_block = $block + 1; // 다음블럭
    
        // 이전블럭을 블럭의 마지막으로 하려면...
        $this->prev_block_page = $this->prev_block * $block_set; // 이전블럭 페이지번호    
    
        // 이전블럭을 블럭의 첫페이지로 하려면...
        //$prev_block_page = $prev_block * $block_set - ($block_set - 1);
    
        $this->next_block_page = $this->next_block * $block_set - ($block_set - 1); // 다음블럭 페이지번호
        
    }
    
    //하단 페이지 넘버링
    public function BottomPageNumber(){
      
        echo ($this->prev_page > 0) ? "<a href='$this->PHP_SELF&pg=$this->prev_page'>[prev]</a> " : "[prev] ";
        echo ($this->prev_block > 0) ? "<a href='$this->PHP_SELF&pg=$this->prev_block_page'>...</a> " : "... ";

        for ($i=$this->first_page; $i<=$this->last_page; $i++) {

            echo ($i != $this->page) ? "<a href='$this->PHP_SELF&pg=$i'>$i</a> " : "<b>$i</b> ";

        }

        echo ($this->next_block <= $this->total_block) ? "<a href='$this->PHP_SELF&pg=$this->next_block_page'>...</a> " : "... ";
        echo ($this->next_page <= $this->total_page) ? "<a href='$this->PHP_SELF&pg=$this->next_page'>[next]</a>" : "[next]";
                    
    }

}

BottomPageNumber() 부분은 편집하여 본인이 원하는 디자인으로 바꾸면 된다.

 

실제 페이지에서 사용한 예제는 다음과 같다.

// 한페이지 줄수, 한페이지 블럭수, 데이터베이스이름 설정
$pagination = new Pagination(10, 5, $dbName);

//데이터 로드
$query = 'SELECT * FROM ' . $dbName . ' ORDER BY no DESC LIMIT ' . $pagination->limit_idx . ', ' . $pagination->page_set;
$stmt = $db->prepare($query);
$stmt->execute();
$result = $stmt->fetchAll();

foreach ($result as $row) {
//데이터 출력
.....
}

//하단 페이지 넘버링
$pagination->BottomPageNumber();

echo로 출력하는 html 코드가 눈에 보이지 않아 간결하게 보인다.

 

아래는 실제 적용 화면이다. 임의의 데이타베이스를 접속하여 날짜를 출력해보았다.

반응형

'개발 응용 > PHP' 카테고리의 다른 글

PHP - 달력(Calander)  (0) 2020.05.07