[PHP] 게시판 만들기 with MVC - 7부 Update & Delete

2023. 12. 27. 22:15· PHP/Modern PHP
목차
  1. View
  2. Route
  3. Controller
  4. Model

 

이전글 : [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  (1) 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
  1. View
  2. Route
  3. Controller
  4. Model
'PHP/Modern PHP' 카테고리의 다른 글
  • [PHP] 게시판 만들기 with MVC - 9부 Reply(List & Create)
  • [PHP] 게시판 만들기 with MVC - 8부 Lock
  • [PHP] 게시판 만들기 with MVC - 6부 Read
  • [PHP] 게시판 만들기 with MVC - 5부 Pagination
DSeung
DSeung
DSeung
Dev log
DSeung
  • 분류 전체보기 (193) N
    • PHP (62)
      • Laravel (31)
      • Error (5)
      • Setting (11)
      • Modern PHP (15)
    • Go Lang (51)
      • Study (30)
      • Algorithm (17)
      • Setting (1)
      • Error (3)
    • Java (11)
      • Spring (3)
      • JSP (0)
      • Error (2)
      • Setting (2)
      • 단축키 (2)
    • JavaScript (6)
      • Modern JavaScript (4)
      • Node (1)
    • Android Kotlin (5)
      • Study (4)
      • Error (1)
    • 컴퓨팅 기술 (12)
      • 데이터베이스시스템 (4)
      • Docker (2)
      • 크롤링 & 스크래핑 (1)
      • API (1)
      • 클라우드 (1)
      • 네트워크 (1)
    • MySQL (7)
    • AWS (1)
    • Git (5)
      • GItLab (1)
      • GitHub (4)
    • 도메인 (2)
      • 안과 (2)
    • 자격증 (7)
      • SQLD (1)
      • 정보처리기사 (6)
    • Mac os (1)
    • 나머지 (13)
      • tistory (1)
      • 기타 (9)
      • 일기 (3)
    • 독서 (10) N

인기 글

최근 글

블로그 메뉴

  • 홈
  • 태그
전체
오늘
어제
hELLO · Designed By 정상우.v4.2.0
DSeung
[PHP] 게시판 만들기 with MVC - 7부 Update & Delete
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.