서론
오늘은 간단할 줄 알았던 조회수/좋아요(취소포함) 기능을 만들어보자
(간단한 구현은 없었어..😮💨)
최종화면
1. 조회수 기능 만들기
✅board_read.php
if($user_id != $row['author']){
$sql_views = "UPDATE board SET views = views + 1 WHERE idx=$post_id";
$result_views = $mysqli->query($sql_views);
}
- 조회수 구현은 간단했다. 게시글 읽기 파일에 $user_id=$_SESSION['user_id']로 변수를 할당해줬다
- 로그인한 사용자와 작성자가 같지 않다면, 해당 게시글 views(조회수)를 1증가 시킨다.
1.2. 테스트
➡️현재 ronaldo라는 사용자로 로그인이 되어있다.
➡️자기 글인 ronaldo의 글을 조회하면 조회수가 올라가지 않는다.
➡️다른 작성자인 messi의 글을 조회하니 조회수가 1 올라갔다.
➡️이후에 게시글 안에서도 조회수를 볼 수 있게 추가해줬다.
3. 좋아요/취소 기능 만들기
3.1. 테이블 생성
- 먼저 post_likes라는 테이블을 만들었다.
- 좋아요 누른 이용자의 게시글번호/유저아이디를 알아내기 위해서 post_id, user_id를 만들었다.
- 좋아요를 중복으로 누를 수 없게 unique key를 추가해줬다.
3.2. board_read.php
$likes = false;
if($user_id){
$like_sql = "SELECT 1 FROM post_likes WHERE post_id=$post_id AND user_id='$user_id' LIMIT 1";
$like_result = $mysqli->query($like_sql);
if($like_result && $like_result->fetch_assoc()){
$likes =true;
}
}
- $likes에 기본값은 “좋아요를 누르지 않은 상태”로 false를 할당했다.
- $likes를 이용해 좋아요를 눌렀었는지 안눌렀었는지를 판단해서 로직을 구현할 것이다.
- post_likes테이블에서 해당 게시글($post_id)에 로그인한 사용자($user_id)가 이미 좋아요를 눌렀는지 검사한다.
- limit은 혹시 중복이 있을 시를 방지 하기위해서 넣었다.
- sql구문이 성공하고 행이 존재한다면 $likes를 true로 바꿔준다.
- 즉, 좋아요를 눌렀었다면 $likes는 true가 되는 것이다.
<div class="post_meta">
작성자: <?=$row['author']?> | 작성일: <?=$row['post_date']?> | 조회수: <?=$row['views']?> 좋아요<?=$row['likes']?>
<?php if($user_id && $user_id !== $row['author']): ?>
<span class="like_btn">
<?php if($likes): ?>
<form action="/board/unlike.php" method="POST">
<input type="hidden" name="post_id" value=<?= $row['idx']?>>
<button type="submit" class="unlike"><i class="fa-solid fa-heart"></i></button>
</form>
<?php else: ?>
<form action="/board/like.php" method="POST">
<input type="hidden" name="post_id" value=<?= $row['idx']?>>
<button type="submit" class="like"><i class="fa-regular fa-heart"></i></button>
</form>
<?php endif; ?>
</span>
<?php endif; ?>
</div>
- 작성자, 작성일, 조회수를 한 줄로 보여준다.
- 로그인한 사용자이면서 작성자가 아닐 때만 하트 버튼이 노출된다
- $likes가 true(좋아요 누름) → “취소” 버튼(꽉 찬 하트) → 클릭 시 /board/unlike.php로 post_id를 POST 방식으로 전송
- $likes가 false(좋아요 안 누름) → “좋아요” 버튼(빈 하트)→ 클릭 시 /board/like.php로 post_id를 POST 방식으로 전송
- <input>태그 속성으로 hidden을 줬고, 버튼 클릭 시 해당 게시글 번호(post_id)를 숨겨서 함께 서버로 전달한다.
- FontAwesome 아이콘 사용했다. 아래 링크 참고
링크:https://fontawesome.com/icons/heart?s=solid
3.3. like.php
<?php
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/php/db.php';
$post_id = $_POST['post_id'];
$user_id = $_SESSION['user_id'];
$sql_check1 = "SELECT author FROM board WHERE idx=$post_id";
$res_check1 = $mysqli->query($sql_check1);
$row = $res_check1-> fetch_assoc();
if($user_id === $row['author']){
echo "<script>alert('자신의 게시글에는 좋아요를 누를 수 없습니다.');";
echo "history.back()</script>";
exit;
}
$sql_check2 = "SELECT 1 FROM post_likes WHERE post_id=$post_id and user_id='$user_id' LIMIT 1";
$res_check2 = $mysqli->query($sql_check2);
if($res_check2 && $res_check2->fetch_assoc()){
echo "<script>alert('이미 좋아요를 눌렀습니다.');";
echo "history.back()</script>";
exit;
}
$sql = "UPDATE board SET likes = likes +1 WHERE idx=$post_id;
INSERT INTO post_likes (post_id,user_id) VALUES ('$post_id','$user_id');";
$result = $mysqli->multi_query($sql);
echo "<script>
location.href = '/board/board_read.php?idx=$post_id';
</script>";
exit;
?>
- 게시글 작성자 본인은 좋아요를 누를 수 없도록 1차 검증한다.
- 이미 좋아요를 누른 사용자는 중복 좋아요가 불가하도록 2차 검증한다.
- 두 조건 다 아니라면
해당 게시글의 좋아요 수를 1 증가시키고,
post_likes 테이블에 “누가 어떤 글에 좋아요했는지” 기록을 추가한다. - 모든 처리가 끝나면 해당 게시글 페이지로 이동한다.
3.4. unlike.php
<?php
session_start();
require_once $_SERVER['DOCUMENT_ROOT'].'/php/db.php';
$post_id = $_POST['post_id'];
$user_id = $_SESSION['user_id'];
$delete_sql = "DELETE FROM post_likes where post_id=$post_id AND user_id='$user_id' LIMIT 1;
UPDATE board SET likes = likes-1 WHERE idx=$post_id;";
$delete_res = $mysqli->multi_query($delete_sql);
echo "<script>
location.href = '/board/board_read.php?idx=$post_id';
</script>";
exit;
?>
- 현재 로그인한 사용자가 누른 좋아요 기록을 post_likes 테이블에서 삭제한다.
- 해당 게시글의 board 테이블에서 좋아요 수를 1 감소시킨다.
- 해당 게시글 페이지(board_read.php)로 이동한다.
- 사용자에게는 바뀐 좋아요 상태가 즉시 반영된 화면이 보여진다.
4. 테스트
➡️좋아요를 누르기 전 빈하트가 보이고 좋아요 수는 0이다.
➡️좋아요를 클릭하면 꽉 찬 하트가 되고, 좋아요 수가 증가한다.
➡️목록에서도 1이 증가한 것을 볼 수 있다.
➡️같은 작성자 글로 들어오면 좋아요는 보이지 않는다.
➡️하지만 클라이언트에서 JS, HTML 변조를 할 수 있기 때문에 php에서도 검증을 했다.
➡️개발자 도구에서 80이던 게시글번호를 자신의 게시글 번호인 74로 바꿔준 뒤 좋아요를 눌렀더니
알림이 뜬 것을 확인할 수 있다.
'Web > Web 개발' 카테고리의 다른 글
게시판 삭제 기능 만들기 (0) | 2025.06.02 |
---|---|
게시판 수정 기능 만들기 (0) | 2025.06.01 |
파일 업로드/다운로드 기능 (0) | 2025.05.26 |
게시판 읽기 기능 만들기 (0) | 2025.05.19 |
게시판 페이징 기능 만들기 (0) | 2025.05.19 |