본문 바로가기

개발과제

[노말틱 모의 해킹 취업반 5주차 개발과제 ] 게시판 만들기(1) - 리스트 확인, 읽기, 쓰기

안녕하세요! 이제 전 포스팅까지 해서 로그인과 회원가입, 주소 등록까지 했습니다!

 

이제 메인페이지에서 메뉴 버튼을 만들고 만약 메뉴 버튼 누르면 게시판이 나오게 하겠습니다.

 

 

only_login.php로 가겠습니다.

 

우선 메튜 버튼 먼저 만들겠습니다!

 

게시판이니깐 board.php로 가게 시키겠습니다

 

        <form action="board.php">
            <p><input type="submit" value="메뉴"></p>
        </form>

 

 

메뉴인데 왜 게시판이죠?? -> 나중에 게시판 말고도 다른 것도 만들 예정입니다!

 

저장 후 잘 생성됐나 확인하겠습니다.

 

 

잘 됬네요

 

 

이제 board.php 파일 만들고 게시판을 만들겠습니다!

 

우선 생각을 해봅시다. 일단은 로그인 사용자가 와야만 되겠죠?

그러니 세션을 확인하는 함수랑 게시판을 저장하는 용도의 새로운 데이터베이스도 필요하겠네요!

 

그러고 게시판 쓰는 버튼 필요할 거 같고요.

 

그리고.. 리스트 확인할 수 있게 제목만 따로 적게 하겠습니다.

또 그 리스트를 누르면 내용을 확인 할 수 있게 하겠습니다!

 

간단하게 순서도를 그려보겠습니다.

 

 

못 그려도 봐줘요!

 

 

이제 짜봅시다. 저는 디자인은 딱히 생각 안 하겠습니다.

굳이 필요하면 다 만들고 난 뒤에 디자인할게요!

 

일단 세션 확인해서 로그인 정보가 있는지 없는지 확인하겠습니다

 

only_login.php에 그대로 가져오겠습니다.

 

    session_start(); //세션 시작

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

 

 

그리고 쓰기 버튼을 만들겠습니다.

 

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

 

write_board.php는 게시판 작성 할 때 나오게 되는 페이지입니다

 

리스트 출력은 나중에 하죠!

 

 

그리고 한번 확인해 보겠습니다

 

 

깔끔하진 않네요

 

이제 작성 누르면 작성 페이지로 가게 하겠습니다!

 

그전에 write_board.php 만들겠습니다.

 

#sudo touch write_board.php

 

 

 

 

그리고 데이터 베이스도 새로 만들겠습니다.

저는 phpmyadmin 통해 만들겠습니다.

 

 

저기 '새로운' 보이시나요?

 

왼쪽 데이터베이스 란에 새로운 눌러서 데이터베이스를 만들겠습니다!

 

이름은.. BOARD_INFO 로 하겠습니다.

 

만들고 난 뒤에 이제 테이블 이름을 BOARD_INFO로 하고요

칼럼 수는 음.. 인덱스 번호랑 어느 유저가 작성했는지 넣을 id, 제목, 내용, 날짜까지 해서 5개 만들겠습니다.

 

 

이렇게요

 

그리고

 

 

 

이렇게 작성하겠습니다

각각 index id title detail date 이렇게 설정하겠습니다!

 

 

sql은

 

CREATE TABLE `BOARD_INFO`.`BOARD_INFO` (`index` INT(11) NOT NULL AUTO_INCREMENT COMMENT '인덱스' , `id` VARCHAR(45) NOT NULL COMMENT '유저이름' , `title` VARCHAR(45) NOT NULL COMMENT '제목' , `detail` VARCHAR(255) NOT NULL COMMENT '내용' , `date` DATE NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '날짜' , PRIMARY KEY (`index`)) ENGINE = InnoDB COMMENT = '게시판 데이터베이스';

 

이렇게 작성한다고 합니다

 

그리고 밑에 저장 눌러서 저장하겠습니다

 

 

잘됬네요! 만약 더 필요하면 그때 더 추가하죠

 

 

이제 작성을 하겠습니다

 

아 그리고 저희가 .env에 저장한 DB_INFO에 추가하겠습니다!

 

#sudo vi /etc/apache2/envvars

 

 

추가!

 

저장 후 나간 뒤 DB_INFO.php 문도 수정하겠습니다

 

