본문 바로가기

개발과제

[노말틱 모의 해킹 취업반 11주차 개발과제 ] 문의게시판 만들기

안녕하세요

 

저의 개발 과제는 여기까지입니다.

문의게시판까지 만들고 css 써서 좀 꾸미고 난 뒤에 부족한 게 있으면 추가하는

그런 목표였거든요!

 

시작하겠습니다.

 

일단 문의게시판은 비회원도 이용 가능하게 할 겁니다.

그러니 문의게시판 용의 데이터베이스가 새로 필요할 거고요.

게다가 이 게시판에는 비밀번호까지 입력하게 해서 만약 비밀번호가 맞으면 수정, 삭제가 가능하도록 하겠습니다.

당연히 볼 수 있고요.

 

저는 일단 login.php에 문의 게시판 버튼을 만들겠습니다.

 

        <form action="inquiry_board.php"> 
            <p><input type="submit" value="문의게시판"></p>
        </form>

 

 

자바 스크립트를 쓰는게 더 편하다고는 하는데.. 저는 모르겠네요

 

 

다음에 inquiry_board.php을 만들겠습니다.

 

작성을 하기 전에 데이터베이스에 추가를 하겠습니다.

 

phpmyadmin에 왼쪽 위에 '새로운' 눌러서 데이터베이스 생성

 

 

테이블 이름도 INQUIRY_INFO로 했습니다.

 

칼럼 수는 일단 식별자용으로 board_id, 작성자 이름 user_id, 비밀번호 pw,  작성된 제목 title, 작성된 내용 detail

날짜 date_value까지 솔직히 문의게시판인데 조회수랑 좋아요 수는 필요 없겠죠

 

이렇게 6개로 만들겠습니다.

 

 

이젠 자주 봐서 정겹네요

저장하고 테이블을 만들었습니다.

 

그리고 제 env 파일에 새로운 데이터베이스 이름을 추가하겠습니다.

 

#sudo vi /etc/apache2/envvars

 

 

많아지고 있습니다.

 

저장하고 나갑니다.

 

그리고 DB_INFO.php에 추가해야죠

 

이건 쉽죠

 

 

이제 작성을 시작하겠습니다!

php문으로 가셔서 게시판에 있는 코드를 그대로 복사 붙이기 하겠습니다.

그리고 데이터베이스 명은 바꾸고 작성하겠습니다.

 

그리고 vscode의 좋은 기능이 있죠 ctrl+h 누르면 검색창이 나옵니다

 

매우매우 좋은 기능입니다.

 

이때 Replace에 db_board 말고 db_inquiry 저희가 방금 작성한 테이블 이름을 넣겠습니다.

 

그리고 AB 옆에 보세요!

 

작은 아이콘이 있는데 마우스 갖다 대면 Replace는 enter, Replace ALL은 ctrl+alert+enter 누르라네요

 

저는 전부 데이터베이스 이름을 바꾸기에 Replace ALL을 누르겠습니다.

 

