"PHP 게시판 페이지네이션 구현"의 두 판 사이의 차이

(새 문서: ==개요== ;PHP 페이징 구현 <source lang='php'> include 'pdo.php'; $page = ($_GET['page'])?$_GET['page']:1; $article_count = query_one("SELECT COUNT(*) FROM board1"); $list_si...)
 
 
(사용자 2명의 중간 판 25개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==개요==
==개요==
;PHP 페이징 구현
;PHP 게시판 페이징 구현
 
;PHP 페이지네이션 구현
<source lang='php'>
* 대략 [[다음 카페]] 스타일의 페이징 방식을 구현해보았다.
* <code>$LIST_SIZE</code> = 한 페이지에 출력될 게시물의 수
* 현재 페이지 번호가 가운데에 위치한다.
:<code>$MORE_PAGE</code> = 지정한 수만큼 페이지번호 링크를 양쪽으로 출력한다.
:예를 들어 3이면 왼쪽으로 3개, 오른쪽으로 3개가 보인다.
* 그 바깥쪽으로 1페이지와 마지막 페이지 링크가 있다.
* 맨 바깥쪽에는 이전 페이지, 다음 페이지 링크가 있다.
* (보안) 사용자로부터 받는 page 변수는 [[intval()]]로 처리하여 [[SQL인젝션]]을 방지하자.
<syntaxhighlight lang='php'>
<?php
include 'pdo.php';
include 'pdo.php';
$page = ($_GET['page'])?$_GET['page']:1;
$LIST_SIZE = 6;
 
$MORE_PAGE = 3;
$article_count = query_one("SELECT COUNT(*) FROM board1");
 
$list_size = 6;
$more_page = 3;
$page_count = ceil( $article_count / $list_size );


$start_page = $page - $more_page;
$page = $_GET['page'] ? intval($_GET['page']) : 1;
$end_page = $page + $more_page;
$page_count = query_one("SELECT CEIL( COUNT(*)/$LIST_SIZE ) FROM board1");
if( $start_page < 1 ) $start_page = 1;
if( $end_page > $page_count ) $end_page = $page_count;


$prev_page = $start_page - $more_page - 1;
$start_page = max($page - $MORE_PAGE, 1);
$next_page = $end_page + $more_page + 1;
$end_page = min($page + $MORE_PAGE, $page_count);
if( $prev_page < 1 ) $prev_page = 1;
$prev_page = max($start_page - $MORE_PAGE - 1, 1);
if( $next_page > $page_count ) $next_page = $page_count;
$next_page = min($end_page + $MORE_PAGE + 1, $page_count);


$s_point = $list_size * ( $page - 1 );
$offset = ( $page - 1 ) * $LIST_SIZE;
$rows = query_rows("SELECT * FROM board1 ORDER BY id DESC LIMIT $s_point, $list_size");
$rows = query_rows("SELECT * FROM board1 ORDER BY id DESC LIMIT $offset, $LIST_SIZE");
?>
?>
<style>
<style>
.btn {
a { text-decoration: none; }
display: inline-block;
.pagenum {
color: gray;
display: inline-block; width: 25px;
width: 25px;
border: 1px solid transparent;
    text-decoration: none;
color: gray; font-weight: bold;
border: 1px solid gray;
text-decoration: none; text-align: center;
border-color: transparent;
text-align: center;
font-weight: bold;
}
.btn:hover {
color: orange;
border: 1px solid orange;
}
.btn.current {
color: orange;
text-decoration: underline;
}
.paging_area {
text-align: center;
}
}
.pagenum:hover { color: orange; border: 1px solid orange; }
.pagenum.current { color: orange; text-decoration: underline; }
.move_btn { color: gray; }
.disabled { color: silver; }
.paging_area { text-align: center; }
</style>
</style>
<table>
<table>
<tr>
<tr>
<th>글번호</th>
<th>번호</th>
<th>제목</th>
<th>제목</th>
</tr>
</tr>
<?php foreach( $rows as $row ): ?>
<?php foreach( $rows as $row ): ?>
<tr>
<tr>
<td><?php echo $row['id']; ?></td>
<td><?= $row['id'] ?></td>
<td><?php echo $row['subject']; ?></td>
<td><?= $row['subject'] ?></td>
</tr>
</tr>
<?php endforeach ?>
<?php endforeach ?>
</table>
</table>
<div class='paging_area'>
<div class='paging_area'>
<?php if( $start_page > 1 ): ?>
<?php if( $start_page > 1 ): ?>
<a href="<?php echo "$PHP_SELP?page=$prev_page"; ?>">« 이전</a>
<a class='move_btn' href="<?= "$PHP_SELP?page=$prev_page" ?>">« 이전</a>
<a class='btn' href="<?php echo "$PHP_SELP?page=1"; ?>">1</a> ...
<a class='pagenum' href="<?= "$PHP_SELP?page=1" ?>">1</a> ...
<?php else: ?>
<?php else: ?>
<span>« 이전</span>
<span class='move_btn disabled'>« 이전</span>
<?php endif ?>
<?php endif ?>


<?php for ($p=$start_page; $p<=$end_page; $p++): ?>
<?php for( $p = $start_page; $p <= $end_page; $p++ ): ?>
<?php if( $p == $page ): ?>
<a class='pagenum <?= ( $p == $page )?"current":"" ?>' href="<?= "$PHP_SELP?page=$p" ?>">
<a class='btn current' href="<?php echo "$PHP_SELP?page=".$p; ?>"><?php echo $p; ?></a>
<?= $p ?>
<?php else: ?>
</a>
<a class='btn' href="<?php echo "$PHP_SELP?page=".$p; ?>"><?php echo $p; ?></a>
<?php endif ?>
<?php endfor ?>
<?php endfor ?>


<?php if( $end_page < $page_count ): ?>
<?php if( $end_page < $page_count ): ?>
... <a class='btn' href="<?php echo "$PHP_SELP?page=$page_count"; ?>"><?php echo $page_count; ?></a>
... <a class='pagenum' href="<?= "$PHP_SELP?page=$page_count" ?>"><?= $page_count ?></a>
<a href="<?php echo "$PHP_SELP?page=$next_page"; ?>">다음 »</a>
<a class='move_btn' href="<?= "$PHP_SELP?page=$next_page" ?>">다음 »</a>
<?php else: ?>
<?php else: ?>
<span>다음 »</span>
<span class='move_btn disabled'>다음 »</span>
<?php endif ?>
<?php endif ?>
</div>
</div>
</source>
</syntaxhighlight>


==같이 보기==
==같이 보기==
*[[페이지네이션]]
* [[페이지네이션]]
* [[그누보드 get_paging()]]
* [[MariaDB/MySQL 페이지네이션 쿼리]]
 
==참고==
* http://moonlit0130.tistory.com/20


[[분류: PHP]]
[[분류: PHP]]
[[분류: 게시판]]

2021년 8월 21일 (토) 20:18 기준 최신판

1 개요[ | ]

PHP 게시판 페이징 구현
PHP 페이지네이션 구현
  • 대략 다음 카페 스타일의 페이징 방식을 구현해보았다.
  • $LIST_SIZE = 한 페이지에 출력될 게시물의 수
  • 현재 페이지 번호가 가운데에 위치한다.
$MORE_PAGE = 지정한 수만큼 페이지번호 링크를 양쪽으로 출력한다.
예를 들어 3이면 왼쪽으로 3개, 오른쪽으로 3개가 보인다.
  • 그 바깥쪽으로 1페이지와 마지막 페이지 링크가 있다.
  • 맨 바깥쪽에는 이전 페이지, 다음 페이지 링크가 있다.
  • (보안) 사용자로부터 받는 page 변수는 intval()로 처리하여 SQL인젝션을 방지하자.
<?php
include 'pdo.php';
$LIST_SIZE = 6;
$MORE_PAGE = 3;

$page = $_GET['page'] ? intval($_GET['page']) : 1;
$page_count = query_one("SELECT CEIL( COUNT(*)/$LIST_SIZE ) FROM board1");

$start_page = max($page - $MORE_PAGE, 1);
$end_page = min($page + $MORE_PAGE, $page_count);
$prev_page = max($start_page - $MORE_PAGE - 1, 1);
$next_page = min($end_page + $MORE_PAGE + 1, $page_count);

$offset = ( $page - 1 ) * $LIST_SIZE;
$rows = query_rows("SELECT * FROM board1 ORDER BY id DESC LIMIT $offset, $LIST_SIZE");
?>
<style>
a { text-decoration: none; }
.pagenum {
	display: inline-block; width: 25px;
	border: 1px solid transparent;
	color: gray; font-weight: bold;
	text-decoration: none; text-align: center;
}
.pagenum:hover { color: orange; border: 1px solid orange; }
.pagenum.current { color: orange; text-decoration: underline; }
.move_btn { color: gray; }
.disabled { color: silver; }
.paging_area { text-align: center; }
</style>

<table>
	<tr>
		<th>번호</th>
		<th>제목</th>
	</tr>
<?php foreach( $rows as $row ): ?>
	<tr>
		<td><?= $row['id'] ?></td>
		<td><?= $row['subject'] ?></td>
	</tr>
<?php endforeach ?>
</table>

<div class='paging_area'>
<?php if( $start_page > 1 ): ?>
	<a class='move_btn' href="<?= "$PHP_SELP?page=$prev_page" ?>">« 이전</a>
	<a class='pagenum' href="<?= "$PHP_SELP?page=1" ?>">1</a> ...
<?php else: ?>
	<span class='move_btn disabled'>« 이전</span>
<?php endif ?>

<?php for( $p = $start_page; $p <= $end_page; $p++ ): ?>
	<a class='pagenum <?= ( $p == $page )?"current":"" ?>' href="<?= "$PHP_SELP?page=$p" ?>">
		<?= $p ?>
	</a>
<?php endfor ?>

<?php if( $end_page < $page_count ): ?>
	... <a class='pagenum' href="<?= "$PHP_SELP?page=$page_count" ?>"><?= $page_count ?></a>
	<a class='move_btn' href="<?= "$PHP_SELP?page=$next_page" ?>">다음 »</a>
<?php else: ?>
	<span class='move_btn disabled'>다음 »</span>
<?php endif ?>
</div>

2 같이 보기[ | ]

3 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}