본문 바로가기

개발과제

[노말틱 모의 해킹 취업반 6주차 개발과제 ] 게시판 만들기(2) - 수정, 삭제, 검색

4/18일 수정 내용 --- view_board.php에 작성 중 오류 인 write_error을 추가로 코딩했습니다 맨 밑에 보시면 있습니다

                                write_process_board.php 내용도 조금 수정했습니다. 수정되면 수정되었습니다

                                 나오게 하게 했습니다.

 

 

 

안녕하세요!

이번엔 전에 만든 게시판에서 자신의 게시물이면 수정이 가능하고 삭제, 검색 기능까지 넣겠습니다.

.

.

.

.

수정 기능부터 만들겠습니다.

 

새로운 php 파일이 필요하겠네요! 저는 fix_board.php 을 만들겠습니다.

 

#sudo touch fix_board.php

 

그리고 수정 버튼을 만들어야 되겠죠!

 

view_board.php에 로그인 한 사람이랑 작성된 게시물의 ID가 같으면 수정 버튼 생기게 만들겠습니다

 

while 문 안에다가 넣겠습니다!

 

            //게시물 출력
            while($row = mysqli_fetch_assoc($result)) {
                echo '<p>ID: '.$row['id'].'</p>';
                echo '<p>Title: '.$row['title'].'</p>';
                echo '<p>Detail: '.$row['detail'].'</p>';
                echo '<p>Date: '.$row['date'].'</p>';

                //로그인한 사용자의 정보 가져온다
                $user_id = $_SESSION['login_id'];

                //게시물 작성자와 로그인한 ID와 일치한 경우
                if($row['id'] == $user_id) {
                    //게시물 수정 버튼을 보여준다
                    echo "<form method='POST' action='fix_board.php'>
                            <input type='hidden' name='board_id' value='".$row['board_id']."'>
                            <button type='submit'>게시물 수정</button>
                          </form>";
                }
            }

 

input 타입 hidden 형식에 board_Id을 보냈습니다.

 

한번 확인해보겠습니다

 

잘 나오네요

 

 

이제 fix_board.php로 가겠습니다

write_board.php을 가져 와서 조금 수정하겠습니다!

 

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

        <?php 
            session_start(); //세션 시작

            if(!isset($_SESSION['login_id'])) {
                //로그인하지 않은 사용자
                header("Location: login.php"); //login 화면으로 바꾼다
                exit(); //이 페이지를 바로 닫는다
            }

            $index = $_POST['board_id'];
        ?>
        <form action="write_process_board.php" method="POST"> 
            <p><input type="text" name="title" maxlegth="44" placeholder="제목 입력, 최대 44자까지 가능합니다"></p>
            <p><textarea name="detail" rows="20" cols="20" maxlength="254" placeholder="내용 작성,최대 254자 가능합니다"></textarea></p>
            <p><input type="submit" value="올리기"></p>
        </form>
        <?php
            echo '<p><a href="view_board.php?index='.$index.'">수정</p>';
        ?>
        <p>
        <?php session_start();
                if (isset($_SESSION['write_error'])) {
                    echo $_SESSION['write_error'];
                    unset($_SESSION['write_error']);
                }
        ?>
        </p>
    </body>
</html>

POST로 보내진 board_id를 board_id으로 저장하고 수정에 URL에 'index=$board_id' 보내게 했습니다!

이렇게 하는 이유는 수정하기 누르면 바로 수정된 게시물을 보게 하기 위함입니다.

.

.

.

이제 저희는 중간에 있는 form에 있는 코드를 고치면 되겠죠

 

board_id 을 알고 있으니 저는 데이터베이스 통해 가져오겠습니다.

 

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

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

            //데이터베이스 오류시 종료
            if(mysqli_connect_errno()) {
                die("데이터 베이스 오류: ". mysqli_connect_error());
            }
            
                        //POST방식으로 board_id 받기
            $board_id = $_POST['board_id'];

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

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

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

 