그리고 좋아요 기능이 없으니 좋아요 관련 코드는 전부 지우겠습니다.

 

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Welcome!</title>
    </head>
    <body>
        <h1>INQUIRY_MENU</h1>
        <?php

            include 'DB_INFO.php'; //데이터 베이스 정보

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            session_start(); //세션 시작
        ?>

        <form method ="GET" action="inquiry_board.php">
            <input type = "text" name="search" value="<?php echo mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));?>" placeholder="검색" >
            <input type="submit" value="검색">
            <select name="sort" onchange="this.form.submit()">
                <option value="">정렬 방식 선택</option>
                <option value="date" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='date'){echo ' selected';} ?> >날짜순</option>
                <option value="author" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='author'){echo ' selected';} ?> >작성자순</option>
            </select>          
            <label for="date">날짜 선택:</label>
            <input type="date" id="date_value" name="date_value" value="<?php echo isset($_GET['date_value']) ? $_GET['date_value'] : ''; ?>">
        </form>

        <p>
        <?php 
            //한 페이지에 보여줄 게시물 수
            $num_per_page = 5;

            //현재 페이지 번호
            if(isset($_GET['page'])) {
                $page = mysqli_real_escape_string($conn,filter_var(strip_tags(intval($_GET['page'])),FILTER_SANITIZE_SPECIAL_CHARS));
            } else {
                $page = 1;
            }
            
            //검색이 입력된 경우
            if(isset($_GET['search'])) {
                $search = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));

                if(isset($_GET['date_value']) && strtotime($_GET['date_value'])) {
                    //날짜 선택한 경우, strtotime() 이용해 유효한 값인지 확인
                    $date_value = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['date_value']),FILTER_SANITIZE_SPECIAL_CHARS));
                    $date_value = DateTime::createFromFormat('Y-m-d', $date_value)->format('Y-m-d'); //날짜 값으로 다시 바꾼다

                    $sql = "SELECT * FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
                    $total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
                }
                else {
                    //날짜가 선택이 안된 경우
                    $date_value = '';
                    $sql = "SELECT board_id,user_id,title,detail FROM $db_inquiry WHERE title LIKE '%$search%' ";
                    $total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' ";
                }
            } else {
                //검색이 입력되지 않은 경우
                $search = '';
                $date_value = '';
                $sql = "SELECT * FROM $db_inquiry"; //전체 게시물 검색
                $total_sql = "SELECT count(*) AS cnt FROM $db_inquiry"; //전체 게시물 수 조회
            }
            
            $total_result = mysqli_query($conn,$total_sql); //sql문 실행
            $total_row = mysqli_fetch_assoc($total_result); //결과를 배열로 가져온다
            $total_posts = $total_row['cnt']; //배열 중 cnt의 값을 가져온다

            //전체 페이지 수
            $total_pages = ceil($total_posts / $num_per_page);

            //각 페이지 시작 인덱스
            $start = ($page - 1) * $num_per_page;

            //정렬해주는 조건문
            if (isset($_GET['sort'])) {
                $sort = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS));
                if ($sort == 'date') {
                    //날짜순
                    $sql .= " ORDER BY date_value DESC";
                } else if ($sort == 'author') {
                    //작성자순
                    $sql .= " ORDER BY id DESC";
                }
            } 
            
            $sql .= " LIMIT $start, $num_per_page"; //최대 5개씩 호출

            //쿼리문 실행
            $result = mysqli_query($conn, $sql);

            if(mysqli_num_rows($result) > 0) {
                //게시물 출력
                while($row = mysqli_fetch_assoc($result)) {
                    $index = $row['board_id'];
                    $id = $row['user_id'];
                    $title = $row['title'];
                    echo '<p><a href="view_inquiry_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함</p>';
                }
            } else {
                echo "게시물이 없습니다!";
            }
            
            echo '<p> [ ';
            
            // 현재 페이지를 10으로 나눈 몫에 10을 곱한 값에서 1을 빼면
            // 현재 페이지가 몇 번째 페이지 블록에 있는지 알 수 있습니다.
            $block_start = floor(($page-1)/10)*10;

            if ($block_start > 1) {
                // 이전 페이지 블록이 있다면, 다음 버튼을 출력합니다.
                $next_block_start = $block_start - 10;
                if($next_block_start == 0) {
                    $next_block_start += 1; //0페이지는 존재 하지 않기에 1더한다
                }
                echo '<a href="?page=' . $next_block_start .'"><< </a>';
            }

            // 이전 버튼 출력
            if ($page > 1) {
                echo '<a href="?page=' . ($page-1) .'">< </a> ';
            }
            
            // 페이지 링크 출력
            for ($i = $block_start+1; $i <= min($block_start+10, $total_pages); $i++) {
                if($i == $page) {
                    echo '<strong>'.$i.' </strong>';
                } else {
                    echo '<a href="?page=' . $i .'">'.$i. '</a> ';
                }
                echo ' ';
            }

            // 다음 버튼 출력
            if ($page < $total_pages) {
                echo '<a href="?page=' . ($page+1) .'">> </a> ';
            }
            
            if ($block_start+10 < $total_pages) {
                // 다음 페이지 블록이 있다면, 다음 버튼을 출력합니다.
                $next_block_start = $block_start + 11;
                echo '<a href="?page=' . $next_block_start .'">>></a>';
            }

            echo ' ]</p>';
            
        ?>
        </p>
        <p></p>
        <form action="inquiry_write_board.php" method="POST"> 
            <p><input type="submit" name="write" value="게시판 작성"></p>
        </form>
        <form action="login.php">
            <p><input type="submit" value="로그인페이지로"></p>
        </form>
        <form action="board.php" method="GET"> 
            <p><input type="submit" value="검색 초기화"></p>
            <input type="hidden" name="search" value="">
            <input type="hidden" name="sort" value="">
            <input type="hidden" name="date_value" value="">
        </form>
    </body>
</html>

 

많이 기네요! 원래 코드는 객체 지향을 써서 각각 기능을 분류하고 해야 되는데.. 넘어가죠!

 

먼저 게시판 작성부터 하겠습니다.

 

마지막에 있는 게시판 작성 관련 form을 고치겠습니다.

 

        <form action="inquiry_write_board.php" method="POST"> 
            <p><input type="submit" name="write" value="게시판 작성"></p>
        </form>

 

그리고 inquiry_write_board.php을 만들겠습니다.

 

write_board.php을 복붙 하겠습니다.

이때 저는 비밀번호까지 작성 가능하게 맨 밑에 추가 password 박스를 만들고

