본문 바로가기

웹 해킹

게시판 CRUD, 페이징, 검색

구현해놓은것은 꽤 전이지만..게시판에 대한 글도 겸사겸사 작성해보려한다.

게시글 불러오기, 글 작성, 글 수정, 글 삭제와 같은 부분은 로그인이나 회원가입과 크게 다를게 없으니 간단히 설명하고자 한다.

 

첫번째로 게시판에 들어갈 데이터베이스를 만들어줬다.

사용하는 컬럼은 [ BNO, TITLE, Author, CONTENT, Date] 로 정해주었다.

 

 

board.php를 구현해주었고 총 완성된 모습은 아래와 같다.

우선 board.php에 접속했을때 게시글 목록 불러오기는

Content를 제외한 값들을 불러오도록 하였다.

(Content는 자세히보기시 불러오도록설정)

function boardv()
{
    define('DB_SERVER', 'localhost');
    define('DB_USERNAME', 'admin');
    define('DB_PASSWORD', 'student1234');
    define('DB_NAME', 'test');

    // 데이터베이스 연결
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

    // 게시판 아이템 조회 쿼리
    $pageLimit = 8; // 한 페이지에 표시할 아이템 수
    $page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
    $startPoint = ($page - 1) * $pageLimit;

    $sql = "SELECT bno, title, author, date FROM board LIMIT?,?";
    $stmt = $db_conn->prepare($sql);
    $stmt->bind_param("ii", $startPoint, $pageLimit);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result) {
        while ($row = mysqli_fetch_assoc($result)) {
            // 각 행의 데이터를 변수에 저장
            $bno = $row['bno'];
            $title = htmlspecialchars($row['title']);
            $author = htmlspecialchars($row['author']);
            $date = $row['date'];

            // 테이블 행 출력
            echo '<tr>';
            echo '<td>' . $bno . '</td>';
            echo '<td><a href="view.php?bno=' . $bno . '">' . $title . '</a></td>';
            echo '<td>' . $author . '</td>';
            echo '<td>' . $date . '</td>';
            echo '</tr>';
        }
        // 자원 해제
        $stmt->close();
    } else {
        die('Query failed: ' . mysqli_error($db_conn));
    }

}

 

이부분에서 페이징 기법이 나오는데 페이지 값을 GET으로 불러와 startpoint를 설정해주도록 하였다.

8개씩 보여주도록 하였으니 첫 페이지의 경우 select ... from board limit 0,8 이 실행되고

두번째 페이지의 경우 GET['page']=2 가 넘어와

select ... from board limit 9,8이 실행되는 방식이다.

 

글 수정/삭제

<?php
    // selct
    function update1($bno,$title,$content){
        define('DB_SERVER','localhost');
        define('DB_USERNAME','admin');
        define('DB_PASSWORD','student1234');  
        define('DB_NAME','test');
   
        $db_conn = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_NAME);

        $sql = "UPDATE board SET title = '$title', content = '$content' WHERE bno = $bno";
        $result=mysqli_query($db_conn, $sql);
        $db_conn->close();
        return $result;
        }
 
    function delete1($bno){
        define('DB_SERVER','localhost');
        define('DB_USERNAME','admin');
        define('DB_PASSWORD','student1234');  
        define('DB_NAME','test');
   
        $db_conn = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_NAME);

        $sql = "DELETE from board WHERE bno = $bno";
        $result=mysqli_query($db_conn, $sql);
        $db_conn->close();
        return $result;
    }
?>

 

검색기능

우선 검색이 있을경우와 검색이 없을경우를 나눠주었다. (키워드가 있을경우 함수 search1() 실행, 없을경우 boardv()로 불러오기)

<thead>
                <tr>
                    <th>BNO</th>
                    <th>TITLE</th>
                    <th>AUTHOR</th>
                    <th>DATE</th>
                </tr>
            </thead>
            <tbody>
              
                <?php
                if (isset($_GET['keyword'])) {
                    search1($_GET['keyword']);
                } else {
                    boardv();
                }

                ?>

            </tbody>

 

function search1($keyword){
    define('DB_SERVER', 'localhost');
    define('DB_USERNAME', 'admin');
    define('DB_PASSWORD', 'student1234');
    define('DB_NAME', 'test');

    // 데이터베이스 연결
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

    $sql = "SELECT * FROM board WHERE title LIKE '%$keyword%' OR content LIKE '%$keyword%' LIMIT ?,?";

    // 게시판 아이템 조회 쿼리
    $pageLimit = 8; // 한 페이지에 표시할 아이템 수
    $page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
    $startPoint = ($page - 1) * $pageLimit;
    $stmt = $db_conn->prepare($sql);
    $stmt->bind_param("ii", $startPoint, $pageLimit);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result) {
        while ($row = mysqli_fetch_assoc($result)) {
            // 각 행의 데이터를 변수에 저장
            $bno = $row['bno'];
            $title = htmlspecialchars($row['title']);
            $author = htmlspecialchars($row['author']);
            $date = $row['date'];

            // 테이블 행 출력
            echo '<tr>';
            echo '<td>' . $bno . '</td>';
            echo '<td><a href="view.php?bno=' . $bno . '">' . $title . '</a></td>';
            echo '<td>' . $author . '</td>';
            echo '<td>' . $date . '</td>';
            echo '</tr>';
        }
        // 자원 해제
        $stmt->close();
    } else {
        die('Query failed: ' . mysqli_error($db_conn));
    }

}

글 불러오기와 크게 다를건 없다.

데이터베이스 컬럼중 TITLE, CONTENT에 keyword가 포함되면 그 글만 뜨는 방식으로 불러오도록 설정하는것이기 때문에.

그 keyword 조건만 sql을 변경해주어 불러오도록 하였다.

 

해야할 공목록

- 쿠키탈취코드, 키로거

- 5? 6?주차 sql injection

'웹 해킹' 카테고리의 다른 글

SQL Injection + 문제 [1,2] + 도박 관리자  (1) 2025.05.21
쿠키, 세션 그리고 JWT  (0) 2025.05.19
JWT/PHP 로그인  (0) 2025.05.13
Hash와 로그인 식별/인증  (0) 2025.04.22
PHP / DB연동 데이터 삽입 및 불러오기  (0) 2025.04.16