이렇게요

 

좋습니다 이제 사전 준비는 다한 거 같으니 write_board.php 만들겠습니다!

 

제목 작성 용 칸 따로 내용 작성용 칸 따로 만들겠습니다

 

login.php에서 거의 복붙 했습니다.

 

그리고 textarea 이용해서 작성 란의 행 열 크기를 20으로 정했습니다.

 

그리고 maxlength 이용해 최대 작성가능한 수를 정했습니다

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>게시판 작성 중</title>
    </head>
    <body>
        <h1>게시판 작성!</h1>
        <?php 
            session_start(); //세션 시작

            if(!isset($_SESSION['login_id'])) {
                //로그인하지 않은 사용자
                header("Location: login.php"); //login 화면으로 바꾼다
                exit(); //이 페이지를 바로 닫는다
            }
        ?>
        <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>
        <form action="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>

 

생각해 보니 제가 로그인이랑 회원가입 할 때 maxlength 설정 안 했네요! 그거는 따로 수정, 보완하겠습니다

.

.

.

 

일단 확인해 보죠

 

잘됬네요!

 

 

그리고 작성하면 post로 write_process_board.php 로 통해 데이터베이스 작성하게 했습니다!

 

그러니 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 받은 것들을 따로 변수에 저장하겠습니다

 

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

    //session으로 유저 이름 받기
    $user_id = $_SESSION['login_id'];

 

session 통해 id도 받았습니다!

 

그리고 sql문 작성하겠습니다.

 

$sql = "INSERT INTO $db_board (id,title,detail) values ('$user_id','$title','$detail')";

 

그리고 실행해서 오류가 나면 세션 통해 보내겠습니다!

 

    //sql문 실행
    if(mysqli_query($conn,$sql)) {
        $_SESSION['write_error'] = '작성되었습니다!';
        header("Location: write_board.php");
    } else {
        $_SESSION['write_error'] = '작성 중 오류가 발생하였습니다.';
        header("Location: write_board.php");
    }

 

그리고 마지막은 exit() 했습니다!

 

총코드는 맨 밑에 있습니다!

.

.

.

.

실행하겠습니다

 

 

저거만 빨간 밑줄 쳐져 있네요 왤까요

 

올리기!

 

..오류가 나오네요!

 

분명히 잘 적었는데 어디서 잘 못됐네 확인했더니 저희가 전에 설정한 .env에서 충돌이 난 거 같습니다.

 

잠시 없애고 다시 해보겠습니다

 

#sudo vi /etc/apache2/httpd.conf

 

들어가서 안에 있는 내용 전부 지웁니다!

 

깨끗

 

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

 

 

나오네요!!

 

이제 phpmyadmin으로 들어가서 다시 확인해 보겠습니다.

 

 

이렇게 잘 저장되어 있는 것을 확인할 수 있습니다.

 

개발하는 동안 저 .env 접근하는 설정은 잠시 없애두겠습니다. 이런 충돌을 방지해서 말이죠!

.

.

.

.

이제 저희가 올린 게시판 글을 확인할 수 있게 하겠습니다

 

board.php로 가겠습니다.

 

 

그리고 일단 DB 랑 연결을 하겠습니다.

 

똑같이요

 

그리고 이제 작성된 게시물들을 보이게 하기 위해 sql문을 작성하겠습니다

 

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

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

 

저기 index에 '' 붙인 이유는 밑에서 설명하겠습니다

 

그리고 mysqli_num_rows 통해 결과 값이 있는지 확인하고

 

mysqli_fetch_assoc() 함수 이용하여 결괏값에 한 행씩 가져와서 출력하겠습니다.

 

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

 

여기서 게시물에 하이퍼링크 걸어서 열어서 볼 수 있게 했습니다!

URL에 index을 같이 보내어서 viw_board.php 에서 확인 할 수 있게 하겠습니다.

GET방식으로 보낸 것입니다.

 

이 게시물 데이터베이스에 비밀번호나 주소 이런 게 안 담겨 있기에

게시물에 딱히 중요한 정보를 적지 않은 이상 보안상에 문제가 없기에 이렇게 했습니다!

 

총코드는 맨 밑에 있습니다.

 

한번 해보겠습니다.

 

잘 나오네요!

 

