๋ฃจ์  ์†Œํ”„ํŠธ ๋กœ๊ณ 

216.73.216.248 TODAY : 62

PHP ๊ฐ•์˜

 > 

PHP - ์ค‘๊ธ‰

๐Ÿ“š PHP ์ค‘๊ธ‰ - 3์ฃผ์ฐจ: ๊ฒŒ์‹œํŒ CRUD ๊ตฌํ˜„ (๊ธฐ๋ณธ) - 03 ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ

๐Ÿ“š 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)๋ฅผ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณผ ๊ฑฐ์˜ˆ์š”. #ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋Š” #๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๋•Œ ์›นํŽ˜์ด์ง€์˜ #์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.


uploadImage



1. ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์˜ ํ•„์š”์„ฑ




#๊ฒŒ์‹œํŒ์— #๊ธ€์ด ์ˆ˜์ฒœ, ์ˆ˜๋งŒ ๊ฐœ ์Œ“์ธ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ๋ชจ๋“  #๊ธ€์„ ํ•œ ๋ฒˆ์— ๋ถˆ๋Ÿฌ์™€์„œ ์›นํŽ˜์ด์ง€์— ํ‘œ์‹œํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”.



  • ๋А๋ฆฐ ๋กœ๋”ฉ ์†๋„: #๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋งŽ์€ #๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , #์›นํŽ˜์ด์ง€์— ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์ง€ ์•Š์€ ๊ฒฝํ—˜์„ ์ค๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ฆ๊ฐ€: ํ•œ ๋ฒˆ์— ๋ชจ๋“  #๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋А๋ผ #์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜: ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค์„ ๋์—†์ด ๋‚ด๋ ค์•ผ ํ•˜๋ฏ€๋กœ ์›ํ•˜๋Š” #์ •๋ณด๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ต๊ณ  ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.



#ํŽ˜์ด์ง•_์ฒ˜๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , #๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ํ‘œ์‹œํ•จ์œผ๋กœ์จ #์›นํŽ˜์ด์ง€์˜ #์„ฑ๋Šฅ๊ณผ #์‚ฌ์šฉ์ž_๊ฒฝํ—˜์„ ๋™์‹œ์— ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.


uploadImage



2. ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ ์›๋ฆฌ




#ํŽ˜์ด์ง•_์ฒ˜๋ฆฌ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”.



  1. ์ด #๊ฒŒ์‹œ๋ฌผ_์ˆ˜ ํŒŒ์•…: #๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ์ „์ฒด #๊ฒŒ์‹œ๋ฌผ ์ˆ˜๋ฅผ ๋จผ์ € ์•Œ์•„๋ƒ…๋‹ˆ๋‹ค.

  2. ํ•œ ํŽ˜์ด์ง€๋‹น #๊ฒŒ์‹œ๋ฌผ_์ˆ˜ ์„ค์ •: ํ•œ ํŽ˜์ด์ง€์— ๋ช‡ ๊ฐœ์˜ #๊ธ€์„ ๋ณด์—ฌ์ค„์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: 10๊ฐœ, 20๊ฐœ)

  3. ์ด #ํŽ˜์ด์ง€_์ˆ˜ ๊ณ„์‚ฐ: ์ด #๊ฒŒ์‹œ๋ฌผ ์ˆ˜๋ฅผ ํŽ˜์ด์ง€๋‹น #๊ฒŒ์‹œ๋ฌผ ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ์ „์ฒด #ํŽ˜์ด์ง€ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

  4. ํ˜„์žฌ #ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ํŒŒ์•…: ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ ์ž ํ•˜๋Š” #ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ #URL ํŒŒ๋ผ๋ฏธํ„ฐ(์˜ˆ: list.php?page=2) ๋“ฑ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  5. #LIMIT๊ณผ #OFFSET ์‚ฌ์šฉ: #SQL ์ฟผ๋ฆฌ์—์„œ #LIMIT๊ณผ #OFFSET์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ #ํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” #๋ฐ์ดํ„ฐ๋งŒ #๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.


uploadImage



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>


uploadImage



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 ์„ฑ๋Šฅ ์‚ฌ์šฉ์ž๊ฒฝํ—˜