게시판 - 글 보기 다운로드 횟수 기록하기

이태현·2025년 9월 9일

Web 개발

목록 보기
43/53
post-thumbnail

회원만 다운로드 가능하게 하기




파일 링크가 있는데 이걸 복사하고 로그아웃을 한 후에 주소창에 복사한 주소를 입력하면 다운로드가 바로 이루어집니다. 복사한 링크만 있다면 누구나 다운을 받을 수 있다는 거죠. 이 부분을 한번 제한하도록 해보겠습니다.

회원만 다운로드 - 문제해결


include "../inc/common.php";

if ($ss_id == '') {
  die('
  <script>
  alert("로그인한 회원만 다운로드가 가능합니다.")
  location.href="/member/login.php"
  </script>');
}

회원이 아니라면 다운로드 페이지의 이동을 막고 로그인 페이지로 이동하도록 해주었습니다.

회원인 상태에서는 다운로드가 가능합니다.

다운로드 횟수


현재 board에서는 다운로드 횟수를 저장할 필드가 없습니다. 그래서 새로운 칼럼을 추가해서 사용하도록 하겠습니다.

ALTER TABLE board ADD COLUMN downhit VARCHAR(20) DEFAULT '' AFTER hit;

새로운 칼럼을 추가하기 위해서 alter 구문을 사용하였습니다. 그다음 필드명을 down hit라고 지어주고 크기는 20바이트 기본값은 없고 hit 필드 다음에 추가하도록 하였습니다.

down hit 필드가 hit 필드 다음에 정상적으로 적용되었습니다. 이제 down hit에 다운로드한걸 기록하도록 하겠습니다.

문제점

첨부파일을 내려받을 때 횟수가 증가하는 걸 해당 위치에 문자열로 기록해야 합니다. ex) 2? 3? 5
그런데 지금 문제는 파일이 몇 개 속해있는지를 알아야 하는데 현재로는 알 수가 없습니다.
현재는 첨부파일을 가져올 때

a202509081327328097.xls|member.xls?a202509081327328397.jpg|lake-7938396_640.jpg

이러한 방식으로 원래 파일명과 업로드 파일명으로 가져와서 사용하고 있습니다.
그래서 값을 가져올 때 총 파일의 개수도 가져오도록 하겠습니다.

다운로드 횟수 - 문제해결

다운로드 횟수 구하기 - DB

  // 첨부파일 구하기
  public function getAttachFile($idx, $th)
  {
    $sql = "SELECT files FROM board WHERE idx=:idx";
    $stmt = $this->conn->prepare($sql);
    $params = [":idx" => $idx];
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute($params);
    $row = $stmt->fetch();

    $filelist = explode('?', $row['files']);

    return $filelist[$th] . '|' . count($filelist);
  }

기존에 첨부파일을 구하는 값에서 추가로 현재 파일의 개수를 구하여 값을 반환합니다.

$fileinfo = $board->getAttachFile($idx, $th);
list($file_source, $file_name, $total_file) = explode('|', $fileinfo);
echo 'total_file : ' . $total_file;
exit;

현재 페이지에 첨부파일이 2개 있다는 걸 알 수 있습니다.

다운로드 횟수가 비어있을 때

첫번째 파일

두번째 파일

if ($downhit == '') {
  $tmp_arr = [];
  for ($i = 0; $i < $total_file; $i++) {
    if ($th == $i) {
      $tmp_arr[] = 1;
    } else {
      $tmp_arr[] = 0;
    }
  }
}
print_r($tmp_arr);
exit;

첫 번째 파일을 클릭하면 0번째 값이 1이 들어가 있고, 두 번째 파일을 클릭하면 1번째 값에 1이 들어가 있습니다.

다운로드 횟수가 존재할 때

if ($downhit == '') {
  $tmp_arr = [];
  for ($i = 0; $i < $total_file; $i++) {
    if ($th == $i) {
      $tmp_arr[] = 1;
    } else {
      $tmp_arr[] = 0;
    }
  }
} else {
  // downhit = 4?0;
  $tmp_arr = explode('?', $downhit);
  $tmp_arr[$th] = $tmp_arr[$th] + 1;
}

$downhit_str = implode('?', $tmp_arr);

$board->increseDownhit($idx, $downhit_str);

기존에 있던 값을 나눠서 해당 값에 +1을 해줍니다. 이후 나눠진 2개 값을 '?'를 포함해 다시 문자열로 만들어서 합쳐줍니다.

다운로드 횟수 증가시키기 - DB

  // 다운로드 횟수 증가시키기
  public function increseDownhit($idx, $downhit)
  {
    $sql = "UPDATE board set downhit=:downhit WHERE idx=:idx";
    $stmt = $this->conn->prepare($sql);
    $params = [":downhit" => $downhit, ":idx" => $idx];
    $stmt->execute($params);
  }

합쳐진 값을 가지고 DB에 저장합니다.

결과

DB 결과

    <div class="p-3"><?= $boardRow['content']; ?>
      <!-- 첨부파일 다운로드 -->
      <?php
      if ($boardRow['files'] != '') {

        $filelist = explode('?', $boardRow['files']);

        $th = 0;
        foreach ($filelist as $file) {
          list($file_source, $file_name) = explode('|', $file);
          if ($boardRow['downhit'] == '') {
            // [배열명] = array_fill([시작번호], [채울 항목 수], '[값]');
            $downhit_arr = array_fill(0, count($filelist), 0);
          }
          echo "<a href=\"./pg/boarddownload.php?idx=$idx&th=$th\">$file_name</a> (down : " . $downhit_arr[$th] . ") <br>";
          $th++;
        }
      }
      ?>
    </div>

게시물을 처음 작성한 후 다시 해당 게시물을 확인하면 처음에는 $downhit_arr값이 비어 있기 때문에 $downhit_arr 배열에 0값을 채워 넣어서 오류를 방지하였습니다.

다시 돌아와서 DB에 저장된 값을 가지고 와서 화면에 출력하면 됩니다.

마무리

다음 시간에는 중복 카운팅 방지를 해보겠습니다.

감사합니다.

profile
이해하고 분석하고 지배한다

0개의 댓글