이전글 : [PHP] 게시판 만들기 with MVC - 1부 Migration
이전글 : [PHP] 게시판 만들기 with MVC - 2부 Routing
이전글 : [PHP] 게시판 만들기 with MVC - 3부 View(List & Create)
이전글 : [PHP] 게시판 만들기 with MVC - 4부 Controller
이전글 : [PHP] 게시판 만들기 with MVC - 5부 Pagination
이전글 : [PHP] 게시판 만들기 with MVC - 6부 Read
View
글 수정하는 페이지랑 글 삭제하는 페이지를 만들겠습니다.
익명 게시판이므로 둘 다 글 작성이 기입했던 Password를 입력해야 수정 및 삭제 가능합니다.
bbs/view/delete.php
<!doctype html>
<?php
use Model\Post;
include "part/header.php";
?>
<body>
<?php
$post = new Post();
$idx = $_GET['idx'];
$postInfo = $post->getPost($idx);
if ($postInfo) {
?>
<div class="m-4">
<div class="container mt-5">
<h3 class="d-inline"><a href="/bbs">자유게시판</a></h3>/<h4 class="d-inline">글 삭제</h4>
<p class="mt-1">글을 삭제하는 공간입니다.</p>
<form action="/bbs/post/delete" method="post">
<span class="mr-2">작성일: <?= $postInfo['created_at'] ?></span>
<span class="mr-2">수정일: <?= $postInfo['updated_at'] ?></span>
<span class="mr-2">조회수: <?= $postInfo['views'] ?></span>
<span class="mr-2">추천수: <?= $postInfo['thumbs_up'] ?></span>
<input type="hidden" name="idx" value="<?= $idx ?>">
<div class="form-group mt-3">
<label for="title">제목</label>
<p><?= $postInfo['title'] ?></p>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>Name</label>
<p> <?= $postInfo['name'] ?></p>
</div>
<div class="form-group col-md-6">
<label for="password">Password</label>
<input type="password" class="form-control" name="pw" placeholder="Password를 입력해주세요.">
</div>
</div>
<button type="submit" class="btn btn-primary">삭제</button>
<a href="/bbs" class="btn btn-secondary">목록</a>
<a href="./read?idx=<?= $postInfo['idx'] ?>" class="btn btn-secondary">뒤로가기</a>
</form>
</div>
</div>
<?php
} else {
echo "<script>alert('존재하지 않는 게시물입니다.');history.back();</script>";
}
?>
</body>
</html>
수정 페이지도 추가합시다
bbs/view/update.php
<!doctype html>
<?php
include "part/header.php";
use Model\Post;
?>
<body>
<?php
$post = new Post();
$postInfo = $post->getPost($_GET['idx']);
if ($postInfo) {
?>
<div class="m-4">
<div class="container mt-5">
<h3 class="d-inline">
<a href="/bbs">자유게시판</a>
</h3>
/<h4 class="d-inline">글 수정</h4>
<p class="mt-1">글을 수정하는 공간입니다.</p>
<form action="/bbs/post/update" method="post">
<span class="mr-2">작성일: <?= $postInfo['created_at'] ?></span>
<span class="mr-2">수정일: <?= $postInfo['updated_at'] ?></span>
<span class="mr-2">조회수: <?= $postInfo['views'] ?></span>
<span class="mr-2">추천수: <?= $postInfo['thumbs_up'] ?></span>
<input type="hidden" name="idx" value="<?= $_GET['idx'] ?>">
<div class="form-group mt-3">
<label for="title">제목</label>
<input type="text" class="form-control" name="title" id="title" placeholder="제목을 입력하세요"
value="<?= $postInfo['title'] ?>">
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="checkbox" id="lock"
name="lock" <?= $postInfo['lock'] ? 'checked' : '' ?>>
<label class="form-check-label" for="lock">
비밀 글 여부
</label>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>Name</label>
<p> <?= $postInfo['name'] ?></p>
</div>
<div class="form-group col-md-6">
<label for="password">Password</label>
<input type="password" class="form-control" id="password" name="pw"
placeholder="Password를 입력해주세요.">
</div>
</div>
<div class="form-group">
<label for="content">내용</label>
<textarea class="form-control" name="content" rows="5" id="content"
placeholder="내용을 입력하세요"><?= $postInfo['content'] ?></textarea>
</div>
<button type="submit" class="btn btn-primary">저장하기</button>
<a href="/bbs" class="btn btn-secondary">목록</a>
<a href="./read?idx=<?= $postInfo['idx'] ?>" class="btn btn-secondary">뒤로가기</a>
</form>
</div>
</div>
<?php
} else {
echo "<script>alert('존재하지 않는 게시물입니다.');history.back();</script>";
}
?>
</body>
</html>
Route
Route 설정을 추가합시다
View와 Controller 로직을 연결합니다
bbs/Route/PostRoute.php
<?php
namespace Route;
use Controller\PostController;
class PostRoute extends BaseRoute
{
function routing($url): bool
{
...
} else if ($this->routeCheck($url, "post/update", "GET")) {
return $this->requireView('update');
} else if ($this->routeCheck($url, "post/delete", "GET")) {
return $this->requireView('delete');
} else if ($this->routeCheck($url, "post/create", "POST")) {
$PostController->create();
return true;
} else if ($this->routeCheck($url, "post/update", "POST")) {
$PostController->update();
return true;
} else if ($this->routeCheck($url, "post/delete", "POST")) {
$PostController->delete();
return true;
} else if ($this->routeCheck($url, "post/thumbsUp", "POST")) {
$PostController->thumbsUp();
return true;
} else {
return false;
}
}
}
Controller
이제 Controller에 update/delete를 추가합시다
bbs/Controller/PostController.php
<?php
namespace Controller;
use Model\Post;
class PostController extends BaseController
{
...
/**
* 게시글 수정 기능을 담당
* @return void
*/
public function update()
{
$idx = $_POST['idx'];
$pw = $_POST['pw'];
$title = $_POST['title'];
$content = $_POST['content'];
$lock = $_POST['lock'];
if ($this->parametersCheck($idx, $pw, $title, $content)) {
if ($this->post->update($idx, $pw, $title, $content, $lock)) {
$this->redirect('/bbs', '글이 수정되었습니다.');
} else {
$this->redirectBack('글 수정에 실패했습니다.');
}
} else {
$this->redirectBack('입력되지 않은 값이 있습니다.');
}
}
/**
* 게시글 삭제 기능을 담당
* @return void
*/
public function delete()
{
$idx = $_POST['idx'];
$pw = $_POST['pw'];
if ($this->parametersCheck($idx, $pw)) {
if ($this->post->delete($idx, $pw)) {
$this->redirect('/bbs', '글이 삭제되었습니다.');
} else {
$this->redirectBack('글 삭제에 실패했습니다.');
}
} else {
$this->redirectBack('입력되지 않은 값이 있습니다.');
}
}
...
}
Model
비밀번호를 저장할 때 아래 함수로 비밀번호를 암호화했습니다.
password_hash
해시된 값과 비교하는 방법은 아래 함수를 통해 값이 동일한지 비교할 수 있습니다.
password_verify
실제 서비스에서는 훨씬 복잡하고 안전한 암호화 사용해야겠지만 어디까지나 예제이므로 간단하게 진행했습니다.
이 암호화 로직을 가지고 Update와 Delete에서 비밀번호가 동일한지 체크를 할 것입니다.
bbs/Model/Post.php
<?php
namespace Model;
use PDO;
use PDOException;
class Post extends BaseModel
{
...
/**
* Post 수정
* @param $idx
* @param $pw
* @param $title
* @param $content
* @param $lock
* @return bool
*/
public function update($idx, $pw, $title, $content, $lock): bool
{
try {
$query = "SELECT pw FROM posts WHERE idx = :idx";
$stmt = $this->conn->prepare($query);
$stmt->execute([
'idx' => $idx,
]);
$check = $stmt->fetch();
// 비밀번호 체크
if (!$check || !password_verify($pw, $check['pw'])) {
return false;
}
// 업데이트
$query = "UPDATE posts SET title = :title, content = :content, `lock` = :lock WHERE idx = :idx";
$stmt = $this->conn->prepare($query);
return $stmt->execute([
'title' => $title,
'content' => $content,
'lock' => $lock == 'on' ? 1 : 0,
'idx' => $idx,
]);
} catch (PDOException $e) {
error_log($e->getMessage());
return false;
}
}
/**
* Post 삭제
* @param $idx
* @param $pw
* @return bool
*/
public function delete($idx, $pw): bool
{
try {
$query = "SELECT pw FROM posts WHERE idx = :idx";
$stmt = $this->conn->prepare($query);
$stmt->execute([
'idx' => $idx,
]);
$check = $stmt->fetch();
// 비밀번호 체크
if (!$check || !password_verify($pw, $check['pw'])) {
return false;
}
// 삭제
$query = "DELETE FROM posts WHERE idx = :idx";
$stmt = $this->conn->prepare($query);
return $stmt->execute([
'idx' => $idx,
]);
} catch (PDOException $e) {
error_log($e->getMessage());
return false;
}
}
...
}
여기까지 추가했다면 다음과 같은 결과를 볼 수 있을 겁니다.
수정 결과물
삭제 결과물
비밀번호를 잘못 입력할 경우 글 삭제에 실패했습니다가 나오게 됩니다.
비밀번호를 정확히 입력할 경우 잘 삭제되는 걸 확인할 수 있습니다.
'PHP > Modern PHP' 카테고리의 다른 글
[PHP] 게시판 만들기 with MVC - 9부 Reply(List & Create) (1) | 2023.12.28 |
---|---|
[PHP] 게시판 만들기 with MVC - 8부 Lock (0) | 2023.12.28 |
[PHP] 게시판 만들기 with MVC - 6부 Read (0) | 2023.12.27 |
[PHP] 게시판 만들기 with MVC - 5부 Pagination (1) | 2023.12.27 |
[PHP] 게시판 만들기 with MVC - 4부 Controller (0) | 2023.12.27 |