파일 관련 코드는 아예 없애겠습니다. 세션 ID 비교할 필요도 없죠!

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>문의게시판 작성 중</title>
    </head>
    <body>
        <h1>문의게시판 작성!</h1>
        <form action="inquiry_write_process_board.php" method="POST">
            <label>ID:</label>
            <input type="text" name="user_id" placeholder="작성자이름,특수기호X" required><br><br>
            <p><input type="text" name="title" maxlegth="44" placeholder="제목 입력, 최대 44자까지 가능합니다" required></p>
            <p><textarea name="detail" rows="20" cols="20" maxlength="254" placeholder="내용 작성,최대 254자 가능합니다" required></textarea></p>
            <p><input type="password" name="pw" maxlegth="44" placeholder="비밀번호입력" required></p>
            <p><input type="submit" value="올리기"></p>
        </form>
        
        <form action="inquiry_board.php"> 
            <p><input type="submit" value="돌아가기"></p>
        </form>
        <p>
        <?php session_start();
                if (isset($_SESSION['write_error'])) {
                    echo $_SESSION['write_error'];
                    unset($_SESSION['write_error']);
                }
        ?>
        </p>
    </body>
</html>

 

그리고 inquiry_write_process_board.php 만들고 코드 작성 하겠습니다.

 

 

거의 다 복붙에 pw 추가만 하는 거라 딱히.. 설명할 게 없네요! 질문 있으시면 언제나 물어보셔도 됩니다.

 

어쨌든 write_process_board.php을 복붙 하겠습니다.

 

그리고 pw는 받고 난 뒤에 해싱한 후 저장하게 하겠습니다.

데이터베이스 명 변경도 했습니다.

 

-inquiry_write_process_board.php

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    session_start(); //세션 시작

    //문의게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_inquiry);

    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    if(isset($_POST['board_id'])){ //수정시 받아온다
        $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
    } else {
        $board_id = null;
    }
    $title = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['title']),FILTER_SANITIZE_SPECIAL_CHARS));
    $detail = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['detail']),FILTER_SANITIZE_SPECIAL_CHARS));

    //POST으로 유저 이름 받기
    $user_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['user_id']),FILTER_SANITIZE_SPECIAL_CHARS));

    if(isset($_POST['pw'])){
        //비밀번호가 있으면 해싱
        $hashed_pw = password_hash($_POST['pw'], PASSWORD_DEFAULT);
    }

    if(isset($board_id)) {
        //board_id가 있다는 것은 수정을 의미
        $sql = "UPDATE $db_inquiry SET user_id='$user_id', title = '$title', detail='$detail' WHERE board_id='$board_id' ";
    }
    else {
        //board_id가 없으니 새로 만드는 sql문
        $sql = "INSERT INTO $db_inquiry (user_id, title, detail,pw) VALUES ('$user_id', '$title', '$detail','$hashed_pw')";
    }

    //sql문 실행
    if(mysqli_query($conn,$sql)) {
        //수정인 경우 바로 게시판 보이게 함
        if(isset($board_id)) {
            $_SESSION['write_error'] = '수정되었습니다!';
            header("Location: view_inquiry_board.php?index=$board_id");
        }
        else {
            $board_id = mysqli_insert_id($conn); // 새로 생성한 게시물의 id를 가져옴
            $_SESSION['write_error'] = '작성되었습니다!';
            header("Location: view_inquiry_board.php?index=$board_id");
        }
    } else {
        $_SESSION['write_error'] = '작성 중 오류가 발생하였습니다.';
        header("Location: view_inquiry_board.php");
    }

    exit();
?>

 

그리고 게시물 출력을 하겠습니다.

 

 

 

inquiry_board.php로 넘어가고

또 수정하겠습니다

            if(mysqli_num_rows($result) > 0) {
                //게시물 출력
                while($row = mysqli_fetch_assoc($result)) {
                    $index = $row['board_id'];
                    $id = $row['id'];
                    $title = $row['title'];
                    echo '<p><a href="view_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함 조회수: '.$row['views'].'</p>';
                }
            } else {
                echo "게시물이 없습니다!";
            }

이 코드에 하이퍼 링크를 고치겠습니다.

 

            if(mysqli_num_rows($result) > 0) {
                //게시물 출력
                while($row = mysqli_fetch_assoc($result)) {
                    $index = $row['board_id'];
                    $id = $row['id'];
                    $title = $row['title'];
                    echo '<p><a href="view_inquiry_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함 조회수: '.$row['views'].'</p>';
                }
            } else {
                echo "게시물이 없습니다!";
            }

 

 

 

 

 

그리고 inquiry_board.php을 만들고 또 코딩하겠습니다.

 