근데 약간 더 수정하겠습니다. 어느 유저가 작성했는지 표시까지 하겠습니다

 

                //게시물 출력
                while($row = mysqli_fetch_assoc($result)) {
                    echo '<p><a href="view_board.php?id='.$row['id'].'">'.$row['title'].'</a> : '.$row['id'].'작성함</p>';
                }

 

편안

 

이제 들어가서 무슨 내용이 있는지까지 출력하겠습니다

 

view_board.php 만들겠습니다.

 

그리고 똑같이 세션이랑 DB랑 연결하겠습니다!

 

이제 이 코드는 그만 보여줘도 될거 같네요 지겨워요

 

그리고 GET방식으로 받은 값을 따로 저장하겠습니다

 

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

 

그러고 난 뒤에 sql 작성해서 내용이랑 제목이랑 날짜 전부 가져오게 하겠습니다!

 

그리고 난 뒤에 mysqli_fetch_assoc() 함수 똑같이 이용하여

 

반복문 통해 출력하겠습니다.

 

 

            while($row = mysqli_fetch_assoc($result)) {
                echo '<p>ID: '.$row['id'].'</p>';
                echo '<p>Title: '.$row['title'].'</p>';
                echo '<p>Detail: '.$row['detail'].'</p>';
            }

if문은 굳이 안 써도 되겠죠! 눌렀다는 게 게시물이 있다는 말이니깐요!

 

 

좋아요.. 일단 이렇게 해서 마치면 됩니다.

.

.

.

.

 

아 참고로 제가 아무것도 모르고 데이터베이스 이름을 index라 했는데 원래는 매우 안 좋다고 합니다.

 

왜냐하면 데이터베이스 언어 중에 index라고 예약어가 이미 있어서 가독성이 매우 떨어진다고 해요..

 

그대로 쓸 땐 'index' 이렇게 쓰면은 상관은 없지만 가독성을 위해 지금 수정하겠습니다 죄송합니다

 

index 이름을 전부 없애겠습니다

 

이거는 LOGIN_INFO 테이블의 index을 user_id로 바꿧습니다

LOGIN 관련에서는 index을 사용한 적이 없네요! 그러니 칼럼 이름만 바꾸면 되고요

BOARD 관련은 저희가 방금까지 사용했으니 조금 수정해야만 합니다

 

수정된 코드는 맨 밑에다가 작성했습니다!

.

.

.

.

어쨌든 실행해 보겠습니다.

 

 

 

제발 한 번에 되길!!

 

나오네요

 

URL 보시면 index로 보내진 것도 확인되고요

눌러서 게시물을 확인이 가능하다는 것을 확인했습니다!

 

여기서 날짜까지 추가하겠습니다

 

좋아요!

 

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

다음에는 수정기능과 삭제 기능 그리고 검색기능까지 넣겠습니다!

 

다수 글 올렸을 때

 

 

 

다행히 잘 되네요

 

감사합니다!

 

.

.

.

.

.

.

 

-board.php

 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Welcome!</title>
    </head>
    <body>
        <h1>MENU</h1>
        <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";

            //쿼리문 실행
            $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="board.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>';
            }
        
        ?>
        </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>

 

 

 

 

-write_board.php

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>게시판 작성 중</title>
    </head>
    <body>
        <h1>게시판 작성!</h1>
        <?php 
            session_start(); //세션 시작

            if(!isset($_SESSION['login_id'])) {
                //로그인하지 않은 사용자
                header("Location: login.php"); //login 화면으로 바꾼다
                exit(); //이 페이지를 바로 닫는다
            }
        ?>
        <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>
        <form action="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>

 

 

 

 

-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로 전달된 정보 받기
    $title = mysqli_real_escape_string($conn,$_POST['title']);
    $detail = mysqli_real_escape_string($conn,$_POST['detail']);

    //session으로 유저 이름 받기
    $user_id = $_SESSION['login_id'];

    //쿼리문 작성
    $sql = "INSERT INTO $db_board (id, title, detail) VALUES ('$user_id', '$title', '$detail')";

    echo $sql;

    //sql문 실행
    if(mysqli_query($conn,$sql)) {
        $_SESSION['write_error'] = '작성되었습니다!';
        header("Location: write_board.php");
    } else {
        $_SESSION['write_error'] = '작성 중 오류가 발생하였습니다.';
        header("Location: write_board.php");
    }

    exit();
?>