728x90
먼저 https://getbootstrap.com/docs/4.6/components/pagination/ 사이트에서 기본적인 Paging 처리에 대한 예제를 살펴본다.
또는 https://www.w3schools.com/bootstrap4/bootstrap_pagination.asp 에서 Pagination 항목을 선택해서 봐도 된다.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap4 Pagination Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
</head>
<body>
<?php
/*
// bootstrap4 에서 px 에서 em 으로 변경
m : Margin, p : Padding
t : top, b : bottom, l : left, r : right,
x : x축 -> left , right, y : y축 -> top , bottom
0 : 0
1 : .25rem( font-size가 16px이면, 4px) 크기
2 : .5rem( font-size가 16px이면, 8px) 크기
3 : 1rem( font-size가 16px이면, 16px) 크기
4 : 1.5rem( font-size가 16px이면, 24px) 크기
5 : 3rem( font-size가 16px이면, 48px) 크기
auto : margin 자동 세팅
n : negative을 의미
n1 : -.25rem( font-size가 16px이면, -4px) 크기
n2 : -.5rem( font-size가 16px이면, -8px) 크기
n3 : -1rem( font-size가 16px이면, -16px) 크기
n4 : -1.5rem( font-size가 16px이면, -24px) 크기
n5 : -3rem( font-size가 16px이면, -48px) 크기
my- = it sets margin-left and margin-right at the same time on y axes
*/
?>
<div class="container mt-2">
<div id="paging" class="mt-2">
<ul class="pagination">
<li class="page-item"><a class="page-link" href="#">Previous</a></li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">Next</a></li>
</ul>
</div>
</div>
</body>
</html>
|
ul 태그의 pagination 클래스, li 태그의 page-item 클래스 등 페이징 처리를 위한 구조를 보고 PHP 코드로 변환 준비를 한다.
PHP 코드는 MySQL DB와 연동하여 전제 페이지 수, 현재 페이지 등의 정보를 고려하여 코드를 구현한다.
<?php
class bbsClass extends DBDataClass {
function PageLinkView($link_url, $totalcnt, $rowsPage, $curPage, $m) {
echo '<div id="paging">';
echo '<ul class="pagination">';
$Info = $this->PageList($totalcnt, $rowsPage, $curPage, '');
if ($Info['current_block'] > 2) {
echo "<li class='page-item'><a class='page-link' href='" . $link_url . "?p=1&$m'>◀</a></li> ";
}
if ($Info['current_block'] > 1) {
echo "<li class='page-item'><a class='page-link' href='" . $link_url . "?p=" . $Info['prev'] . "&$m'>◁</a></li> ";
}
foreach ($Info['current'] as $w) {
if ($curPage == $w) {
echo "<li class='act'><a class='page-link' href='" . $link_url . "?p=" . $w . "&$m'><span style='color:red;'>" . $w . "</span></a></li> ";
} else {
echo "<li class='page-item'><a class='page-link' href='" . $link_url . "?p=" . $w . "&$m'>" . $w . "</a></li> ";
}
}
if ($Info['current_block'] < ($Info['total_block'])) {
echo "<li class='page-item'><a class='page-link' href='" . $link_url . "?p=" . $Info['next'] . "&$m'>▷</a></li> ";
}
if ($Info['current_block'] < ($Info['total_block'] - 1)) {
echo "<li class='page-item'><a class='page-link' href='" . $link_url . "?p=" . $Info['totalPage'] . "&$m'>▶</a></li> ";
}
echo '</ul>';
echo '</div>';
}
// $curPage : 현재 페이지, $totalcnt : 총 게시물수
// $block_limit : 한 화면에 뿌려질 게시글 개수
function PageList($totalcnt,$rowsPage,$curPage,$block_limit) {
$block_limit = $block_limit ? $block_limit : 10; // 한 화면에 보여줄 개수 기본 10으로 설정
// 총 페이지수 구하기
$totalPage = ceil($totalcnt/$rowsPage);
if($totalPage == 0) {
++$totalPage;
}
$total_block = ceil($totalPage / $block_limit); //전체 블록 갯수
$curPage = $curPage ? $curPage : 1; // 현재 페이지
// 현재 블럭 : 화면에 표시될 페이지 리스트
$current_block=ceil($curPage/$block_limit);
// 현재 블럭에서 시작페이지
$fstPage = (((ceil($curPage/$block_limit)-1)*$block_limit)+1);
// 현재 블럭에서 마지막 페이지
$endPage = $fstPage + $block_limit -1;
if($totalPage < $endPage) {
$endPage = $totalPage;
}
// 시작 바로 전 페이지
$prev_page = $fstPage - 1;
// 마지막 다음 페이지
$next_page = $endPage + 1;
foreach(range($fstPage, $endPage) as $val) {
$row[] = $val;
}
// 배열로 결과를 돌려준다.
return array(
'total_block' => $total_block,
'current_block' => $current_block,
'totalPage' => $totalPage,
'fstPage' => $fstPage,
'endPage' => $endPage,
'prev' => $prev_page,
'next' => $next_page,
'current' => $row
);
}
//총페이지수
function getTotalPage($num,$rec){
return @intval(($num-1)/$rec)+1;
}
}//end class boardClass
|
아래 Class 는 PDO(PHP Data Object) 기반으로 구현한 코드이다.
Legacy PHP 기반의 Class 는 https://link2me.tistory.com/1112 를 참조하면 된다.
<?php
class DBDataClass {
protected $db; // 변수를 선언한 클래스와 상속받은 클래스에서 참조할 수 있다.
public function __construct() {
$this->dbConnect();
// construct 메소드는 객체가 생성(인스턴스화)될 때 자동으로 실행되는 특수한 메소드다.
}
private function dbConnect() {
require_once 'dbinfo.php';
try {
// MySQL PDO 객체 생성
$this->db = new PDO(_DSN, _DBUSER, _DBPASS);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
} catch(PDOException $ex) {
die("오류 : " . $ex->getMessage());
}
}
/*
$sql = "INSERT INTO users (name, surname, sex) VALUES (?,?,?)";
$stmt= $pdo->prepare($sql);
$stmt->execute(array($name, $surname, $sex));
*/
public function recur_quot($cnt) {
$R = array();
for ($i = 0; $i < $cnt; $i++) {
array_push($R, "?");
}
return implode(",", $R); // 배열을 문자열로
}
// 신규 자료 추가(ok)
function putDbInsert($table, $key, $params) {
try {
$this->db->beginTransaction();
$sql = "insert into " . $table . " (" . $key . ") values(" . $this->recur_quot(count($params)) . ")";
$stmt = $this->db->prepare($sql);
$status = $stmt->execute($params); // $params 는 배열 값
$this->db->commit();
return 1;
} catch (PDOException $pex) {
$this->db->rollBack();
echo "에러 : " . $pex->getMessage();
return 0;
}
}
function getDbUpdate($table, $set, $params, $where) {
$sql = "update " . $table . " set " . $set . ($where ? ' where ' . $where : '');
try {
$this->db->beginTransaction();
$stmt = $this->db->prepare($sql);
$status = $stmt->execute($params);
$this->db->commit();
return 1;
} catch (PDOException $pex) {
$this->db->rollBack();
echo "에러 : " . $pex->getMessage();
return 0;
}
}
public function getDbDelete($table, $where, $params) {
if ($this->isDataExisted($table, $where, $params)) {
try {
$this->db->beginTransaction();
$sql = "delete from " . $table . ($where ? ' where ' . $where : '');
$stmt = $this->db->prepare($sql);
$status = $stmt->execute($params);
if ($status) {// action 실행여부에 대한 결과이지 실제 데이터 삭제와는 무관하네.
$this->db->commit();
return 1; // 삭제 성공
} else {
return 0; // 삭제 실패
}
} catch (PDOException $pex) {
$this->db->rollBack();
echo "에러 : " . $pex->getMessage();
}
} else {
return 0; // 삭제할 데이터가 없음
}
}
// 삭제할 데이터의 존재 유무 파악
public function isDataExisted($table, $where, $params) {
$sql = 'select * from ' . $table . ($where ? ' where ' . $where : '');
$stmt = $this->db->prepare($sql);
$stmt->execute($params);
if ($row = $stmt->fetch()) {
return $row;
} else {
return false;
}
}
//SQL필터링
public function getSqlFilter($sql) {
//$sql = preg_replace("/[\;]+/","", $sql); // 공백은 제거 불가
return $sql;
}
// Simple function to handle PDO prepared statements
function sql($sql, $params) {
// $params : array 를 사용해야 한다.
$stmt = $this->db->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(); // foreach 문으로 결과 처리
}
// 검색조건에 일치하는 데이터 가져오기
public function putDbData($sql,$params, $returntype = '') {
// $params : array 를 사용해야 한다.
$stmt = $this->db->prepare($sql);
$stmt->execute($params);
if ($returntype == 1) {
return $stmt->fetch(PDO::FETCH_ASSOC);
} else {
return $stmt->fetch();
}
}
public function putDbArray($sql, $params) {
// $params : array 를 사용해야 한다.
$stmt = $this->db->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll(); //foreach 문과 연동하여 결과처리
}
public function putDbArrayALL($sql) {
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(); //foreach 문과 연동하여 결과처리
}
// 검색조건에 일치하는 데이터 가져오기
public function getDbData($table, $where, $column, $returntype = '') {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
if ($returntype == 1) {
return $stmt->fetch(PDO::FETCH_ASSOC);
} else {
return $stmt->fetch();
}
}
// 검색조건에 일치하는 데이터 가져오기
public function getDbDataAll($table, $where, $column) {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
// DB Query result 함수
function getDbresult($table,$where,$column) {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
// 검색조건에 일치하는 데이터 가져오기
public function fetchDbData($table, $where, $column, $returntype = '') {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
if ($returntype == 1) {
return $stmt->fetch();
} else {
return $stmt->fetchAll();
}
}
// table 결과 조회 용도
public function fetchDbArray($table, $where, $column, $orderby, $rowsPage, $curPage) {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '') . ($orderby ? ' order by ' . $orderby : '') . ($rowsPage ? ' limit ' . (($curPage - 1) * $rowsPage) . ', ' . $rowsPage : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
return $stmt->fetchAll(); //foreach 문과 연동하여 결과처리 하면 됨
}
// table 결과 조회 용도
public function getDbArray($table, $where, $column, $orderby, $rowsPage, $curPage) {
$sql = 'select ' . $column . ' from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '') . ($orderby ? ' order by ' . $orderby : '') . ($rowsPage ? ' limit ' . (($curPage - 1) * $rowsPage) . ', ' . $rowsPage : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
//return $stmt;
return $stmt->fetchAll(); //foreach 문과 연동하여 결과처리 하면 됨
}
// WhereArgs 조건에 일치하는 선택 DbData 가져오기(ok)
public function getDbDataFromIdx($table, $whereArgs, $idx) {
$sql = 'select * from ' . $table . ' where ' . $whereArgs . '=?';
$stmt = $this->db->prepare($sql);
$stmt->execute(array($idx));
return $stmt->fetch();
}
// DB 레코드 총 수(ok)
public function getDbRows($table, $where) {
$sql = 'select count(*) from ' . $table . ($where ? ' where ' . $this->getSqlFilter($where) : '');
$stmt = $this->db->prepare($sql);
$stmt->execute();
if ($row = $stmt->fetch()) {
return $row[0];
} else {
return false;
}
}
}
?>
|
<?php
define('_DBHOST','localhost');
//define('_DBHOST','192.168.1.240'); // PHP 서버와 DB서버가 분리된 경우
define('_DBNAME',''); // DB 명
define('_DBUSER',''); // DB 사용자
define('_DBPASS', ''); // DB 패스워드
define('_DBTYPE','mysql'); // 데이터베이스 종류
define('_DSN',_DBTYPE.':host='._DBHOST.';dbname='._DBNAME.';charset=utf8');
?>
|
728x90
'Web 프로그램 > 테이블, 게시판, 검색' 카테고리의 다른 글
PHP 위지윅 에디터 글쓰기 DB 저장 처리 (0) | 2023.06.28 |
---|---|
PHP 위지윅 에디터 글쓰기 기능 (0) | 2023.06.28 |
XSS(cross-site scripting) filtering function in PHP (0) | 2018.05.01 |
PHP 네이버 스마트에디터 연동 방법 (0) | 2018.04.15 |
PHP 검색어 함수 (0) | 2018.04.08 |