이렇게요

 

그리고 form에 원래 있던 내용들을 각각 출력하고 write_process_board.php 보낼때 board_id 값도 같이 보내겠습니다! 

 

<form action="write_process_board.php" method="POST"> 
      <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>

이렇게요

 

그리고 수정하는 것은 sql문에 update을 써야만 합니다

 

그러니 write_process_board.php의 코드를 수정하겠습니다

 

우선 post로 보내어진 board_id을 받습니다

 

    //POST로 전달된 정보 받기
    if(isset($_POST['board_id'])){
        $board_id = mysqli_real_escape_string($conn,$_POST['board_id']);
    } else {
        $board_id = null; //board_id가 없으면 null로 지정
    }   	
    $title = mysqli_real_escape_string($conn,$_POST['title']);
    $detail = mysqli_real_escape_string($conn,$_POST['detail']);

이렇게 추가해서 수정합니다

 

그리고 if else 이용해서 수정인지 추가인지 구별하고 sql문을 작성하겠습니다

 

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

 

이렇게요

 

됬습니다! 수정은 이렇게 하고 실행해보겠습니다

 

수정!

 

 

이렇게하고 수정하기!

 

됬다네요!

 

그리고 나가서 확인을 하면

 

됬네요!

 

이대로 하면 좋긴 한데 그래도 조금 수정하겠습니다.

만약 수정을 한다면 바로 수정된 게시판을 볼 수 있게 코딩을 하겠습니다.

 

 

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

 

 

이렇게 하면 되겠죠

 

실행 해보겠습니다

 

 

 

이렇게하고 수정하기 누르면?

 

이렇게 바로 수정된 게시판이 보이네요!

 

 

좋습니다! 이렇게 해서 수정하기를 마치겠습니다

.

.

.

.

.

그 다음으로 게시판 삭제 기능을 넣겠습니다.

 

마찬가지로 로그인 한 사람과 게시물의 ID가 같으면 삭제 버튼이 보이게 하겠습니다.

 