이번에는 view_board.php을 그대로 가져오면 되겠죠! 근데 파일은 없어도 되니 파일 관련 코드는 전부 지우겠습니다.

좋아요, 조회수 기능도요

 

당연히 이 기능을 사용했습니다.

 

데이터베이스 명 변경도 중요하죠!

 

 

그리고 코드 보여드리겠습니다.

 

-view_inquiry_board.php

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>문의게시물 보는중</title>
    </head>
    <body>
        <p>
        <?php 

            include 'DB_INFO.php'; //데이터 베이스 정보

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            //GET방식으로 전달된 index 받는다
            $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['index']),FILTER_SANITIZE_SPECIAL_CHARS));

            //작성된 게시물들 조회 문
            $sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";
            //쿼리문 실행
            $result = mysqli_query($conn, $sql);
            
            //게시물 출력
            while($row = mysqli_fetch_assoc($result)) {
                echo '<p>ID: '.$row['user_id'].'</p>';
                echo '<p>Title: '.$row['title'].'</p>';
                echo '<p>Detail: '.$row['detail'].'</p>';
                echo '<p>Date: '.$row['date_value'].'</p>';

                //게시물 수정 버튼을 보여준다
                echo "<form method='GET' action='inquiry_fix_process_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>게시물 수정</button></p>
                      </form>";

                //게시물 삭제 버튼을 보여준다
                echo "<form method='POST' action='inquiry_delete_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>삭제</button></p>
                      </form>";          
            }
        ?>
        </p>
        <p>
        <?php session_start();
                if (isset($_SESSION['write_error'])) {
                    echo $_SESSION['write_error'];
                    unset($_SESSION['write_error']);
                }
        ?>
        </p>
        <p></p>
        <form action="inquiry_board.php">
            <p><input type="submit" value="문의페이지로"></p>
        </form>
        <form action="login.php">
            <p><input type="submit" value="로그인페이지로"></p>
        </form>
    </body>
</html>

 

 

그리고 게시물 수정, 게시물 삭제의 하이퍼 링크를 고치겠습니다.

 

                //게시물 수정 버튼을 보여준다
                echo "<form method='GET' action='inquiry_fix_process_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>게시물 수정</button></p>
                      </form>";

                //게시물 삭제 버튼을 보여준다
                echo "<form method='GET' action='inquiry_delete_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>삭제</button></p>
                      </form>";

 

그리고 먼저 수정 기능인 inquiry_fix_board.php 먼저 코딩하죠!

 

 

 

똑같이 파일 관련, 데이터베이스 명, 세션 ID 고치겠습니다.

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>게시판 수정 중</title>
    </head>
    <body>

        <?php 
            include 'DB_INFO.php'; //데이터 베이스 정보

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }
            
            //GET방식으로 board_id 받기
            $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));

            //작성된 게시물들 조회 문
            $sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";

            //쿼리문 실행
            $result = mysqli_query($conn, $sql);

            //결과값 가져오기
            $row = mysqli_fetch_assoc($result);
        ?>
        <form action="inquiry_write_process_board.php" method="POST">
            <p><input type="text" name="user_id" maxlength="44" value="<?php echo $row['user_id']; ?>" placeholder="작성자이름"></p>
            <p><input type="text" name="title" maxlength="44" value="<?php echo $row['title']; ?>" placeholder="제목 입력, 최대 44자까지 가능합니다"></p>
            <p><textarea name="detail" rows="20" cols="20" maxlength="254" placeholder="내용 작성,최대 254자 가능합니다"><?php echo $row['detail']; ?></textarea></p>
            <p><input type="submit" value="수정하기"></p>
            <input type="hidden" name='board_id' value="<?php echo $row['board_id']; ?>">
        </form>

        <p>
        <?php session_start();
                if (isset($_SESSION['write_error'])) {
                    echo $_SESSION['write_error'];
                    unset($_SESSION['write_error']);
                }
        ?>
        </p>
    </body>
</html>

 

데이터베이스에 id로 전부 통일할걸.. 후회하고 있습니다. 계속 id을 user_id로 바꿔야 되네요

 

