
<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>

// 검색 버튼
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
})
// 전체 목록
const btn_all = document.querySelector("#btn_all")
btn_all.addEventListener("click", () => {
location.href = './board.php?bcode=' + params['bcode']
})
// 글 목록
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();
}
CONCAT을 사용한 이유는 SQLi을 예방하기 위해서입니다.
$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"];
}









다른 조건들도 비슷한 내용이기에 나머지는 생략했습니다.
다음 시간에는 게시판 글 보기를 해보겠습니다.
감사합니다.