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

잔글 (봇: 자동으로 텍스트 교체 (-source +syntaxhighlight))
 
(같은 사용자의 중간 판 4개는 보이지 않습니다)
2번째 줄: 2번째 줄:
;PHP 게시판 페이징 구현
;PHP 게시판 페이징 구현
;PHP 페이지네이션 구현
;PHP 페이지네이션 구현
* 대략 [[다음 카페]] 스타일의 페이징 방식을 구현함
* 대략 [[다음 카페]] 스타일의 페이징 방식을 구현해보았다.
* <code>$LIST_SIZE</code> - 한 페이지에 출력될 게시물의 수
* <code>$LIST_SIZE</code> = 한 페이지에 출력될 게시물의 수
* 현재 페이지 번호가 가운데에 위치함
* 현재 페이지 번호가 가운데에 위치한다.
:<code>$MORE_PAGE</code> - 지정한 수만큼 페이지번호 링크를 양쪽으로 출력
:<code>$MORE_PAGE</code> = 지정한 수만큼 페이지번호 링크를 양쪽으로 출력한다.
:예를 들어 3이면 왼쪽으로 3개, 오른쪽으로 3개가 보임
:예를 들어 3이면 왼쪽으로 3개, 오른쪽으로 3개가 보인다.
* 그 바깥쪽으로 1페이지와 마지막 페이지 링크가 있음
* 그 바깥쪽으로 1페이지와 마지막 페이지 링크가 있다.
* 맨 바깥쪽에는 이전 페이지, 다음 페이지 링크가 있음
* 맨 바깥쪽에는 이전 페이지, 다음 페이지 링크가 있다.
* (보안) 사용자로부터 받는 page 변수는 [[intval()]]로 처리하여 [[SQL인젝션]] 방지
* (보안) 사용자로부터 받는 page 변수는 [[intval()]]로 처리하여 [[SQL인젝션]]을 방지하자.
   
   
<syntaxhighlight lang='php'>
<syntaxhighlight lang='php'>
48번째 줄: 48번째 줄:
<th>제목</th>
<th>제목</th>
</tr>
</tr>
<?php foreach( $rows as $row ): ?>
<?php foreach( $rows as $row ): ?>
<tr>
<tr>
<td><?= $row['id'] ?></td>
<td><?= $row['id'] ?></td>
<td><?= $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 class='move_btn' href="<?= "$PHP_SELP?page=$prev_page" ?>">« 이전</a>
<a class='move_btn' href="<?= "$PHP_SELP?page=$prev_page" ?>">« 이전</a>
<a class='pagenum' href="<?= "$PHP_SELP?page=1" ?>">1</a> ...
<a class='pagenum' href="<?= "$PHP_SELP?page=1" ?>">1</a> ...
<?php else: ?>
<?php else: ?>
<span class='move_btn disabled'>« 이전</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++ ): ?>
<a class='pagenum <?= ( $p == $page )?"current":"" ?>' href="<?= "$PHP_SELP?page=$p" ?>">
<a class='pagenum <?= ( $p == $page )?"current":"" ?>' href="<?= "$PHP_SELP?page=$p" ?>">
<?= $p ?>
<?= $p ?>
</a>
</a>
<?php endfor ?>
<?php endfor ?>


<?php if( $end_page < $page_count ): ?>
<?php if( $end_page < $page_count ): ?>
... <a class='pagenum' href="<?= "$PHP_SELP?page=$page_count" ?>"><?= $page_count ?></a>
... <a class='pagenum' href="<?= "$PHP_SELP?page=$page_count" ?>"><?= $page_count ?></a>
<a class='move_btn' href="<?= "$PHP_SELP?page=$next_page" ?>">다음 »</a>
<a class='move_btn' href="<?= "$PHP_SELP?page=$next_page" ?>">다음 »</a>
<?php else: ?>
<?php else: ?>
<span class='move_btn disabled'>다음 »</span>
<span class='move_btn disabled'>다음 »</span>
<?php endif ?>
<?php endif ?>
</div>
</div>
</syntaxhighlight>
</syntaxhighlight>
82번째 줄: 82번째 줄:
* [[페이지네이션]]
* [[페이지네이션]]
* [[그누보드 get_paging()]]
* [[그누보드 get_paging()]]
* [[MariaDB/MySQL 페이지네이션 쿼리]]


==참고==
==참고==

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 }}