어쨌든 이렇게만 해 두면 안 되겠죠 비밀번호를 작성을 해 만약 맞으면 이 내용을 보이게 하겠습니다.

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>게시판 수정 중</title>
    </head>
    <body>

        <?php 
            include 'DB_INFO.php'; //데이터 베이스 정보

            session_start();

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            //GET방식으로 board_id 받기
            $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));


            //작성된 게시물들 조회 문
            $sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";

            //쿼리문 실행
            $result = mysqli_query($conn, $sql);

            //결과값 가져오기
            $row = mysqli_fetch_assoc($result);

            
            if(isset($_POST['pw'])) {
                //비밀번호 값을 가져온다
                $hashed_pw = $row['pw'];

                if(password_verify($_POST['pw'],$hashed_pw)) {
                    //비밀번호가 맞으면
                    echo "<form action='inquiry_write_process_board.php' method='POST'>
                            <p><input type='text' name='user_id' maxlength='44' value='".$row['user_id']."' placeholder='작성자이름'></p>
                            <p><input type='text' name='title' maxlength='44' value='".$row['title']."' placeholder='제목 입력, 최대 44자까지 가능합니다'></p>
                            <p><textarea name='detail' rows='20' cols='20' maxlength='254' placeholder='내용 작성,최대 254자 가능합니다'>".$row['detail']."</textarea></p>
                            <p><input type='submit' value='수정하기'></p>
                            <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        </form>";


                } else {    
                    //비밀번호 틀린경우
                    $_SESSION['write_error'] = '비밀번호가 틀립니다!';
                    
                    header("Location: view_inquiry_board.php?index=".$board_id);
                    exit();
                }
            } else {
                echo "<form method='POST' action='inquiry_fix_process_board.php?board_id=$board_id'>
                    <input type='password' name='pw' value=''>
                    <p><button type='submit'>인증하기</button></p>
                  </form>";
            }
            
        ?>

        <p>
        </p>
    </body>
</html>

 

 

 

 

 

다음은 inquiry_delete_board.php을 짜겠습니다.

 

delete_board.php에 복사 붙이기 하고 필요 없는 거랑 바꿀 거 바꾸고 코딩하겠습니다

 

당연히 비밀번호 인증 돼야만 실행하게 하겠습니다.

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    session_start(); //세션 시작
    
    //게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_inquiry);
    
    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
    
    //삭제용 sql문 작성
    $sql = "DELETE FROM $db_inquiry WHERE board_id='$board_id'";

    //비밀번호 조회용 sql문 작성
    $sql_pw = "SELECT pw FROM $db_inquiry WHERE board_id='$board_id'";

    //쿼리문 실행
    $result = mysqli_query($conn, $sql);

    //결과값 가져오기
    $row = mysqli_fetch_assoc($result);

    if(isset($_POST['pw'])) {
        //비밀번호 값을 가져온다
        $hashed_pw = $row['pw'];

        if(password_verify($_POST['pw'],$hashed_pw)) {
            //실행
            if(mysqli_query($conn,$sql)) {
                //실행 후 게시판으로 이동
                header("Location: inquiry_board.php");
            } else {
                //오류 발생 시 메시지 호출
                $_SESSION['write_error'] = '삭제하는데 실패했습니다! 조금 있다 하십시오';
                header("Location: view_inquiry_board.php");
            }

        } else {
            //비밀번호 틀린경우
            $_SESSION['write_error'] = '비밀번호가 틀립니다!';
            header("Location: view_inquiry_board?index=$board_id");
        }
    } else {
        echo "<form method='POST' action='inquiry_delete_board.php?board_id=$board_id'>
                <input type='password' name='pw' value=''>
                <p><button type='submit'>인증하기</button></p>
             </form>";
    }

    exit();
?>

 

이러면 게시물 보기, 출력, 정렬, 수정, 삭제, 등록되었습니다!

 

한번 쭉 해보고 에러 나면 고치도록 하겠습니다.

 

저거 대충 입력한겁니다

 

작성해보겠습니다

 

444 코딩.. 죽을 맛입니다

 

 

나오네요!

 

한번 수정 눌러보겠습니다

 

4444 죽을 4

 

 

한번 수정 해보겠습니다

 

 

수정!

 

 

쨘!

 

잘 되었네요!

 

이제 삭제해보겠습니다

 

인증!

 

 

사라졌다! 바람처럼

 

이렇게 해서 문의 게시판을 구현을 했습니다.

 

오늘은 여기까지 작성을 하겠습니다.

다음에 주소 API을 없애고 주소 찾는 코드를 제가 직접 짜겠습니다 감사합니다.

.

.

.

.

.

.

.

.

