오늘은 게시판 영역 중, 게시글을 수정할 때 비밀번호를 입력해 일치하면 수정할 수 있도록 해주고,
페이지를 넘어가게 해주는 작업을 해보겠습니다.
게시판 수정하기
먼저 세션체크를 해줘야합니다.
<?php
if(!isset($_SESSION['memberID'])){
Header("Location:../login/login.php");
}
?>
현재 로그인 되어 있는지 확인하는 코드로, $_SESSION['memberID']가 설정되어 있지 않으면 로그인 페이지로 이동합니다. 따라서 해당 코드를 사용하는 페이지는 로그인이 필요한 페이지일 것입니다!!
그래서 세션체크가 필요한 곳에 include로 넣어줍니당!
include "../connect/sessionCheck.php";
boardModify.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='boardID'>번호</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>";
echo "<div class='mt50'><label for='boardPass'>비밀번호</label><input type='password' id='boardPass' name='boardPass' class='inputStyle' autocomplete='off' required placeholder='글을 수정하려면 로그인 비밀번호를 입력하셔야 합니다.'></div>";
}
?>
GET 방식으로 전달된 게시글 번호(boardID)를 이용하여 해당 게시글 정보를 데이터베이스에서 가져옵니다. 가져온 정보를 이용하여 제목(boardTitle), 내용(boardContents) 입력 폼에 출력합니다. 게시글 수정 시 로그인 비밀번호(boardPass)를 입력해야 하므로, 입력 폼에 비밀번호 입력란도 추가합니다.
boardModifySave.php
<?php
include "../connect/connect.php";
include "../connect/session.php";
$boardID = $_POST['boardID'];
$boardTitle = $_POST['boardTitle'];
$boardContents = $_POST['boardContents'];
$boardPass = $_POST['boardPass'];
$boardTitle = $connect -> real_escape_string($boardTitle);
$boardContents = $connect -> real_escape_string($boardContents);
$boardPass = $connect -> real_escape_string($boardPass);
$memberID = $_SESSION['memberID'];
$sql = "SELECT * FROM members WHERE memberID = {$memberID}";
$result = $connect -> query($sql);
if($result){
$info = $result -> fetch_array(MYSQLI_ASSOC);
if($info['memberID'] == $memberID && $info['youPass'] == $boardPass){
$sql = "UPDATE board SET boardTitle = '{$boardTitle}', boardContents = '{$boardContents}' WHERE boardID = '{$boardID}'";
$connect -> query($sql);
} else {
echo "<script>alert('비밀번호가 틀렸습니다. 다시 한 번 확인해주세요!')</script>";
}
} else {
echo "<script>alert('관리자 에러!!')</script>";
}
?>
<script>
location.href = "board.php";
</script>
우선 $_POST를 사용하여 폼에서 전송된 게시글 번호, 제목, 내용, 비밀번호를 변수에 저장합니다.
real_escape_string() 함수를 사용하여 SQL 쿼리문에 영향을 미칠 수 있는 특수문자 등을 이스케이프 처리합니다.
현재 로그인한 회원의 ID와 입력받은 비밀번호를 사용하여 해당 회원이 게시글 수정 권한을 가지고 있는지 확인합니다.
SELECT 쿼리문을 실행하여 회원 정보를 가져온 후, 비밀번호를 비교합니다.
비밀번호가 일치하면, UPDATE 쿼리문을 실행하여 게시글 제목과 내용을 수정합니다. 그렇지 않으면, 비밀번호가 틀렸다는 경고 메시지를 출력합니다. 마지막으로, location.href를 사용하여 게시판 페이지로 이동합니다.
board.php 페이지
<?php
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
} else {
$page = 1;
}
$viewNum = 10;
$viewLimit = ($viewNum * $page) - $viewNum;
// 1 ~ 20 DESC LIMIT 0, 20 -->page1 (viewNum, * 1) - viewNum
// 21 ~ 40 DESC LIMIT 20, 20 -->page2 (viewNum, * 2) - viewNum
// 41 ~ 60 DESC LIMIT 40, 20 -->page3 (viewNum, * 3) - viewNum
// 61 ~ 80 DESC LIMIT 60, 20 -->page4 (viewNum, * 4) - viewNum
$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 {$viewLimit}, {$viewNum}";
$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>";
}
}
?>
GET 방식으로 전달된 page 파라미터 값을 읽어와서 현재 페이지 번호를 설정합니다. 이후, 한 페이지에 보여질 게시글 수를 10으로 설정하고, LIMIT 절을 계산하기 위한 viewLimit 값을 계산합니다.
MySQL의 JOIN 구문을 사용하여 게시글과 회원 정보를 조회하는 SQL 쿼리를 작성합니다. ORDER BY 절에는 게시글 번호를 역순으로 정렬하도록 하고, LIMIT 절에는 이전에 계산한 viewLimit 값을 시작으로 viewNum 만큼의 게시글을 조회하도록 지정합니다.
쿼리 결과를 반복문을 사용하여 게시글 리스트를 출력합니다. 출력되는 각 게시글의 제목(title)은 링크(link) 형태로 작성되어 있어, 해당 게시글을 클릭하면 상세 내용을 볼 수 있습니다. 게시글이 없는 경우에는 해당 내용을 출력합니다.
board.php 페이지 넘기기
<?php
// 게시글 총 갯수
$sql = "SELECT count(boardID) FROM board";
$result = $connect -> query($sql);
$boardTotalCount = $result -> fetch_array(MYSQLI_ASSOC);
$boardTotalCount = $boardTotalCount['count(boardID)'];
// 총 페이지 갯수
$boardTotalCount = ceil($boardTotalCount/$viewNum);
$pageView = 5;
$startPage = $page - $pageView;
$endPage = $page + $pageView;
// 처음 페이지 초기화
if($startPage < 1) $startPage = 1;
// 마지막 페이지 초기화
if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
// 처음으로/이전
if($page != 1 && $page <= $boardTotalCount){
$prevPage = $page - 1;
echo "<li><a href='board.php?page=1'>처음으로</a></li>";
echo "<li><a href='board.php?page={$prevPage}'>이전</a></li>";
}
for($i=$startPage; $i<=$endPage; $i++){
$active = "";
if($page <= $boardTotalCount){
if($i == $page) $active = 'active';
echo "<li class='{$active}'><a href='board.php?page={$i}'>{$i}</a></li>";
}
}
// 마지막으로/다음
if($page != $boardTotalCount && $page <= $boardTotalCount){
$nextPage = $page + 1;
echo "<li><a href='board.php?page={$nextPage}'>다음</a></li>";
echo "<li><a href='board.php?page={$boardTotalCount}'>마지막으로</a></li>";
}
?>
$sql 변수에는 "board" 테이블에서 boardID의 갯수를 가져오는 SQL 쿼리가 할당됩니다. 그리고 $result 변수에는 해당 SQL 쿼리의 결과를 저장합니다.
그 다음에는 fetch_array 함수를 이용해서 $boardTotalCount 변수에 총 게시글 수를 저장합니다. 그리고, $viewNum 변수로 나누어서 총 페이지 수를 계산합니다.
$pageView 변수를 이용해서 보여줄 페이지의 수를 지정하고, $startPage와 $endPage 변수를 이용해서 현재 페이지의 범위를 설정합니다.
처음 페이지/이전
startPage가 1보다 작으면 $startPage를 1로 초기화하고, $endPage가 $boardTotalCount보다 크거나 같으면 $endPage를 $boardTotalCount로 초기화합니다.
현재 페이지가 첫 페이지가 아니고, $boardTotalCount보다 작거나 같을 때 "처음으로"와 "이전" 링크를 출력합니다.
페이지 설정
for 반복문을 이용해서 $startPage부터 $endPage까지 페이지 번호를 출력합니다. 현재 페이지와 같은 페이지는 "active" 클래스가 추가된 상태로 출력합니다.
마지막페이지/다음
$nextPage = $page + 1;: 다음 페이지 번호를 계산합니다.
echo "<li><a href='board.php?page={$nextPage}'>다음</a></li>";: 다음 페이지로 이동할 수 있는 링크를 생성합니다.
echo "<li><a href='board.php?page={$boardTotalCount}'>마지막으로</a></li>";: 마지막 페이지로 이동할 수 있는 링크를 생성합니다.