오늘은 PHP 게시판 영역을 정리해보겠습니다.
board.php(게시판)
boardView.php(게시글 보기)
boardWrite.php(게시글 쓰기)
boardWriteSave.php(게시글 쓰고 저장)
boardModify.php(게시글 수정)
boardModifySave.php(게시글 수정 저장)
boardRemove.php(게시글 삭제)
PHP 게시판 영역 만들기
게시판을 만들기 앞서, board테이블을 만들겠습니다.
createBoard.php
<?php
include "../connect/connect.php";
$sql = "CREATE TABLE board(";
$sql .= "boardID int(10) unsigned NOT NULL auto_increment,";
$sql .= "memberID int(10) NOT NULL,";
$sql .= "boardTitle varchar(100) NOT NULL,";
$sql .= "boardContents longtext NOT NULL,";
$sql .= "boardView int(10) NOT NULL,";
$sql .= "regTime int(20) NOT NULL,";
$sql .= "PRIMARY KEY(boardID)";
$sql .=") charset=utf8;";
$connect -> query($sql);
?>
board 테이블을 만들어줍니다.
createBoardData.php
<?php
include "../connect/connect.php";
for($i=1; $i<300; $i++){
$regTime = time();
$sql = "INSERT INTO board(memberID, boardTitle, boardContents, boardView, regTime) VALUES(1, '게시판 타이틀${i}입니다.', '게시판 내용물${i}입니다.게시판 내용물${i}입니다.게시판 내용물입니다.게시판 내용물입니다.게시판 내용물입니다.게시판 내용물입니다.게시판 내용물입니다.', '1', '$regTime')";
$connect -> query($sql);
}
?>
for문을 사용해 게시글을 300개를 넣어줄 겁니다.
게시판.php
<?php
$sql = "SELECT b.boardID, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ORDER BY boardID DESC LIMIT 100";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count > 0){
for($i=0; $i<$count; $i++){
$info = $result -> fetch_array(MYSQLI_ASSOC);
echo "<tr>";
echo "<td>".$info['boardID']."</td>";
echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
echo "<td>".$info['youName']."</td>";
echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
echo "<td>".$info['boardView']."</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='4'>게시글이 없습니다.</td></tr>";
}
}
?>
MySQL 데이터베이스에서 "board" 테이블과 "members" 테이블을 JOIN하여 최신 100개의 게시글에 대한 정보를 가져오는 코드입니다. 가져온 정보는 for 루프를 통해 HTML 테이블에 출력됩니다.
boardID: 게시글의 ID를 나타내는 정수 값입니다.
boardTitle: 게시글의 제목을 나타내는 문자열 값입니다. 해당 제목은 "boardView.php" 페이지로 링크됩니다.
youName: 게시글을 작성한 회원의 이름을 나타내는 문자열 값입니다.
regTime: 게시글이 등록된 날짜를 나타내는 날짜 형식 문자열 값입니다. 이 날짜는 "Y-m-d" 형식으로 출력됩니다.
boardView: 게시글의 조회수를 나타내는 정수 값입니다.
게시글이 하나도 없는 경우 "게시글이 없습니다."라는 문구가 출력됩니다.
게시판보기.php
<?php
if(isset($_GET['boardID'])){
$boardID = $_GET['boardID'];
$sql = "SELECT b.boardContents, b.boardTitle, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(m.memberID = b.memberID) WHERE b.boardID = {$boardID}";
$result = $connect -> query($sql);
if($result){
$info = $result -> fetch_array(MYSQLI_ASSOC);
echo "<tr><th>제목</th><td>".$info['boardTitle']."</td></tr>";
echo "<tr><th>등록자</th><td>".$info['youName']."</td></tr>";
echo "<tr><th>등록일</th><td>".date('Y-m-d', $info['regTime'])."</td></tr>";
echo "<tr><th>조회수</th><td>".$info['boardView']."</td></tr>";
echo "<tr><th>내용</th><td>".$info['boardContents']."</td></tr>";
}
} else {
echo "<tr><td colspan='4'>게시글이 없습니다.</td></tr>";
}
?>
"board" 테이블과 "members" 테이블을 JOIN하여 게시글의 ID를 이용해 해당 게시글의 정보를 가져오는 코드입니다. 가져온 정보는 HTML 테이블에 출력됩니다.
boardTitle: 게시글의 제목을 나타내는 문자열 값입니다.
youName: 게시글을 작성한 회원의 이름을 나타내는 문자열 값입니다.
regTime: 게시글이 등록된 날짜를 나타내는 날짜 형식 문자열 값입니다. 이 날짜는 "Y-m-d" 형식으로 출력됩니다.
boardView: 게시글의 조회수를 나타내는 정수 값입니다.
boardContents: 게시글의 내용을 나타내는 문자열 값입니다.
만약 "boardID" 파라미터가 전달되지 않은 경우 "게시글이 없습니다."라는 문구가 출력됩니다.
여기서 버그가 있는데, 게시물이 없을 때 수정하기 , 삭제하기 버튼을 없애줄겁니다.
<div class="board__btn mb100">
<?php if(isset($_GET['boardID'])): ?>
<a href="boardModify.php?boardID=<?=$_GET['boardID']?>" class="btnStyle3">수정하기</a>
<a href="boardRemove.php?boardID=<?=$_GET['boardID']?>" class="btnStyle3" onclick="if(!confirm('정말 삭제하시겠습니까?')){return false;}">삭제하기</a>
<?php endif; ?>
<a href="board.php" class="btnStyle3">목록보기</a>
</div>
"if" 문을 사용하여 URL 매개변수 "boardID"가 설정되어 있는지 확인합니다. "boardID"가 설정되어 있다면, boardModify.php와 boardRemove.php로 각각 연결하는 두 개의 버튼을 생성합니다. 이 버튼들은 "boardID" 매개변수를 전달합니다. "boardID"가 설정되어 있지 않은 경우, "목록보기" 버튼 하나만 생성됩니다.
게시물쓰기.php
<?php
include "../connect/connect.php";
include "../connect/session.php";
$boardTitle = $_POST['boardTitle'];
$boardContents = $_POST['boardContents'];
$boardView = 1;
$regTime = time();
$memberID = $_SESSION['memberID'];
$boardTitle = $connect -> real_escape_string($boardTitle);
$boardContents = $connect -> real_escape_string($boardContents);
$sql = "INSERT INTO board(memberID, boardTitle, boardContents, boardView, regTime) VALUES('$memberID', '$boardTitle', '$boardContents', '$boardView', '$regTime')";
$connect -> query($sql);
?>
<script>
location.href = "board.php";
</script>
먼저, ../connect/connect.php 파일과 ../connect/session.php 파일을 include를 통해 불러옵니다. 이 파일들은 데이터베이스 연결과 세션 관리를 위해 사용됩니다.
$_POST를 통해 전송된 게시글 제목($boardTitle)과 내용($boardContents)을 가져옵니다. 게시글 조회수($boardView)는 1로 설정하며, 등록 시간($regTime)은 time() 함수를 사용해 현재 시간으로 지정합니다. 게시글을 작성한 회원의 memberID는 $_SESSION['memberID']를 통해 가져옵니다.
SQL Injection 공격을 방지하기 위해, $boardTitle과 $boardContents 값을 real_escape_string() 함수를 통해 escape 처리합니다.
마지막으로, $sql을 통해 데이터베이스에 게시글 정보를 INSERT 합니다.
글 작성이 완료된 후에는 board.php 페이지로 이동하도록 JavaScript 코드를 실행시킵니다.
게시글 수정하기.php
<?php
$boardID = $_GET['boardID'];
$sql = "SELECT boardID, boardTitle, boardContents FROM board WHERE boardID = {$boardID}";
$result = $connect -> query($sql);
if($result){
$info = $result -> fetch_array(MYSQLI_ASSOC);
echo "<div style='display:none'><label for='boardTitle'>번호</label><input type='text' id='boardID' name='boardID' class='inputStyle' value='".$info['boardID']."'></div>";
echo "<div><label for='boardTitle'>제목</label><input type='text' id='boardTitle' name='boardTitle' class='inputStyle' value='".$info['boardTitle']."'></div>";
echo "<div><label for='boardContents'>내용</label><textarea name='boardContents' id='boardContents' rows='20' class='inputStyle'>".$info['boardContents']."</textarea></div>";
}
?>
GET 방식으로 전달된 게시글 번호(boardID)를 변수에 저장합니다.
저장된 게시글 번호를 이용하여 board 테이블에서 해당 게시글 정보를 가져오는 SQL 쿼리문을 생성합니다.
위에서 생성한 쿼리문을 $connect 객체의 query() 메서드로 실행하여 그 결과를 $result 변수에 저장합니다.
SQL 쿼리문의 실행 결과가 존재하는 경우, $info 변수에 게시글 정보를 저장합니다.
HTML 코드를 이용하여, 게시글 수정 폼에 입력할 수 있는 제목과 내용을 표시합니다. 이 때, 이미 존재하는 게시글 정보를 가져와 미리 입력 폼에 채워주기 위해, <input>과 <textarea> 요소의 value 속성에 $info 변수에서 가져온 정보를 채워넣습니다.
<?php
include "../connect/connect.php";
include "../connect/session.php";
$boardID = $_POST['boardID'];
$boardTitle = $_POST['boardTitle'];
$boardContents = $_POST['boardContents'];
$memberID = $_SESSION['memberID'];
$boardTitle = $connect -> real_escape_string($boardTitle);
$boardContents = $connect -> real_escape_string($boardContents);
// 게시물의 작성자 boardID와 로그인한 사용자의 memberID를 비교
$sql = "SELECT boardID FROM board WHERE boardID = '{$boardID}' AND memberID = '{$memberID}'";
$result = $connect -> query($sql);
$row = $result -> fetch_array(MYSQLI_ASSOC);
$boardID = $row['boardID'];
if(!$boardID) {
echo "<script>alert('작성자만 게시물을 수정할 수 있습니다.')</script>";
echo "<script>location.href='board.php'</script>";
exit;
}
$sql = "UPDATE board SET boardTitle = '{$boardTitle}', boardContents = '{$boardContents}' WHERE boardID = '{$boardID}'";
$connect -> query($sql);
echo "<script>alert('게시물이 수정되었습니다.')</script>";
echo "<script>location.href='board.php'</script>";
?>
<script>
location.href = "board.php";
</script>
connect.php와 session.php 파일을 include하여 데이터베이스에 연결하고 로그인 세션을 유지합니다.
그런 다음 POST 방식으로 전송된 boardID, boardTitle, boardContents 값을 변수로 받아옵니다. 받아온 값들은 $connect -> real_escape_string() 함수를 사용하여 SQL Injection을 방지하기 위해 문자열을 이스케이프 처리합니다.
다음으로는 해당 게시물의 작성자와 현재 로그인한 사용자의 ID를 비교합니다. 이를 위해 SELECT 쿼리를 사용하여 boardID와 memberID를 검색하고, 두 값을 모두 만족하는 행(row)이 있는지 확인합니다. 행이 존재하지 않으면 "작성자만 게시물을 수정할 수 있습니다."라는 메시지를 출력하고 게시판 목록 페이지로 이동합니다.
그렇지 않다면 UPDATE 쿼리를 사용하여 해당 게시물의 boardTitle과 boardContents 값을 수정합니다. 그리고 "게시물이 수정되었습니다."라는 메시지를 출력하고 게시판 목록 페이지로 이동합니다.
마지막으로는 JavaScript 코드를 이용하여 location.href 속성을 변경하여 게시판 목록 페이지로 이동합니다.
게시글 삭제하기.php
<?php
include "../connect/connect.php";
include "../connect/session.php";
$boardID = $_GET['boardID'];
$boardID = $connect -> real_escape_string($boardID);
$sql = "DELETE FROM board WHERE boardID = {$boardID}";
$connect -> query($sql);
?>
<script>
location.href = "board.php";
</script>
$boardID = $_GET['boardID'];: GET 방식으로 전달된 boardID를 가져와 $boardID 변수에 저장합니다.
$boardID = $connect -> real_escape_string($boardID);: $boardID에 저장된 값을 real_escape_string() 함수를 이용하여 SQL injection을 방지합니다.
$sql = "DELETE FROM board WHERE boardID = {$boardID}";: $boardID 변수에 저장된 게시물 번호를 이용하여 board 테이블에서 해당 게시물을 삭제하는 SQL 쿼리를 생성합니다.
$connect -> query($sql);: 생성된 SQL 쿼리를 실행하여 게시물을 삭제합니다.
location.href = "board.php";: 삭제가 완료되면 board.php 페이지로 이동합니다.