PHP로 구현한 CRUD 게시판
이전에 JSP, model1, model2, Spring MVC로 구현했었던 형태와 유사하게
PHP를 사용하여, 게시물 목록을 불러오고(이전, 다음 페이징 처리 포함), 게시물을 입력하고, 삭제하고, 수정하고, 글 내용을 읽을 수 있는
게시판을 구현해 보았다.
PHP는 XAMPP를 다운 받아서 PHP와 Apache만을 설치하였다. (https://www.apachefriends.org/index.html)
board_list.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>board_list.php</title> <link rel="stylesheet" href="/css/bootstrap.css"> </head> <body> <h1 class="display-4">board_list.php</h1> <?php $currentPage = 1; if (isset($_GET["currentPage"])) { $currentPage = $_GET["currentPage"]; } //mysqli_connect()함수로 커넥션 객체 생성 $conn = mysqli_connect("localhost", "root", "java0000","jjdev"); //커넥션 객체 생성 확인 if($conn) { echo "연결 성공<br>"; } else { die("연결 실패 : " .mysqli_error()); } //페이징 작업을 위한 테이블 내 전체 행 갯수 조회 쿼리 $sqlCount = "SELECT count(*) FROM board"; $resultCount = mysqli_query($conn,$sqlCount); if($rowCount = mysqli_fetch_array($resultCount)){ $totalRowNum = $rowCount["count(*)"]; //php는 지역 변수를 밖에서 사용 가능. } //행 갯수 조회 쿼리가 실행 됐는지 여부 if($resultCount) { echo "행 갯수 조회 성공 : ". $totalRowNum."<br>"; } else { echo "결과 없음: ".mysqli_error($conn); } $rowPerPage = 5; //페이지당 보여줄 게시물 행의 수 $begin = ($currentPage -1) * $rowPerPage; //board 테이블을 조회해서 board_no, board_title, board_user, board_date 필드 값을 내림차순으로 정렬하여 모두 가져 오는 쿼리 //입력된 begin값과 rowPerPage 값에 따라 가져오는 행의 시작과 갯수가 달라지는 쿼리 $sql = "SELECT board_no, board_title, board_user, board_date FROM board order by board_no desc limit ".$begin.",".$rowPerPage.""; $result = mysqli_query($conn,$sql); //쿼리 조회 결과가 있는지 확인 if($result) { echo "조회 성공"; } else { echo "결과 없음: ".mysqli_error($conn); } ?> <table class="table table-bordered"> <tr> <td>board_no</td> <td>board_title</td> <td>board_user</td> <td>board_date</td> <td>수정</td> <td>삭제</td> </tr> <?php //반복문을 이용하여 result 변수에 담긴 값을 row변수에 계속 담아서 row변수의 값을 테이블에 출력한다. while($row = mysqli_fetch_array($result)){ ?> <tr> <td> <?php echo $row["board_no"]; ?> </td> <td> <?php echo "<a href='/board_detail.php?board_no=".$row["board_no"]."'>"; echo $row["board_title"]; echo "</a>"; ?> </td> <td> <?php echo $row["board_user"]; ?> </td> <td> <?php echo $row["board_date"]; ?> </td> <?php echo "<td><a href='/board_update_form.php?board_no=".$row["board_no"]."'>수정</a></td>"; echo "<td><a href='/board_delete_form.php?board_no=".$row["board_no"]."'>삭제</a></td>"; ?> </tr> <?php } ?> </table> <?php //currentPage 변수가 1보다 클때만 이전 버튼이 활성화 되도록 함 if($currentPage > 1 ) { //이전 버튼이 클릭될때 GET방식으로 currentPage변수 값에 1을 뺀 값이 넘어가도록 함 echo "<a class='btn btn-primary' href ='/board_list.php?currentPage=".($currentPage-1)."'>이전</a> "; } $lastPage = ($totalRowNum-1) / $rowPerPage; if (($totalRowNum-1) % $rowPerPage !=0) { $lastPage += 1; } //lastPage변수가 currentPage 변수보다 클때만 다음 버튼이 활성화 되도록 함 if($currentPage < $lastPage) { //다음 버튼이 클릭될때 GET방식으로 currentPage변수 값에 1을 더한 값이 넘어가도록 함 echo "<a class='btn btn-primary' href='/board_list.php?currentPage=".($currentPage+1)."'>다음</a>"; } mysqli_close($conn); ?> <a class="btn btn-primary" href="/board_add_form.php">글 쓰기</a> <br><br><br><br><br> <script type="text/javascript" src="js/bootstrap.js"></script> </body> </html> |
board_detail.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | </<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>board_detail.php</title> <link rel="stylesheet" href="/css/bootstrap.css"> <style> table { table-layout: fixed; word-wrap: break-word; } </style> </head> <body> <h1 class="display-4">board_detail.php</h1> <?php //mysql 커넥션 객체 생성 $conn = mysqli_connect("localhost", "root", "java0000","jjdev"); //커넥션 객체 생성 여부 확인 if($conn) { echo "연결 성공<br>"; } else { die("연결 실패 : " .mysqli_error()); } //board_list.php 에서 넘어온 글 번호 저장 및 출력 $board_no = $_GET["board_no"]; echo $board_no."번째 글 내용<br>"; //board 테이블에서 board_no값이 일치하는 board_no, board_title, board_content, board_user, board_date 필드 값 조회 쿼리 $sql = "SELECT board_no, board_title, board_content, board_user, board_date FROM board WHERE board_no = '".$board_no."'"; $result = mysqli_query($conn,$sql); //조회 성공 여부 확인 if($result) { echo "조회 성공"; } else { echo "결과 없음: ".mysqli_error($conn); } ?> <table class="table table-bordered" style="width:50%"> <?php //result 변수에 담긴 값을 row 변수에 저장하여 테이블에 출력 if($row = mysqli_fetch_array($result)) { ?> <tr> <td style="width:15%">작성자</td> <td style="width:35%"> <?php echo $row["board_user"]; ?> </td> </tr> <tr> <td style="width:10%">글 제목</td> <td style="width:15%"> <?php echo $row["board_title"]; ?> </td> <td style="width:5%">글 번호</td> <td style="width:3%"> <?php echo $row["board_no"]; ?> </td> <td style="width:5%">작성 일자</td> <td style="width:3%"> <?php echo $row["board_date"]; ?> </td> </tr> <tr> <td colspan="6"> <?php echo $row["board_content"]; ?> </td> </tr> <?php } ?> </table> <br> <a class="btn btn-primary" href="/board_list.php"> 리스트로 돌아가기</a> <script type="text/javascript" src="js/bootstrap.js"></script> </body> </html> |
board_add_form.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>board_add_form.php</title> <link rel="stylesheet" href="/css/bootstrap.css"> </head> <body> <h1 class="display-4">board_add_form.php</h1> <!-- board_add_action.php로 넘기는 폼 --> <form class="form-horizontal" action="/board_add_action.php" method="post"> <div class="form-group"> <label for="exampleInputPassword1" class="col-sm-2 control-label">비밀번호 : </label> <div class="col-sm-10"> <!-- 글 비밀번호 입력 상자 --> <input class="form-control" name="boardPw" id="password" type="password" placeholder="Password"/> </div> </div> <div class="form-group"> <label for="exampleInputTitle1" class="col-sm-2 control-label">글 제목 : </label> <div class="col-sm-10"> <!-- 글 제목 입력 상자 --> <input class="form-control" name="boardTitle" id="Title" type="text" placeholder="Title"/> </div> </div> <div class="form-group"> <label for="exampleInputContent1" class="col-sm-2 control-label">글 내용 : </label> <div class="col-sm-10"> <!-- 글 내용 입력 텍스트영역 --> <textarea class="form-control" name="boardContent" id="content" rows="5" cols="50" placeholder="Content"></textarea> </div> </div> <div class="form-group"> <label for="exampleInputName1" class="col-sm-2 control-label">작성자명 : </label> <div class="col-sm-10"> <!-- 작성자명 입력 상자 --> <input class="form-control" name="boardUser" id="name" type="text" placeholder="Name"/> </div> </div> <div> <!-- 글 입력 버튼 --> <button class="btn btn-primary" type="submit" value="글 입력">글 입력</button> <!-- 입력 내용 초기화 버튼 --> <button class="btn btn-primary" type="reset" value="초기화">초기화</button> <!-- 리스트로 돌아가는 버튼 --> <a class="btn btn-primary" href="/board_list.php">리스트로 돌아가기</a> </div> </form> <script type="text/javascript"> //id가 XX인 객체에 변화가 생기면 checkXX 함수를 변화된 객체의 값을 매개로 호출 $("#password").change(function(){ checkPassword($('#password').val()); }); $("#Title").change(function(){ checkTitle($('#Title').val()); }); $("#content").change(function(){ checkTitle($('#content').val()); }); $("#name").change(function(){ checkName($('#name').val()); }); //입력된 변수의 길이를 참조하여 조건문을 통해 최소 입력 길이 유효성 검사를 하는 함수 function checkPassword(password) { if(password.length < 4) { alert("비밀번호는 4자 이상 입력하여야 합니다."); $('#password').val('').focus(); return false; } else { return true; } } function checkTitle(Title) { if(Title.length < 2) { alert('제목은 2자 이상 입력해야 합니다.'); $('#Title').val('').focus(); return false; } else { return true; } } function checkContent(content) { if(content.length < 2) { alert('내용은 2자리 이상 입력해야 합니다.'); $('#content').val('').focus(); return false; } else { return true; } } function checkName(name) { if(name.length < 2) { alert('작성자명은 2자리 이상 입력해야 합니다.'); $('#name').val('').focus(); return false; } else { return true; } } </script> <script type="text/javascript" src="js/bootstrap.js"></script> </body> </html> |
board_add_action.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <html> <head> </head> <body> <h1>boardAddAction.php</h1> <?php //board_add_form.php 페이지에서 넘어온 글 번호값 저장 및 출력 $board_pw = $_POST["boardPw"]; $board_title = $_POST["boardTitle"]; $board_content = $_POST["boardContent"]; $board_user = $_POST["boardUser"]; echo "board_pw : " . $board_pw . "<br>"; echo "board_title : " . $board_title . "<br>"; echo "board_content : " . $board_content . "<br>"; echo "board_user : " . $board_user . "<br>"; //mysql 커넥션 객체 생성 $conn = mysqli_connect("localhost", "root", "java0000","jjdev"); //커넥션 객체 생성 여부 확인 if($conn) { echo "연결 성공<br>"; } else { die("연결 실패 : " .mysqli_error()); } //board 테이블에 입력된 값을 1행에 넣고 board_date 필드에는 현재 시간을 입력하는 쿼리 $sql = "INSERT INTO board (board_pw, board_title, board_content, board_user, board_date) values ('".$board_pw."','".$board_title."','".$board_content."','".$board_user."',now())"; $result = mysqli_query($conn,$sql); // 쿼리 실행 여부 확인 if($result) { echo "입력 성공: ".$result; //과제 작성시 에러메시지 출력하게 만들기 } else { echo "입력 실패: ".mysqli_error($conn); } mysqli_close($conn); //헤더함수를 이용하여 리스트 페이지로 리다이렉션 ?> </body </html> |
board_update_form.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>board_update.php</title> <link rel="stylesheet" href="/css/bootstrap.css"> <!-- 테이블 크기 조절용 css --> <style> table { table-layout: fixed; word-wrap: break-word; } </style> </head> <body> <h1 class="display-4">board_update.php</h1> <?php //커넥션 객체 생성 (데이터 베이스 연결) $conn = mysqli_connect("localhost", "root", "java0000","jjdev"); //연결 성공 여부 확인 if($conn) { echo "연결 성공<br>"; } else { die("연결 실패 : " .mysqli_error()); } $board_no = $_GET["board_no"]; echo $board_no."번째 글 수정 페이지<br>"; //board 테이블을 조회하여 board_no의 값이 일치하는 행의 board_no, board_title, board_content, board_user, board_date 필드의 값을 가져오는 쿼리 $sql = "SELECT board_no, board_title, board_content, board_user, board_date FROM board WHERE board_no = '".$board_no."'"; $result = mysqli_query($conn,$sql); if($row = mysqli_fetch_array($result)){ ?> <br> <form action="/board_update_action.php" method="post"> <table class="table table-bordered" style="width:30%"> <tr> <td style="width:10%">글 번호</td> <td style="width:20%"><input type="text" name="board_no" value="<?php echo $row["board_no"]?>" readonly></td> </tr> <tr> <td style="width:10%">글 제목</td> <td style="width:20%"><input type="text" name="board_title" value="<?php echo $row["board_title"]?>"></td> </tr> <tr> <td style="width:10%">글 내용</td> <td style="width:20%"><input type="text" name="board_content" value="<?php echo $row["board_content"]?>"></td> </tr> </table> <br> <?php } //커넥션 객체 종료 mysqli_close($conn); ?> <button class="btn btn-primary" type="submit">글 수정</button> <a class="btn btn-primary" href="/board_list.php"> 리스트로 돌아가기</a> </form> <script type="text/javascript" src="js/bootstrap.js"></script> </body> </html> |
board_update_action.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>board_update.php</title> </head> <body> <h1>board_update_action.php</h1> <?php //board_update_form.php에서 POST 방식으로 넘어온 값 저장 및 출력 $board_no = $_POST["board_no"]; $board_title = $_POST["board_title"]; $board_content = $_POST["board_content"]; echo "board_no : " . $board_no . "<br>"; echo "board_title : " . $board_title . "<br>"; echo "board_content : " . $board_content . "<br>"; //커넥션 객체 생성 및 연결 여부 확인하기 $conn = mysqli_connect("localhost", "root", "java0000","jjdev"); if($conn) { echo "연결 성공<br>"; } else { die("연결 실패 : " .mysqli_error()); } //board 테이블의 board_no값이 일치하는 행의 board_title,board_content 값을 입력한 값으로,board_date값을 현재 시간으로 수정하는 쿼리 $sql = "UPDATE board SET board_title='".$board_title."',board_content='".$board_content."',board_date=now() WHERE board_no=".$board_no.""; $result = mysqli_query($conn,$sql); //수정 작업의 성공 여부 확인하기 if($result) { echo "수정 성공: ".$result; } else { echo "수정 실패: ".mysqli_error($conn); } mysqli_close($conn); //헤더를 이용한 리다이렉션 구현 header("Location: http://localhost/board_list.php"); ?> </body </html> |
board_delete_form.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="/css/bootstrap.css"> </head> <body> <h1 class="display-4">board_delete_form.php</h1> <?php //board_list.php 페이지에서 넘어온 글 번호값 저장 및 출력 $board_no = $_GET["board_no"]; echo $board_no."번째 글 삭제 페이지<br>"; ?> <!-- board_delete_action.php 페이지로 post방식을 이용하여 값 전송 --> <form action="/board_delete_action.php" method="post"> <table class="table table-bordered" style="width:10%"> <tr> <td>글 비밀 번호를 입력하세요.</td> </tr> <tr> <td><input type="text" name="board_pw"> <input type="hidden" name="board_no" value="<?php echo $board_no ?>"> </td> </tr> <tr> <td><button class="btn btn-primary" type="submit">글 삭제 버튼</td> </tr> </table> </form> <script type="text/javascript" src="js/bootstrap.js"></script> </body> </html> |
board_delete_action.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>board_delete.php</title> </head> <body> <h1>board_delete_action.php</h1> <?php //board_delete_form.php 페이지에서 넘어온 글 번호값 저장 및 출력 $board_no = $_POST["board_no"]; $board_pw = $_POST["board_pw"]; echo "board_no : " . $board_no . "<br>"; echo "board_pw : " . $board_pw . "<br>"; //mysql 커넥션 객체 생성 $conn = mysqli_connect("localhost", "root", "java0000","jjdev"); //커넥션 객체 생성 여부 확인 if($conn) { echo "연결 성공<br>"; } else { die("연결 실패 : " .mysqli_connect_error()); } //board테이블에서 입력된 글 번호와, 글 비밀번호가 일치하는 행 삭제 쿼리 $sql = "DELETE FROM board WHERE board_pw='".$board_pw."'AND board_no=".$board_no.""; //쿼리 실행 여부 확인 if(mysqli_query($conn,$sql)) { echo "삭제 성공: ".$result; //과제 작성시 에러메시지 출력하게 만들기 } else { echo "삭제 실패: ".mysqli_error($conn); } mysqli_close($conn); //헤더함수를 이용하여 리스트 페이지로 리다이렉션 header("Location: http://localhost/board_list.php"); ?> </body </html> |