게시판 - 글목록 검색 기능, 게시물 번호 재지정

이태현·2025년 9월 6일

Web 개발

목록 보기
40/53
post-thumbnail

검색 기능 - UI

  <div class="container mt-2 w-50 d-flex gap-2">
    <select name="" id="sn" class="form-select w-25">
      <option value="1" <?php if ($sn == 1) echo " selected"; ?>>제목+내용</option>
      <option value="2" <?php if ($sn == 2) echo " selected"; ?>>제목</option>
      <option value="3" <?php if ($sn == 3) echo " selected"; ?>>내용</option>
      <option value="4" <?php if ($sn == 4) echo " selected"; ?>>글쓴이</option>
    </select>
    <input type="text" id="sf" class="form-control w-25" value=<?= $sf ?>>
    <button class="btn btn-primary w-25" id="btn_search">검색</button>
    <button class="btn btn-info w-25" id="btn_all">전체 목록</button>
  </div>

검색 기능 - JS

  // 검색 버튼
  const btn_search = document.querySelector("#btn_search")
  btn_search.addEventListener("click", () => {
    const sn = document.querySelector("#sn")
    const sf = document.querySelector("#sf")

    if (sf.value == "") {
      alert("검색어를 입력해 주세요.")
      sf.focus()
      return false
    }

    location.href = './board.php?bcode=' + params['bcode'] + '&sn=' + sn.value + '&sf=' + sf.value
  })

전체 목록 - JS

  // 전체 목록
  const btn_all = document.querySelector("#btn_all")
  btn_all.addEventListener("click", () => {
    location.href = './board.php?bcode=' + params['bcode']
  })

글 목록 - PHP

  // 글 목록
  public function list($bcode, $page, $limit, $paramArr)
  {
    $start = ($page - 1) * $limit;
    $where = "WHERE bcode=:bcode ";
    $params = [':bcode' => $bcode];
    if (isset($paramArr["sn"]) && $paramArr["sn"] != "" && isset($paramArr["sf"]) && $paramArr["sf"] != "") {
      switch ($paramArr["sn"]) {
        case 1:
          $where .= "AND (subject LIKE CONCAT('%',:sf,'%')) OR (content LIKE CONCAT('%',:sf2,'%'))";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf'], ':sf2' => $paramArr['sf']];
          break; // 제목 + 내용 검색
        case 2:
          $where .= "AND (subject LIKE CONCAT('%',:sf,'%'))";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf']];
          break; // 제목 검색
        case 3:
          $where .= "AND (content LIKE CONCAT('%',:sf,'%'))";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf']];
          break; // 내용 검색
        case 4:
          $where .= "AND (name=:sf)";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf']];
          break; // 글쓴이 검색
      }
    }

    $sql = "SELECT idx, id, name, subject, hit, DATE_FORMAT(create_at,'%Y-%m-%d %H-%i') AS create_at 
    FROM board " . $where . "
    ORDER BY idx DESC LIMIT " . $start . "," . $limit;

    $stmt = $this->conn->prepare($sql);

    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute($params);
    return $stmt->fetchAll();
  }
  • LIKE 문 : 해당하는 문자열 찾기
    • ex) subject LIKE % 무궁화% => 제목 칼럼에 무궁화 문자열 찾기
  • CONCAT 문 : 문자 붙이기
    • ex) CONCAT('a','b','c') => abc

CONCAT을 사용한 이유는 SQLi을 예방하기 위해서입니다.

  • ex) bindParam과 같은 의미입니다.
$stmt->bindParam(':sf',$paramArr['sf'])

게시판 전체 글 수

  // 게시판 전체 글 수 구하기
  public function total($bcode, $paramArr)
  {
    $where = "WHERE bcode=:bcode ";

    $params = [':bcode' => $bcode];
    if (isset($paramArr["sn"]) && $paramArr["sn"] != "" && isset($paramArr["sf"]) && $paramArr["sf"] != "") {
      switch ($paramArr["sn"]) {
        case 1:
          $where .= "AND (subject LIKE CONCAT('%',:sf,'%')) OR (content LIKE CONCAT('%',:sf2,'%'))";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf'], ':sf2' => $paramArr['sf']];
          break; // 제목 + 내용 검색
        case 2:
          $where .= "AND (subject LIKE CONCAT('%',:sf,'%'))";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf']];
          break; // 제목 검색
        case 3:
          $where .= "AND (content LIKE CONCAT('%',:sf,'%'))";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf']];
          break; // 내용 검색
        case 4:
          $where .= "AND (name=:sf)";
          $params = [':bcode' => $bcode, ':sf' => $paramArr['sf']];
          break; // 글쓴이 검색
      }
    }

    $sql = "SELECT COUNT(*) as cnt
    FROM board " . $where;

    $stmt = $this->conn->prepare($sql);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute($params);
    $row = $stmt->fetch();

    return $row["cnt"];
  }

결과

1 페이지

2 페이지

3 페이지

제목+내용 검색

자유게시판 - 검색어

자유게시판 - 주소

자유게시판 - 검색 결과

제목 검색

자유게시판 - 검색어

자유게시판 - 주소

자유게시판 - 검색 결과


다른 조건들도 비슷한 내용이기에 나머지는 생략했습니다.

마무리

다음 시간에는 게시판 글 보기를 해보겠습니다.

감사합니다.

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

0개의 댓글