
PHP ๊ฐ์
>PHP - ์ค๊ธ
๐ PHP ์ค๊ธ - 3์ฃผ์ฐจ: ๊ฒ์ํ CRUD ๊ตฌํ (๊ธฐ๋ณธ) - 03 ํ์ด์ง ์ฒ๋ฆฌ
![]() |
ํ์ | 10.0 | ๋ผ์ด์ผ์ค | free |
---|---|---|---|---|
์ฌ์ฉ์ํ์ | 10.0 | ์ด์์ฒด์ | ||
๋ค์ด๋ก๋ | 1 | ํ์ผํฌ๊ธฐ | 0 | |
์ ์์ฌ | LUZENSOFT | ๋ฑ๋ก์ผ | 2025-07-23 08:20:33 | |
์กฐํ์ | 17 |
๐ PHP ์ค๊ธ - 3์ฃผ์ฐจ: ๊ฒ์ํ CRUD ๊ตฌํ (๊ธฐ๋ณธ) - 03 ํ์ด์ง ์ฒ๋ฆฌ
์๋ ํ์ธ์! ์ง๋ ์๊ฐ์ #PHP #๊ฒ์ํ์ #CRUD ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณด์์ฃ . ์ค๋์ #๊ธ ๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ํ์์ ์ธ #ํ์ด์ง_์ฒ๋ฆฌ(Pagination)๋ฅผ ์์ธํ ๋ค๋ค๋ณผ ๊ฑฐ์์. #ํ์ด์ง ์ฒ๋ฆฌ๋ #๋ฐ์ดํฐ๊ฐ ๋ง์ ๋ ์นํ์ด์ง์ #์ฑ๋ฅ์ ์ต์ ํํ๋ ์ค์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
1. ํ์ด์ง ์ฒ๋ฆฌ์ ํ์์ฑ
#๊ฒ์ํ์ #๊ธ์ด ์์ฒ, ์๋ง ๊ฐ ์์ธ๋ค๊ณ ์์ํด ๋ณด์ธ์. ๋ชจ๋ #๊ธ์ ํ ๋ฒ์ ๋ถ๋ฌ์์ ์นํ์ด์ง์ ํ์ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด์.
๋๋ฆฐ ๋ก๋ฉ ์๋: #๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ง์ #๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , #์นํ์ด์ง์ ๋ ๋๋งํ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค. ์ด๋ ์ฌ์ฉ์์๊ฒ ์ข์ง ์์ ๊ฒฝํ์ ์ค๋๋ค.
์๋ฒ ๋ถํ ์ฆ๊ฐ: ํ ๋ฒ์ ๋ชจ๋ #๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ผ #์๋ฒ์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ฌ์ฉ์ ๊ฒฝํ ์ ํ: ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ๋์์ด ๋ด๋ ค์ผ ํ๋ฏ๋ก ์ํ๋ #์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ์ด๋ ต๊ณ ๋ถํธํฉ๋๋ค.
#ํ์ด์ง_์ฒ๋ฆฌ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , #๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๋จ์๋ก ๋๋์ด ํ์ํจ์ผ๋ก์จ #์นํ์ด์ง์ #์ฑ๋ฅ๊ณผ #์ฌ์ฉ์_๊ฒฝํ์ ๋์์ ๊ฐ์ ํฉ๋๋ค.
2. ํ์ด์ง ์ฒ๋ฆฌ์ ํต์ฌ ์๋ฆฌ
#ํ์ด์ง_์ฒ๋ฆฌ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์์.
์ด #๊ฒ์๋ฌผ_์ ํ์ : #๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ์ ์ฒด #๊ฒ์๋ฌผ ์๋ฅผ ๋จผ์ ์์๋ ๋๋ค.
ํ ํ์ด์ง๋น #๊ฒ์๋ฌผ_์ ์ค์ : ํ ํ์ด์ง์ ๋ช ๊ฐ์ #๊ธ์ ๋ณด์ฌ์ค์ง ์ ํฉ๋๋ค. (์: 10๊ฐ, 20๊ฐ)
์ด #ํ์ด์ง_์ ๊ณ์ฐ: ์ด #๊ฒ์๋ฌผ ์๋ฅผ ํ์ด์ง๋น #๊ฒ์๋ฌผ ์๋ก ๋๋์ด ์ ์ฒด #ํ์ด์ง ์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
ํ์ฌ #ํ์ด์ง ๋ฒํธ ํ์ : ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์ ํ๋ #ํ์ด์ง ๋ฒํธ๋ฅผ #URL ํ๋ผ๋ฏธํฐ(์:
list.php?page=2
) ๋ฑ์ ํตํด ๊ฐ์ ธ์ต๋๋ค.#LIMIT๊ณผ #OFFSET ์ฌ์ฉ: #SQL ์ฟผ๋ฆฌ์์ #LIMIT๊ณผ #OFFSET์ ์ฌ์ฉํ์ฌ ํ์ฌ #ํ์ด์ง์ ํด๋นํ๋ #๋ฐ์ดํฐ๋ง #๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์ต๋๋ค.
3. ํ์ด์ง ์ฒ๋ฆฌ ์ฝ๋ ๊ตฌํ (list.php
์์ )
์ง๋๋ฒ list.php
์ฝ๋์ #ํ์ด์ง_์ฒ๋ฆฌ #๋ก์ง์ ์ถ๊ฐํ์ฌ ์์ ํด ๋ณผ๊ฒ์.
PHP
<?php
// list.php
include 'db_config.php'; // ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค์ ํฌํจ
// 1. ํ์ด์ง์ ์ํ ์ค์ ๊ฐ ์ ์
$posts_per_page = 10; // ํ ํ์ด์ง์ ๋ณด์ฌ์ค ๊ฒ์๊ธ ์
// 2. ํ์ฌ ํ์ด์ง ๋ฒํธ ํ์
// URL ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ 'page'์์ ํ์ฌ ํ์ด์ง ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ, ์์ผ๋ฉด 1๋ก ์ค์
$current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
// 3. OFFSET ๊ณ์ฐ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ช ๋ฒ์งธ ๋ ์ฝ๋๋ถํฐ ๊ฐ์ ธ์ฌ์ง ๊ฒฐ์
// (ํ์ฌ ํ์ด์ง ๋ฒํธ - 1) * ํ์ด์ง๋น ๊ฒ์๊ธ ์
$offset = ($current_page - 1) * $posts_per_page;
try {
// 4. ์ด ๊ฒ์๊ธ ์ ๊ฐ์ ธ์ค๊ธฐ
$total_posts_stmt = $conn->query("SELECT COUNT(*) FROM board");
$total_posts = $total_posts_stmt->fetchColumn(); // ์ ์ฒด ๊ฒ์๊ธ ์๋ฅผ ์ซ์๋ก ๊ฐ์ ธ์ด
// 5. ์ด ํ์ด์ง ์ ๊ณ์ฐ
// ceil() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ดํ๋ฅผ ์ฌ๋ฆผ (์: 20.1๊ฐ๋ฉด 21ํ์ด์ง ํ์)
$total_pages = ceil($total_posts / $posts_per_page);
// 6. ํ์ฌ ํ์ด์ง์ ํด๋นํ๋ ๊ฒ์๊ธ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
// ORDER BY created_at DESC: ์ต์ ๊ธ๋ถํฐ ์ ๋ ฌ
// LIMIT :offset, :limit: offset๋ถํฐ limit ๊ฐ์๋งํผ์ ๊ฒ์๊ธ ๊ฐ์ ธ์ค๊ธฐ
$stmt = $conn->prepare("SELECT id, title, author, created_at FROM board ORDER BY created_at DESC LIMIT :offset, :limit");
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT); // OFFSET ๋ฐ์ธ๋ฉ (์ ์ํ)
$stmt->bindParam(':limit', $posts_per_page, PDO::PARAM_INT); // LIMIT ๋ฐ์ธ๋ฉ (์ ์ํ)
$stmt->execute();
$posts = $stmt->fetchAll(); // ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๊ฐ์ ธ์ด
} catch(PDOException $e) {
echo "์ค๋ฅ: " . $e->getMessage();
$posts = []; // ์ค๋ฅ ๋ฐ์ ์ ๊ฒ์๊ธ ๋ฐฐ์ด์ ๋น์๋
$total_pages = 1; // ์ค๋ฅ ์ ์ด ํ์ด์ง ์๋ฅผ 1๋ก ์ค์
}
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๊ฒ์ํ ๊ธ ๋ชฉ๋ก</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
table { width: 80%; border-collapse: collapse; margin: 20px auto; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.pagination { text-align: center; margin-top: 20px; }
.pagination a { margin: 0 5px; padding: 5px 10px; text-decoration: none; border: 1px solid #ddd; color: #333; }
.pagination a.active, .pagination a:hover { background-color: #007bff; color: white; border-color: #007bff; }
</style>
</head>
<body>
<h1>๊ฒ์ํ ๊ธ ๋ชฉ๋ก</h1>
<p><a href="write.php">์ ๊ธ ์์ฑ</a></p>
<table>
<thead>
<tr>
<th>ID</th>
<th>์ ๋ชฉ</th>
<th>์์ฑ์</th>
<th>์์ฑ์ผ</th>
</tr>
</thead>
<tbody>
<?php if (count($posts) > 0): ?>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo htmlspecialchars($post['id']); ?></td>
<td><a href="view.php?id=<?php echo htmlspecialchars($post['id']); ?>"><?php echo htmlspecialchars($post['title']); ?></a></td>
<td><?php echo htmlspecialchars($post['author']); ?></td>
<td><?php echo htmlspecialchars($post['created_at']); ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="4">์์ง ์์ฑ๋ ๊ธ์ด ์์ต๋๋ค.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
<div class="pagination">
<?php for ($i = 1; $i <= $total_pages; $i++): ?>
<a href="?page=<?php echo $i; ?>" class="<?php echo ($i == $current_page) ? 'active' : ''; ?>"><?php echo $i; ?></a>
<?php endfor; ?>
</div>
</body>
</html>
4. ์ฝ๋ ์ค๋ช ๋ฐ ๋ณด์ถฉ
$posts_per_page
: ํ ํ์ด์ง์ ๋ช ๊ฐ์ #๊ฒ์๊ธ์ ๋ณด์ฌ์ค์ง ์ค์ ํ๋ ๋ณ์์์. ํ์์ ๋ฐ๋ผ ์กฐ์ ํ ์ ์์ต๋๋ค.$current_page
: ํ์ฌ ์ฌ์ฉ์๊ฐ ์์ฒญํ #ํ์ด์ง ๋ฒํธ๋ฅผ$_GET['page']
๋ก ๊ฐ์ ธ์์. #URL์?page=์ซ์
ํํ๋ก ์ ๋ฌ๋ฉ๋๋ค.(int)
๋ก ํ ๋ณํํ์ฌ #๋ณด์์ ๊ฐํํ๊ณ ๋น์ ์์ ์ธ ๊ฐ์ ๋ง์ต๋๋ค.$offset
: #SQL์ #LIMIT ์ ์์ ์ฌ์ฉํ ์์ ์์น๋ฅผ ๊ณ์ฐํด์. ์๋ฅผ ๋ค์ด 2ํ์ด์ง๋ฅผ ์์ฒญํ๊ณ ํ์ด์ง๋น 10๊ฐ์ #๊ธ์ ๋ณด์ฌ์ค๋ค๋ฉด,(2-1) * 10 = 10
์ด ๋์ด 11๋ฒ์งธ #๊ธ๋ถํฐ 10๊ฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.COUNT(*)
: #๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์์ #๊ฒ์ํ์ #์ด_๊ธ_์(#total_posts)๋ฅผ ๊ฐ์ ธ์์. #PDO์fetchColumn()
์ ์ฌ์ฉํ๋ฉด ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ์ ๊ฐ(์ฌ๊ธฐ์๋ COUNT(*))์ ๋ฐ๋ก ์ป์ ์ ์์ต๋๋ค.ceil()
: #PHP์ceil()
ํจ์๋ ์์์ ์ดํ๋ฅผ ๋ฌด์กฐ๊ฑด ์ฌ๋ฆผ ํด์. ์๋ฅผ ๋ค์ด ์ด #๊ธ์ด 21๊ฐ์ด๊ณ ํ์ด์ง๋น 10๊ฐ๋ผ๋ฉด,21 / 10 = 2.1
์ด ๋๊ณ ,ceil(2.1)
์ 3์ด ๋์ด ์ด 3ํ์ด์ง๊ฐ ํ์ํ๋ค๊ณ ์ ํํ ๊ณ์ฐ๋ฉ๋๋ค.LIMIT :offset, :limit
: #SQL์์ ํน์ ๋ฒ์์ #๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๋ ๊ตฌ๋ฌธ์ ๋๋ค.OFFSET
์ผ๋ก ์์ ์์น๋ฅผ,LIMIT
์ผ๋ก ๊ฐ์ ธ์ฌ ๊ฐ์๋ฅผ ์ง์ ํด์. #์ค๋น๋_๊ตฌ๋ฌธ(Prepared Statement)์ ์ฌ์ฉํด #SQL_์ธ์ ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ณPDO::PARAM_INT
๋ก ์ ์ํ์์ ๋ช ์ํ์ฌ #๋ณด์์ ๊ฐํํฉ๋๋ค.#ํ์ด์ง๋ค์ด์ _๋งํฌ:
for
๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ 1๋ถํฐ$total_pages
๊น์ง์ #ํ์ด์ง_๋งํฌ๋ฅผ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค. ํ์ฌ #ํ์ด์ง์๋active
ํด๋์ค๋ฅผ ์ถ๊ฐํ์ฌ ์๊ฐ์ ์ผ๋ก ๊ฐ์กฐํ์ด์.
์ด #ํ์ด์ง_์ฒ๋ฆฌ #๋ก์ง์ ์ ์ฉํ๋ฉด #๊ฒ์ํ์ด ์๋ฌด๋ฆฌ ์ปค์ ธ๋ #์นํ์ด์ง๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก #๊ธ ๋ชฉ๋ก์ ๋ณด์ฌ์ค ์ ์์ ๊ฑฐ์์. ๋ค์ ์ฃผ์ฐจ์๋ #๊ฒ์ํ์ ๋ค๋ฅธ ์ ์ฉํ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค!
๊ฒ์ํ CRUD ํ์ด์ง PHP ๋ฐ์ดํฐ๋ฒ ์ด์ค SQL ์ฑ๋ฅ ์ฌ์ฉ์๊ฒฝํ