그러니 view_board.php 에 추가 코딩 하겠습니다!

 

                //게시물 작성자와 로그인한 ID와 일치한 경우
                if($row['id'] == $user_id) {
                    //게시물 수정 버튼을 보여준다
                    echo "<form method='POST' action='fix_board.php'>
                            <input type='hidden' name='board_id' value='".$row['board_id']."'>
                            <p><button type='submit'>게시물 수정</button></p>
                          </form>";

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

 

 

그리고 삭제 해주는 php을 또 만들겠습니다.

 

#sudo touch delete_board.php

 

그리고 오로지 삭제만 하면 되니 그냥 php 구문만 만들겠습니다.

 

일단 session과 데이터베이스 연결을 하겠습니다.

 

그러고 난뒤에 POST값을 받고 sql 문을 작성하면 되겠죠!

 

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

    session_start(); //세션 시작
    
    if(!isset($_SESSION['login_id'])) {
        //로그인하지 않은 사용자
        header("Location: login.php"); //login 화면으로 바꾼다
        exit(); //이 페이지를 바로 닫는다
    }
    
    //게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_board);
    
    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    $board_id = mysqli_real_escape_string($conn,$_POST['board_id']);

    //session으로 유저 이름 받기
    $user_id = $_SESSION['login_id'];
    
    //삭제용 sql문 작성
    $sql = "DELETE FROM $db_board WHERE board_id=$board_id";

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

    exit();
?>

 

이렇게요

 

한번 실행해보곘습니다

 

삭제 버튼 잘 있구요

 

삭제가 잘 됬네요!

 

좋아요 이렇게 삭제 기능을 마치겠습니다.

.

.

.

.

.

.

.

.

다음으로 검색 기능을 넣겠습니다.

 

board.php에서 검색 기능을 넣으면 되겠죠!

 

일단 text박스을 만들고 

 

        <form method ="POST" action="board.php">
            <input type = "text" name="search" placeholder="검색">
            <input type="submit" value="검색">
        </form>

 

그리고 if와 isset으로 검색이 된 경우을 구별하겟습니다

그리고 sql문 저장

 

            //검색이 입력된 경우
            if(isset($_POST['search']) && !empty($_POST['search'])) {
                $search = mysqli_real_escape_string($conn, $_POST['search']);
                $sql = "SELECT board_id,id,title FROM $db_board WHERE title LIKE '%$search%'";
            }

LIKE는 뒤에 이 문자가 포함 되어 있으면 전부 검색 되게 하는 겁니다!

%가 아무 문자을 뜻 합니다. 즉 %$search%는 앞 뒤로 아무 문자 와도 $search가 포함 되면 검색되게 하는 겁니다

그리고 실행 해보겠습니다!

 

잘 있네요

 

검색!

 

 

 

다행히.. 이번엔 한 번에 됬네요

 

.

.

.

이렇게 게시판 작성에 추가를 했습니다.

다음엔 게시판 페이징도 추가 하겠습니다!

 

이렇게 글을 마치겠습니다 감사합니다!

 

.

.

.

.

.

-board.php

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Welcome!</title>
    </head>
    <body>
        <h1>MENU</h1>
        <form method ="POST" action="board.php">
            <input type = "text" name="search" placeholder="검색">
            <input type="submit" value="검색">
        </form>
        <p>
        <?php 
            include 'DB_INFO.php'; //데이터 베이스 정보

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

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

            session_start(); //세션 시작

            if(!isset($_SESSION['login_id'])) {
                //로그인하지 않은 사용자
                header("Location: login.php"); //login 화면으로 바꾼다
                exit(); //이 페이지를 바로 닫는다
            }

            //작성된 게시물들 조회 문
            $sql = "SELECT board_id,id,title FROM $db_board";

            //검색이 입력된 경우
            if(isset($_POST['search']) && !empty($_POST['search'])) {
                $search = mysqli_real_escape_string($conn, $_POST['search']);
                $sql = "SELECT board_id,id,title FROM $db_board WHERE title LIKE '%$search%'";
            }
            
            //쿼리문 실행
            $result = mysqli_query($conn, $sql);

            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.'작성함</p>';
                }
            } else {
                echo "게시물이 없습니다!";
            }
        
        ?>
        </p>
        <p></p>
        <form action="write_board.php" method="POST"> 
            <p><input type="submit" name="write" value="게시판 작성"></p>
        </form>
        <form action="only_login.php"> 
            <p><input type="submit" value="메인페이지로"></p>
        </form>
    </body>
</html>

 

 

