Today I Learned …
[웹개발] 조회수/좋아요(취소 포함) 기능 본문
* 개인적인 공부 내용을 기록한 글입니다.
설명
오늘은 조회수와 좋아요 기능에 대해 살펴보려고 한다.
최종 화면
조회수 기능
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'] 를 배치해주면 된다.
'Web > APM' 카테고리의 다른 글
[웹개발] 게시글 삭제 기능 (0) | 2021.11.07 |
---|---|
[웹개발] 게시글 수정 기능 (2) | 2021.11.07 |
[웹개발] 파일 업로드/다운로드 기능 (0) | 2021.11.02 |
[웹개발] 게시글 리스트 페이징 기능 (0) | 2021.11.01 |
[웹개발] 웹 최종 한 눈에 보기 (끝) : 마이페이지, 회원 정보 조회, 회원 정보 변경, 내가 쓴 글 모아보기, 내가 공감한 글 모아보기 (0) | 2021.10.27 |