-inquiry_board.php

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Welcome!</title>
    </head>
    <body>
        <h1>INQUIRY_MENU</h1>
        <?php

            include 'DB_INFO.php'; //데이터 베이스 정보

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            session_start(); //세션 시작
        ?>

        <form method ="GET" action="inquiry_board.php">
            <input type = "text" name="search" value="<?php echo mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));?>" placeholder="검색" >
            <input type="submit" value="검색">
            <select name="sort" onchange="this.form.submit()">
                <option value="">정렬 방식 선택</option>
                <option value="date" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='date'){echo ' selected';} ?> >날짜순</option>
                <option value="author" <?php if(mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS))=='author'){echo ' selected';} ?> >작성자순</option>
            </select>          
            <label for="date">날짜 선택:</label>
            <input type="date" id="date_value" name="date_value" value="<?php echo isset($_GET['date_value']) ? $_GET['date_value'] : ''; ?>">
        </form>

        <p>
        <?php 
            //한 페이지에 보여줄 게시물 수
            $num_per_page = 5;

            //현재 페이지 번호
            if(isset($_GET['page'])) {
                $page = mysqli_real_escape_string($conn,filter_var(strip_tags(intval($_GET['page'])),FILTER_SANITIZE_SPECIAL_CHARS));
            } else {
                $page = 1;
            }
            
            //검색이 입력된 경우
            if(isset($_GET['search'])) {
                $search = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['search']),FILTER_SANITIZE_SPECIAL_CHARS));

                if(isset($_GET['date_value']) && strtotime($_GET['date_value'])) {
                    //날짜 선택한 경우, strtotime() 이용해 유효한 값인지 확인
                    $date_value = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['date_value']),FILTER_SANITIZE_SPECIAL_CHARS));
                    $date_value = DateTime::createFromFormat('Y-m-d', $date_value)->format('Y-m-d'); //날짜 값으로 다시 바꾼다

                    $sql = "SELECT * FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
                    $total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' AND date_value LIKE '%$date_value%'";
                }
                else {
                    //날짜가 선택이 안된 경우
                    $date_value = '';
                    $sql = "SELECT board_id,user_id,title,detail FROM $db_inquiry WHERE title LIKE '%$search%' ";
                    $total_sql = "SELECT count(*) AS cnt FROM $db_inquiry WHERE title LIKE '%$search%' ";
                }
            } else {
                //검색이 입력되지 않은 경우
                $search = '';
                $date_value = '';
                $sql = "SELECT * FROM $db_inquiry"; //전체 게시물 검색
                $total_sql = "SELECT count(*) AS cnt FROM $db_inquiry"; //전체 게시물 수 조회
            }
            
            $total_result = mysqli_query($conn,$total_sql); //sql문 실행
            $total_row = mysqli_fetch_assoc($total_result); //결과를 배열로 가져온다
            $total_posts = $total_row['cnt']; //배열 중 cnt의 값을 가져온다

            //전체 페이지 수
            $total_pages = ceil($total_posts / $num_per_page);

            //각 페이지 시작 인덱스
            $start = ($page - 1) * $num_per_page;

            //정렬해주는 조건문
            if (isset($_GET['sort'])) {
                $sort = mysqli_real_escape_string($conn, filter_var(strip_tags($_GET['sort']),FILTER_SANITIZE_SPECIAL_CHARS));
                if ($sort == 'date') {
                    //날짜순
                    $sql .= " ORDER BY date_value DESC";
                } else if ($sort == 'author') {
                    //작성자순
                    $sql .= " ORDER BY id DESC";
                }
            } 
            
            $sql .= " LIMIT $start, $num_per_page"; //최대 5개씩 호출

            //쿼리문 실행
            $result = mysqli_query($conn, $sql);

            if(mysqli_num_rows($result) > 0) {
                //게시물 출력
                while($row = mysqli_fetch_assoc($result)) {
                    $index = $row['board_id'];
                    $id = $row['user_id'];
                    $title = $row['title'];
                    echo '<p><a href="view_inquiry_board.php?index='.$index.'">'.$title.'</a> : '.$id.'작성함</p>';
                }
            } else {
                echo "게시물이 없습니다!";
            }
            
            echo '<p> [ ';
            
            // 현재 페이지를 10으로 나눈 몫에 10을 곱한 값에서 1을 빼면
            // 현재 페이지가 몇 번째 페이지 블록에 있는지 알 수 있습니다.
            $block_start = floor(($page-1)/10)*10;

            if ($block_start > 1) {
                // 이전 페이지 블록이 있다면, 다음 버튼을 출력합니다.
                $next_block_start = $block_start - 10;
                if($next_block_start == 0) {
                    $next_block_start += 1; //0페이지는 존재 하지 않기에 1더한다
                }
                echo '<a href="?page=' . $next_block_start .'"><< </a>';
            }

            // 이전 버튼 출력
            if ($page > 1) {
                echo '<a href="?page=' . ($page-1) .'">< </a> ';
            }
            
            // 페이지 링크 출력
            for ($i = $block_start+1; $i <= min($block_start+10, $total_pages); $i++) {
                if($i == $page) {
                    echo '<strong>'.$i.' </strong>';
                } else {
                    echo '<a href="?page=' . $i .'">'.$i. '</a> ';
                }
                echo ' ';
            }

            // 다음 버튼 출력
            if ($page < $total_pages) {
                echo '<a href="?page=' . ($page+1) .'">> </a> ';
            }
            
            if ($block_start+10 < $total_pages) {
                // 다음 페이지 블록이 있다면, 다음 버튼을 출력합니다.
                $next_block_start = $block_start + 11;
                echo '<a href="?page=' . $next_block_start .'">>></a>';
            }

            echo ' ]</p>';
            
        ?>
        </p>
        <p></p>
        <form action="inquiry_write_board.php" method="POST"> 
            <p><input type="submit" name="write" value="게시판 작성"></p>
        </form>
        <form action="login.php">
            <p><input type="submit" value="로그인페이지로"></p>
        </form>
        <form action="board.php" method="GET"> 
            <p><input type="submit" value="검색 초기화"></p>
            <input type="hidden" name="search" value="">
            <input type="hidden" name="sort" value="">
            <input type="hidden" name="date_value" value="">
        </form>
    </body>
