PHP/Modern PHP

[PHP] 게시판 만들기 with MVC - 8부 Lock

DSeung 2023. 12. 28. 11:38

 

이전글 : [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

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

 

 Lock

이번 포스팅에는 잠긴 글 기능을 만들어봅시다.

Post 테이블의 구조를 보면 lock 컬럼이 존재합니다.

이 값으로 잠긴 글인지 여부를 파악하는데 0이면 기본 값, 1이면 글이 잠겼다고 보시면 됩니다.

 

현재 코드로도 비밀글 체크박스를 선택하면

해당 글을 보려고 할 때 비밀번호를 입력해야 합니다.

하지만 비밀번호 입력 후 확인하기에서 404가 발생하죠.

이 부분을 마저 만들어봅시다.

View

이전에 만들었던 read.php에서 input tpye이 잘못되어 있어서 수정합시다.

bbs/view/read.php

<input id="pw" type="text" class="form-control" name="pw" placeholder="비밀번호를 입력하세요">
=>
<input id="pw" type="password" class="form-control" name="pw" placeholder="비밀번호를 입력하세요">

Route

bbs/Route/PostRoute.php

<?php

namespace Route;

use Controller\PostController;

class PostRoute extends BaseRoute
{
    function routing($url): bool
    {
    	...
		else if ($this->routeCheck($url, "post/lockCheck", "POST")) {
            $PostController->lockCheck();
            return true;
        } 
        ...
	}
}

Controller

bbs/Controller/PostController.php

<?php
namespace Controller;

use Model\Post;

class PostController extends BaseController
{
   ...

    /**
     * 게시글의 잠긴 걸 확인 후 해제를 담당
     * @return void
     */
    public function lockCheck()
    {
        $idx = $_POST['idx'];
        $pw = $_POST['pw'];

        if ($this->parametersCheck($pw)) {
            if ($this->post->lockCheck($idx, $pw)) {
                $this->redirect('/bbs/post/read?idx=' . $idx, '비밀번호가 일치합니다.');
            } else {
                $this->redirectBack('비밀번호가 일치하지 않습니다.');
            }
        } else {
            $this->redirectBack('입력되지 않은 값이 있습니다.');
        }
    }

   ...
}

Model

비밀번호가 동일할 경우 1시간짜리 쿠키를 생성합니다.

이 쿠키를 가지고 있다면 1시간 동안 해당 게시글을 비밀번호 기입 없이 볼 수 있습니다.

bbs/Model/Post.php

<?php

namespace Model;

use PDO;
use PDOException;

class Post extends BaseModel
{
    ...

    /**
     * Post 잠김 확인 후 해제
     * @param $idx
     * @param $pw
     * @return bool
     */
    public function lockCheck($idx, $pw): bool
    {
        try {
            echo $idx;
            $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;
            }
            // 1시간짜리 쿠키 생성
            setcookie("post_key" . $idx, $pw, time() + 3600, "/");
            return true;
        } catch (PDOException $e) {
            error_log($e->getMessage());
            return false;
        }
    }

   ...
}

 

이제 다음과 같은 결과를 볼 수 있습니다.

반응형