Today I Learned …

[웹개발] 조회수/좋아요(취소 포함) 기능 본문

Web/APM

[웹개발] 조회수/좋아요(취소 포함) 기능

염베리 2021. 11. 3. 02:31

* 개인적인 공부 내용을 기록한 글입니다.


설명

오늘은 조회수와 좋아요 기능에 대해 살펴보려고 한다.

 

최종 화면

클릭하면 확대됩니다.


조회수 기능

 

 

0. 전제

[1] 게시글 DB에 조회수를 저장할 hit 컬럼을 추가해준 상태이다. (= default 0)

[2] 작성자가 아닌 다른 사람이 게시글을 조회하는 경우에만 조회수가 증가하게끔 구현한다.

 

 

1. 먼저, 게시글 조회 페이지를 출력하는 view.php에 추가해줄 내용이다.

if($_SESSION['user_id'] != $res_view['writer']){
	$sql_hit = "UPDATE board SET hit=hit+1 WHERE id=$id";
	$res_hit = mysqli_query($conn, $sql_hit);
}

[1] 현재 게시글을 조회한 사용자가 해당 게시글의 작성자가 아니라면,

[2] 해당 게시글의 hit 레코드를 1만큼 증가시킨다.

 

[3] 사실상 조회수 기능 구현은 여기서 끝이다.

[4] 이후는 board.php나 view.php에서 조회수를 확인할 수 있도록 원하는 위치에 $row['hit'] 을 배치해주면 된다.


좋아요 기능 (취소 포함)

 

 

0. 전제

[1] 게시글 DB에 좋아요 개수를 저장할 liked 컬럼을 추가해준 상태이다. (= default 0)

[2] 작성자가 아닌 다른 사람이 게시글을 조회하는 경우에만 [좋아요] [취소] 버튼이 나타나게끔 구현한다.

 

 

1. 가장 먼저, like_manager DB를 새로 생성해준다.

[1] 좋아요 중복을 방지하거나 좋아요 취소 기능을 구현하려면 누가 어떤 게시글에 좋아요를 누른 상태인지 추적할 수 있어야 하기 때문에, 사용자가 게시글에 좋아요를 누르는 경우 해당 사용자와 해당 게시글을 매칭해서 기록으로 남겨주어야 한다.

[2] 예시는 아래와 같다.

클릭하면 확대됩니다.

 

 

2. 다음은 게시글 조회 페이지를 출력하는 view.php에 추가해줄 내용이다.

<?php
    if($_SESSION['user_id'] != $res_view['writer']){ ?>
		<div class=mine>
        	<button class=like type="button" onclick="window.location.href='like_ok.php?id=<?=$res_view['id']?>'">좋아요</button>
            <button class=like type="button" onclick="window.location.href='unlike_ok.php?id=<?=$res_view['id']?>'">취소</button>
		</div>
<?php } ?>

[1] 현재 게시글을 조회한 사용자가 해당 게시글의 작성자가 아니라면,

[2] [좋아요] 버튼과 [취소] 버튼이 나타나게끔 한다.

 

[3] [좋아요] 버튼을 클릭하면 like_ok.php으로 넘어가게 하고 동시에 GET으로 게시글의 식별자 (= id) 를 넘겨준다.
[4] [취소] 버튼을 클릭하면 unlike_ok.php으로 넘어가게 하고 동시에 GET으로 게시글의 식별자 (= id) 를 넘겨준다.

 

 

3. 다음은 좋아요를 실질적으로 처리할 like_ok.php의 내용이다.

<?php
    session_start();
    $conn = mysqli_connect('localhost', 'choco', '7173', 'study_login');
    $id = $_GET['id'];
    $user_id = $_SESSION['user_id'];

    $sql_check = "SELECT * FROM board WHERE id=$id";
    $res_check = mysqli_fetch_array(mysqli_query($conn, $sql_check));
    if($user_id == $res_check['writer']){
        echo "<script>alert('자신의 게시글입니다!');";
        echo "window.history.back()</script>";
        exit;
    }

    $sql_check2 = "SELECT * FROM like_manager WHERE like_post_id='$id' and like_user='$user_id'";
    $res_check2 = mysqli_fetch_array(mysqli_query($conn, $sql_check2));
    if($res_check2){
        echo "<script>alert('이미 공감한 게시글입니다!');";
        echo "window.history.back()</script>";
        exit;
    }

    $sql = "
    UPDATE board SET liked=liked+1 WHERE id=$id;
    INSERT INTO like_manager(like_post_id, like_user) VALUES ('$id', '$user_id');
    ";
    $res = mysqli_multi_query($conn, $sql);
    echo "<script>alert('공감했습니다!');";
    echo "window.history.back()</script>";
?>

[1] GET으로 넘겨받은 게시글의 식별자 (= id) 를 $id에 할당해준다.

[2] 현재 세팅되어있는 세션의 user_id 정보를 $user_id에 할당해준다.

 

[3] 해당 게시글이 자신의 게시글이 아님을 한번 더 체크해주는 과정을 삽입해준다.

[4] 자신의 게시글일 시, alert를 출력하고 exit 해준다.

 

[5] 자신의 게시글이 아닐 시, like_manager에 질의를 던져 해당 게시글에 해당 사용자가 이미 좋아요를 누른 상태인지 확인한다.

[6] 이미 좋아요를 누른 상태일 시, alert를 출력하고 exit 해준다.

 

[7] 이미 좋아요를 누른 상태가 아니라면, 해당 게시글의 liked 레코드를 1만큼 증가시킨다.

[8] 동시에, like_manager에 해당 게시글의 식별자 (= id) 와 해당 사용자의 $user_id를 저장한다.

 

 

4. 다음은 좋아요 취소를 실질적으로 처리할 unlike_ok.php의 내용이다.

<?php
    session_start();
    $conn = mysqli_connect('localhost', 'choco', '7173', 'study_login');
    $id = $_GET['id'];
    $user_id = $_SESSION['user_id'];

    $sql_already = "SELECT * FROM like_manager WHERE like_post_id='$id' and like_user='$user_id'";
    $res_already = mysqli_fetch_array(mysqli_query($conn, $sql_already));
    if(!$res_already){
        echo "<script>alert('공감하지 않은 게시글입니다!');";
        echo "window.history.back()</script>";
        exit;
    }

    $sql = "
    UPDATE board SET liked=liked-1 WHERE id=$id;
    DELETE FROM like_manager WHERE like_post_id='$id' and like_user='$user_id';
    ";
    $res = mysqli_multi_query($conn, $sql);
    echo "<script>alert('공감을 취소했습니다!');";
    echo "window.history.back()</script>";
?>

[1] like_ok.php와 흡사한 구성이다.

[2] 좋아요 기록이 없을 시, alert를 출력하고 exit 해준다.

[3] 좋아요 기록이 있을 시, liked 레코드를 1만큼 감소시키고, like_manager에 저장되어있는 게시글-사용자 매칭 정보를 삭제한다.

[4] 이후는 board.php나 view.php에서 좋아요 개수를 확인할 수 있도록 원하는 위치에 $row['liked'] 를 배치해주면 된다.

프로필사진
berry
FE Developer, loves React & better DX
Comments