</html>

 

 

 

 

 

-inquiry_delete_board.php

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    session_start(); //세션 시작
    
    //게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_inquiry);
    
    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
    
    //삭제용 sql문 작성
    $sql = "DELETE FROM $db_inquiry WHERE board_id='$board_id'";

    //비밀번호 조회용 sql문 작성
    $sql_pw = "SELECT pw FROM $db_inquiry WHERE board_id='$board_id'";

    //쿼리문 실행(비밀번호)
    $result = mysqli_query($conn, $sql_pw);

    //결과값 가져오기
    $row = mysqli_fetch_assoc($result);

    if(isset($_POST['pw'])) {
        //비밀번호 값을 가져온다
        $hashed_pw = $row['pw'];

        if(password_verify($_POST['pw'],$hashed_pw)) {
            //실행
            if(mysqli_query($conn,$sql)) {
                //실행 후 게시판으로 이동
                header("Location: inquiry_board.php");
            } else {
                //오류 발생 시 메시지 호출
                $_SESSION['write_error'] = '삭제하는데 실패했습니다! 조금 있다 하십시오';
                header("Location: view_inquiry_board.php");
            }

        } else {
            //비밀번호 틀린경우
            $_SESSION['write_error'] = '비밀번호가 틀립니다!';
            header("Location: view_inquiry_board?index=$board_id");
        }
    } else {
        echo "<form method='POST' action='inquiry_delete_board.php?board_id=$board_id'>
                <input type='password' name='pw' value=''>
                <p><button type='submit'>인증하기</button></p>
             </form>";
    }

    exit();
?>

 

 

-inquiry_fix_process_board.php

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>게시판 수정 중</title>
    </head>
    <body>

        <?php 
            include 'DB_INFO.php'; //데이터 베이스 정보

            session_start();

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            //GET방식으로 board_id 받기
            $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));


            //작성된 게시물들 조회 문
            $sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";

            //쿼리문 실행
            $result = mysqli_query($conn, $sql);

            //결과값 가져오기
            $row = mysqli_fetch_assoc($result);

            
            if(isset($_POST['pw'])) {
                //비밀번호 값을 가져온다
                $hashed_pw = $row['pw'];

                if(password_verify($_POST['pw'],$hashed_pw)) {
                    //비밀번호가 맞으면
                    echo "<form action='inquiry_write_process_board.php' method='POST'>
                            <p><input type='text' name='user_id' maxlength='44' value='".$row['user_id']."' placeholder='작성자이름'></p>
                            <p><input type='text' name='title' maxlength='44' value='".$row['title']."' placeholder='제목 입력, 최대 44자까지 가능합니다'></p>
                            <p><textarea name='detail' rows='20' cols='20' maxlength='254' placeholder='내용 작성,최대 254자 가능합니다'>".$row['detail']."</textarea></p>
                            <p><input type='submit' value='수정하기'></p>
                            <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        </form>";


                } else {    
                    //비밀번호 틀린경우
                    $_SESSION['write_error'] = '비밀번호가 틀립니다!';
                    
                    header("Location: view_inquiry_board.php?index=".$board_id);
                    exit();
                }
            } else {
                echo "<form method='POST' action='inquiry_fix_process_board.php?board_id=$board_id'>
                    <input type='password' name='pw' value=''>
                    <p><button type='submit'>인증하기</button></p>
                  </form>";
            }
            
        ?>

        <p>
        </p>
    </body>
</html>

 

 

 

 