-view_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_board);

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

            session_start(); //세션 시작

            if(!isset($_SESSION['login_id'])) {
                //로그인하지 않은 사용자
                header("Location: login.php"); //login 화면으로 바꾼다
                exit(); //이 페이지를 바로 닫는다
            }

            //GET방식으로 전달된 index 받는다
            $board_id = $_GET['index'];

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

                //로그인한 사용자의 정보 가져온다
                $user_id = $_SESSION['login_id'];

                //게시물 작성자와 로그인한 ID와 일치한 경우
                if($row['id'] == $user_id) {
                    //게시물 수정 버튼을 보여준다
                    echo "<form method='POST' action='fix_board.php'>
                            <input type='hidden' name='board_id' value='".$row['board_id']."'>
                            <p><button type='submit'>게시물 수정</button></p>
                          </form>";

                    //게시물 삭제 버튼을 보여준다
                    echo "<form method='POST' action='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="write_board.php" method="POST"> 
            <p><input type="submit" name="write" value="게시판 작성"></p>
        </form>
        <form action="board.php"> 
            <p><input type="submit" value="메인페이지로"></p>
        </form>
    </body>
</html>

 

 

-fix_board.php

 

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

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

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

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

            if(!isset($_SESSION['login_id'])) {
                //로그인하지 않은 사용자
                header("Location: login.php"); //login 화면으로 바꾼다
                exit(); //이 페이지를 바로 닫는다
            }
            //POST방식으로 board_id 받기
            $board_id = $_POST['board_id'];

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

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

            //결과값 가져오기
            $row = mysqli_fetch_assoc($result);
        ?>
        <form action="write_process_board.php" method="POST"> 
            <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>

 

 

 

-delete_board.php

 

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

    session_start(); //세션 시작
    
    if(!isset($_SESSION['login_id'])) {
        //로그인하지 않은 사용자
        header("Location: login.php"); //login 화면으로 바꾼다
        exit(); //이 페이지를 바로 닫는다
    }
    
    //게시판 데이터베이스 연결
    $conn = mysqli_connect($host,$username,$password, $db_board);
    
    //데이터베이스 오류시 종료
    if(mysqli_connect_errno()) {
        die("데이터 베이스 오류: ". mysqli_connect_error());
    }

    //POST로 전달된 정보 받기
    $board_id = mysqli_real_escape_string($conn,$_POST['board_id']);

    //session으로 유저 이름 받기
    $user_id = $_SESSION['login_id'];
    
    //삭제용 sql문 작성
    $sql = "DELETE FROM $db_board WHERE board_id=$board_id";

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

    exit();
?>

 

-write_process_board.php

 

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

    session_start(); //세션 시작

    if(!isset($_SESSION['login_id'])) {
        //로그인하지 않은 사용자
        header("Location: login.php"); //login 화면으로 바꾼다
        exit(); //이 페이지를 바로 닫는다
    }

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

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

    //POST로 전달된 정보 받기
    if(isset($_POST['board_id'])){
        $board_id = mysqli_real_escape_string($conn,$_POST['board_id']);
    } else {
        $board_id = null;
    }
    $title = mysqli_real_escape_string($conn,$_POST['title']);
    $detail = mysqli_real_escape_string($conn,$_POST['detail']);

    if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_FILES['file'])) {
        // 업로드된 파일 정보 가져오기
        $file_name = $_FILES['file']['name'];
        $timestamp = time(); // 현재 시간을 초로 반환
        $new_file_name = $timestamp . '_' . $file_name; // 현재 시간과 원래 파일 이름을 합쳐 새로운 파일 이름 생성
        $file_tmp_name = $_FILES['file']['tmp_name'];
        $file_size = $_FILES['file']['size'];
        $file_error = $_FILES['file']['error'];
        $allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif','txt','zip','hwp','word']; //MIME 허락 된 것
    
        // 파일 업로드가 정상적으로 처리되었는지 확인
        if ($file_error === UPLOAD_ERR_OK) {
            // 파일 MIME 타입 확인
            $file_mime_type = mime_content_type($file_tmp_name);
    
            if (in_array($file_mime_type, $allowed_mime_types)) {
                // 파일 저장 경로
                $upload_path = '/path/to/upload/directory/' . $new_file_name;
    
                // 파일 이동 및 저장
                if (move_uploaded_file($file_tmp_name, $upload_path)) {
                    echo '파일 업로드 성공';
                } else {
                    echo '파일 업로드 실패';
                }
            } else {
                echo '잘못된 파일 형식입니다';
            }
        } else {
            echo '파일 업로드 실패';
        }
    }

    //session으로 유저 이름 받기
    $user_id = $_SESSION['login_id'];
    echo $board_id;
    if(isset($board_id)) {
        //board_id가 있다는 것은 수정을 의미
        $sql = "UPDATE $db_board SET title = '$title', detail='$detail' WHERE board_id='$board_id' ";
    }
    else {
        //board_id가 없으니 새로 만드는 sql문
        $sql = "INSERT INTO $db_board (id, title, detail) VALUES ('$user_id', '$title', '$detail')";
    }

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

    exit();
?>