한 사람이 반복해서 내려받거나 반복해서 글을 조회했을 때 카운팅이 계속 발생하는데 그걸 제한해 보겠습니다. 완벽하게 차단은 하지 못할 겁니다. 하지만 차단에 대한 참조 정도는 될 거라고 생각됩니다.

3번 정도 2번째 파일을 내려받았는데 3->4로만 증가하고 그 이후부터는 증가하지 않습니다.
$str = $idx . '?' . $th;
if (isset($_SESSION['lastdownhit']) && $_SESSION['lastdownhit'] != '') {
if ($str != $_SESSION['lastdownhit']) {
$board->increseDownhit($idx, $downhit_str);
$_SESSION['lastdownhit'] = $str;
}
} else {
$board->increseDownhit($idx, $downhit_str);
$_SESSION['lastdownhit'] = $str;
}
$str = $idx . '?' . $th;
중복 방지를 하기 위해서 해당 게시물의 idx값과 게시물 번호th값을 알아야 합니다.
str 변수에 idx값과 th값을 담아줍니다. 이제 해당 값을 가지고 세션과 비교하여 중복 처리를 해줍니다.
$_SESSION['lastdownhit'] = $str;
str 값을 세션에 현재 게시물과 파일의 순서를 담아서 판단을 해줄 겁니다.
if ($str != $_SESSION['lastdownhit']) {
$board->increseDownhit($idx, $downhit_str);
$_SESSION['lastdownhit'] = $str;
}
세션 값이 존재할 때는 기존에 있던 str 값이랑 비교해서 같지 않으면 다른 파일을 선택하고 온 것이기 때문에 다운로드 횟수를 증가시키고 str 값을 현재 게시물의 첨부파일 값을 담아줍니다.
else {
$board->increseDownhit($idx, $downhit_str);
$_SESSION['lastdownhit'] = $str;
}
세션 값이 존재하지 않다는 것은 아직 한 번도 다운로드를 하지 않은 상태이기 때문에 현재 게시물의 첨부파일 다운로드 횟수를 증가시키고, 세션에는 현재 게시물의 첨부파일 값을 담아줍니다.
이번에는 세션으로 하지 않고 DB에 직접 필드를 생성해서 해당 값으로 조회수를 제한해 보겠습니다.

현재 게시판 DB는 이렇게 정의되고 있습니다. 여기에 새로운 필드를 추가해 보도록 하겠습니다.

alter table board add column last_reader varchar(30) default '' after downhit;
첨부파일 조회수 다음에 새로운 필드가 정상적으로 추가되었습니다.
public function updateLastReader($idx, $str)
{
$sql = "UPDATE board SET last_reader=:last_reader WHERE idx=:idx";
$stmt = $this->conn->prepare($sql);
$params = [":last_reader" => $str, ":idx" => $idx];
$stmt->execute($params);
}
이제 게시물을 확인하면 조회수가 올라가면서 last_reader에 현재 접속자의 IP가 담깁니다.
// $_SERVER['REMOTE_ADDR'] : 사용자가 현재 페이지를 보고있는 IP 주소입니다.
if ($boardRow['last_reader'] != $_SERVER['REMOTE_ADDR']) {
$board->hitINC($idx);
$board->updateLastReader($idx, $_SERVER['REMOTE_ADDR']);
}
게시물의 정보를 불러와서 기존에 있던 IP 값과 현재 IP 값을 비교해서 같지 않으면 조회수가 증가하고 같다면 조회수가 올라가지 않게 제한하였습니다.


현재 해당 게시물은 DB에 있는 IP 값과 마지막 사용자의 IP 값이 같아서 더 이상 조회수가 올라가지 않습니다. 조회수가 62->63으로 한번 증가하고 더 이상 증가하지 않습니다.
다음 시간에는 자신이 작성한 글에 대해서만 글 수정, 삭제 버튼이 생기도록 해보겠습니다.
감사합니다.