-inquiry_write_board.php

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>문의게시판 작성 중</title>
    </head>
    <body>
        <h1>문의게시판 작성!</h1>
        <form action="inquiry_write_process_board.php" method="POST">
            <label>ID:</label>
            <input type="text" name="user_id" placeholder="작성자이름,특수기호X" required><br><br>
            <p><input type="text" name="title" maxlegth="44" placeholder="제목 입력, 최대 44자까지 가능합니다" required></p>
            <p><textarea name="detail" rows="20" cols="20" maxlength="254" placeholder="내용 작성,최대 254자 가능합니다" required></textarea></p>
            <p><input type="password" name="pw" maxlegth="44" placeholder="비밀번호입력" required></p>
            <p><input type="submit" value="올리기"></p>
        </form>
        
        <form action="inquiry_board.php"> 
            <p><input type="submit" value="돌아가기"></p>
        </form>
        <p>
        <?php session_start();
                if (isset($_SESSION['write_error'])) {
                    echo $_SESSION['write_error'];
                    unset($_SESSION['write_error']);
                }
        ?>
        </p>
    </body>
</html>

 

 

 

 

-inquiry_write_process_board.php

 

<?php
    include 'DB_INFO.php'; //데이터 베이스 정보

    session_start(); //세션 시작

    //문의게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_inquiry);

    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    if(isset($_POST['board_id'])){ //수정시 받아온다
        $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['board_id']),FILTER_SANITIZE_SPECIAL_CHARS));
    } else {
        $board_id = null;
    }
    $title = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['title']),FILTER_SANITIZE_SPECIAL_CHARS));
    $detail = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['detail']),FILTER_SANITIZE_SPECIAL_CHARS));

    //POST으로 유저 이름 받기
    $user_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_POST['user_id']),FILTER_SANITIZE_SPECIAL_CHARS));

    if(isset($_POST['pw'])){
        //비밀번호가 있으면 해싱
        $hashed_pw = password_hash($_POST['pw'], PASSWORD_DEFAULT);
    }

    if(isset($board_id)) {
        //board_id가 있다는 것은 수정을 의미
        $sql = "UPDATE $db_inquiry SET user_id='$user_id', title = '$title', detail='$detail' WHERE board_id='$board_id' ";
    }
    else {
        //board_id가 없으니 새로 만드는 sql문
        $sql = "INSERT INTO $db_inquiry (user_id, title, detail,pw) VALUES ('$user_id', '$title', '$detail','$hashed_pw')";
    }

    //sql문 실행
    if(mysqli_query($conn,$sql)) {
        //수정인 경우 바로 게시판 보이게 함
        if(isset($board_id)) {
            $_SESSION['write_error'] = '수정되었습니다!';
            header("Location: view_inquiry_board.php?index=$board_id");
        }
        else {
            $board_id = mysqli_insert_id($conn); // 새로 생성한 게시물의 id를 가져옴
            $_SESSION['write_error'] = '작성되었습니다!';
            header("Location: view_inquiry_board.php?index=$board_id");
        }
    } else {
        $_SESSION['write_error'] = '작성 중 오류가 발생하였습니다.';
        header("Location: view_inquiry_board.php");
    }

    exit();
?>

 

 

 

 

-view_inquiry_board.php

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>문의게시물 보는중</title>
    </head>
    <body>
        <p>
        <?php 

            include 'DB_INFO.php'; //데이터 베이스 정보

            //데이터베이스 연결
            $conn = mysqli_connect($host,$username,$password,$db_inquiry);

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }

            //GET방식으로 전달된 index 받는다
            $board_id = mysqli_real_escape_string($conn,filter_var(strip_tags($_GET['index']),FILTER_SANITIZE_SPECIAL_CHARS));

            //작성된 게시물들 조회 문
            $sql = "SELECT * FROM $db_inquiry WHERE board_id = '$board_id' ";
            //쿼리문 실행
            $result = mysqli_query($conn, $sql);
            
            //게시물 출력
            while($row = mysqli_fetch_assoc($result)) {
                echo '<p>ID: '.$row['user_id'].'</p>';
                echo '<p>Title: '.$row['title'].'</p>';
                echo '<p>Detail: '.$row['detail'].'</p>';
                echo '<p>Date: '.$row['date_value'].'</p>';

                //게시물 수정 버튼을 보여준다
                echo "<form method='GET' action='inquiry_fix_process_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>게시물 수정</button></p>
                      </form>";

                //게시물 삭제 버튼을 보여준다
                echo "<form method='GET' action='inquiry_delete_board.php'>
                        <input type='hidden' name='board_id' value='".$row['board_id']."'>
                        <p><button type='submit'>삭제</button></p>
                      </form>";          
            }
        ?>
        </p>
        <p>
        <?php session_start();
                if (isset($_SESSION['write_error'])) {
                    echo $_SESSION['write_error'];
                    unset($_SESSION['write_error']);
                }
        ?>
        </p>
        <p></p>
        <form action="inquiry_board.php">
            <p><input type="submit" value="문의페이지로"></p>
        </form>
        <form action="login.php">
            <p><input type="submit" value="로그인페이지로"></p>
        </form>
    </body>
</html>

 

 

 

진짜.. 거의 다 개발했습니다..  이제 조금씩 수정만 하면 됩니다!