“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”
PHP란?
PHP는 Hypertext Preprocessor의 약어로, 서버 측에서 실행되는 스크립트 언어입니다. PHP는 주로 동적 웹 페이지를 생성하고 관리하는 데 사용됩니다. PHP는 오픈 소스 언어이며, 웹 서버에서 무료로 실행될 수 있습니다.
PHP는 HTML과 함께 사용되며, PHP 코드를 HTML 문서 안에 포함시킬 수 있습니다. 이렇게 함으로써 PHP는 웹 페이지를 동적으로 생성하고 데이터베이스와 상호 작용할 수 있는 능력을 갖춥니다. PHP는 또한 파일 업로드, 이메일 전송, 세션 관리, 암호화, 데이터베이스 연결 등과 같은 기능도 제공합니다.
PHP는 많은 유명한 CMS(Content Management System) 및 프레임워크(Framework)에서 사용됩니다. 예를 들어, WordPress, Drupal, Joomla, Laravel, CodeIgniter 등이 있습니다.
boardSearch.php
<?php
include "../connect/connect.php";
include "../connect/session.php";
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
} else {
$page = 1;
}
$searchKeyword = $_GET['searchKeyword'];
$searchOption = $_GET['searchOption'];
$searchKeyword = $connect -> real_escape_string(trim($searchKeyword));
$searchOption = $connect -> real_escape_string(trim($searchOption));
$sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
switch($searchOption){
case "title":
$sql .= "WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
case "content":
$sql .= "WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
case "name":
$sql .= "WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
}
$result = $connect -> query($sql);
$totalCount = $result -> num_rows;
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>결과 게시판</title>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="intro__inner center">
<picture class="intro__images">
<source srcset="../assets/img/board01.png, ../assets/img/board01@2x.png 2x, ../assets/img/board01@3x.png 3x" />
<img src="../assets/img/board01.png" alt="회원가입 이미지">
</picture>
<h2>결과 게시판</h2>
<p class="intro__text">
웹디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
총 <em><?=$totalCount?></em>건의 게시물이 검색되었습니다.
</p>
</div>
<!-- intro__inner -->
<div class="board__inner">
<div class="board__btn">
<a href="board.php" class="btnStyle3">목록보기</a>
</div>
<div class="board__table">
<table>
<colgroup>
<col style="width: 5%">
<col>
<col style="width: 10%">
<col style="width: 15%">
<col style="width: 7%">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>등록자</th>
<th>등록일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<!-- <tr>
<td>1</td>
<td><a href="boardView.html">게시판 제목</a></td>
<td>천설희</td>
<td>2023.03.13</td>
<td>100</td>
</tr> -->
<?php
$viewNum = 10;
$viewLimit = ($viewNum * $page) - $viewNum;
$sql .= "LIMIT {$viewLimit}, {$viewNum}";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count > 0){
for($i=0; $i<$count; $i++){
$info = $result -> fetch_array(MYSQLI_ASSOC);
echo "<tr>";
echo "<td>".$info['boardID']."</td>";
echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
echo "<td>".$info['youName']."</td>";
echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
echo "<td>".$info['boardView']."</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='5'>게시글이 없습니다.</td></tr>";
}
}
?>
</tbody>
</table>
</div>
<div class="board__pages">
<ul>
<?php
//총 페이지 갯수
$boardTotalCount = ceil($totalCount/$viewNum);
//1 2 3 4 5 6 7 8 9 10
$pageView = 4;
$startPage = $page - $pageView;
$endPage = $page + $pageView;
//처음/마지막 페이지 초기화
if($startPage < 1) $startPage = 1;
if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
//처음, 이전
if($page !== 1 && $boardTotalCount !=0 && $page <= $boardTotalCount){
echo "<li><a href='boardSearch.php?page=1&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>처음으로</a></li>";
$prevPage = $page - 1;
echo "<li><a href='boardSearch.php?page={$prevPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>이전</a></li>";
}
// 페이지
for($i=$startPage; $i<=$endPage; $i++){
$active = "";
if($i == $page) $active = "active";
if($page <= $boardTotalCount){
echo "<li class='{$active}'><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page={$i}'>{$i}</a></li>";
}
}
// 마지막으로/ 다음
if($page != $boardTotalCount && $page <= $boardTotalCount){
$nextPage = $page +1;
echo "<li><a href='boardSearch.php?page={$nextPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>다음</a></li>";
echo "<li><a href='boardSearch.php?page={$boardTotalCount}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>마지막으로</a></li>";
}
?>
</ul>
</div>
</div>
<!-- board__inner -->
</main>
<?php include "../include/footer.php" ?>
<!-- //footer -->
</body>
</html>
<?php
include "../connect/connect.php";
include "../connect/session.php";
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
} else {
$page = 1;
}
$searchKeyword = $_GET['searchKeyword'];
$searchOption = $_GET['searchOption'];
$searchKeyword = $connect -> real_escape_string(trim($searchKeyword));
$searchOption = $connect -> real_escape_string(trim($searchOption));
$sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) ";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
// $sql = "SELECT b.boardID, b.boardTitle, b.boardContents, m.youName, b.regTime, b.boardView FROM board b JOIN members m ON(b.memberID = m.memberID) WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC";
switch($searchOption){
case "title":
$sql .= "WHERE b.boardTitle LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
case "content":
$sql .= "WHERE b.boardContents LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
case "name":
$sql .= "WHERE m.youName LIKE '%{$searchKeyword}%' ORDER BY boardID DESC ";
break;
}
$result = $connect -> query($sql);
$totalCount = $result -> num_rows;
?>
- 먼저, connect 폴더 안에 있는 connect.php와 session.php 파일을 include하여 데이터베이스와 세션을 사용할 수 있도록 합니다.
- GET 방식으로 전달받은 'page', 'searchKeyword', 'searchOption' 변수들을 처리합니다. 'page'는 페이지 번호를, 'searchKeyword'는 검색어를, 'searchOption'은 검색 옵션(제목, 내용, 작성자)을 나타냅니다.
- searchKeyword'와 'searchOption' 변수를 이용하여 SQL 쿼리를 생성합니다. 검색 옵션에 따라 WHERE 절의 조건을 다르게 설정하며, 검색어는 '%'로 감싸서 LIKE 연산자로 검색합니다. 결과를 게시글 작성일자(boardID)의 내림차순으로 정렬합니다.
- 생성된 SQL 쿼리를 실행하여 검색 결과를 가져옵니다.
- 검색된 게시글의 개수를 $totalCount 변수에 저장합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>결과 게시판</title>
<?php include "../include/head.php" ?>
</head>
<body class="gray">
<?php include "../include/skip.php" ?>
<!-- //skip -->
<?php include "../include/header.php" ?>
<!-- //header -->
<main id="main" class="container">
<div class="intro__inner center">
<picture class="intro__images">
<source srcset="../assets/img/board01.png, ../assets/img/board01@2x.png 2x, ../assets/img/board01@3x.png 3x" />
<img src="../assets/img/board01.png" alt="회원가입 이미지">
</picture>
<h2>결과 게시판</h2>
<p class="intro__text">
웹디자이너, 웹 퍼블리셔, 프론트앤드 개발자를 위한 게시판입니다.<br>
총 <em><?=$totalCount?></em>건의 게시물이 검색되었습니다.
</p>
</div>
<!-- intro__inner -->
검색 결과 게시판 페이지의 디자인을 위한 CSS 파일과 공통으로 사용되는 head, skip, header 등의 PHP 파일이 include되어 있습니다.
메인 요소 내부에는 검색 결과 게시물의 수를 출력하고, 그 아래에는 게시물의 목록을 출력하는데 사용되는 HTML 태그들이 위치합니다. 이 코드에서는 게시물 목록을 출력하는 부분이 생략되어 있으며, 게시물의 목록을 출력하는 PHP 코드는 이후에 등장할 것입니다.
<div class="board__inner">
<div class="board__btn">
<a href="board.php" class="btnStyle3">목록보기</a>
</div>
<div class="board__table">
<table>
<colgroup>
<col style="width: 5%">
<col>
<col style="width: 10%">
<col style="width: 15%">
<col style="width: 7%">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>등록자</th>
<th>등록일</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<!-- <tr>
<td>1</td>
<td><a href="boardView.html">게시판 제목</a></td>
<td>천설희</td>
<td>2023.03.13</td>
<td>100</td>
</tr> -->
<?php
$viewNum = 10;
$viewLimit = ($viewNum * $page) - $viewNum;
$sql .= "LIMIT {$viewLimit}, {$viewNum}";
$result = $connect -> query($sql);
if($result){
$count = $result -> num_rows;
if($count > 0){
for($i=0; $i<$count; $i++){
$info = $result -> fetch_array(MYSQLI_ASSOC);
echo "<tr>";
echo "<td>".$info['boardID']."</td>";
echo "<td><a href='boardView.php?boardID={$info['boardID']}'>".$info['boardTitle']."</a></td>";
echo "<td>".$info['youName']."</td>";
echo "<td>".date('Y-m-d', $info['regTime'])."</td>";
echo "<td>".$info['boardView']."</td>";
echo "</tr>";
}
} else {
echo "<tr><td colspan='5'>게시글이 없습니다.</td></tr>";
}
}
?>
</tbody>
</table>
</div>
- HTML 코드로는 테이블을 만들고, PHP 코드로는 게시글의 정보를 가져와 테이블의 각 행에 출력합니다.
- PHP 코드 중에는 $viewNum이라는 변수를 이용해 한 페이지당 보여줄 게시글의 수를 설정하고, $viewLimit 변수에는 현재 페이지에 해당하는 게시글의 시작 번호를 계산합니다.
- SQL 쿼리문에 적용하여 해당 페이지의 게시글만 가져오도록 설정합니다.
- 가져온 게시글이 있다면, for문을 이용해 각각의 게시글에 대해 행을 출력합니다.
- 게시글의 번호, 제목, 작성자, 작성일, 조회수 등의 정보를 테이블의 각 열에 출력합니다
- 가져온 게시글이 없을 경우, "게시글이 없습니다."라는 메시지가 출력됩니다.
<div class="board__pages">
<ul>
<?php
//총 페이지 갯수
$boardTotalCount = ceil($totalCount/$viewNum);
//1 2 3 4 5 6 7 8 9 10
$pageView = 4;
$startPage = $page - $pageView;
$endPage = $page + $pageView;
//처음/마지막 페이지 초기화
if($startPage < 1) $startPage = 1;
if($endPage >= $boardTotalCount) $endPage = $boardTotalCount;
//처음, 이전
if($page !== 1 && $boardTotalCount !=0 && $page <= $boardTotalCount){
echo "<li><a href='boardSearch.php?page=1&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>처음으로</a></li>";
$prevPage = $page - 1;
echo "<li><a href='boardSearch.php?page={$prevPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>이전</a></li>";
}
// 페이지
for($i=$startPage; $i<=$endPage; $i++){
$active = "";
if($i == $page) $active = "active";
if($page <= $boardTotalCount){
echo "<li class='{$active}'><a href='boardSearch.php?searchKeyword={$searchKeyword}&searchOption={$searchOption}&page={$i}'>{$i}</a></li>";
}
}
// 마지막으로/ 다음
if($page != $boardTotalCount && $page <= $boardTotalCount){
$nextPage = $page +1;
echo "<li><a href='boardSearch.php?page={$nextPage}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>다음</a></li>";
echo "<li><a href='boardSearch.php?page={$boardTotalCount}&searchKeyword={$searchKeyword}&searchOption={$searchOption}'>마지막으로</a></li>";
}
?>
</ul>
</div>
</div>
<!-- board__inner -->
</main>
<?php include "../include/footer.php" ?>
<!-- //footer -->
</body>
</html>
- 코드의 시작부분에서는 총 페이지 수를 계산합니다. 총 페이지 수는 검색 결과 게시글 수를 페이지당 보여줄 게시글 수로 나눈 값을 올림한 결과를 사용합니다.
- 현재 페이지를 중심으로 이전/다음 페이지를 구하기 위해 시작 페이지와 마지막 페이지를 계산합니다.
- 시작 페이지는 현재 페이지에서 보여줄 페이지 수의 절반만큼 빼고, 마지막 페이지는 현재 페이지에서 보여줄 페이지 수의 절반만큼 더한 값을 사용합니다.
- 시작 페이지가 1보다 작으면 1로, 마지막 페이지가 총 페이지 수보다 크면 총 페이지 수로 설정합니다.
- 시판의 페이징을 출력하는 부분입니다. 처음/마지막 페이지, 이전/다음 페이지 버튼을 출력하고, 페이지 번호를 출력합니다.
- 현재 페이지는 active 클래스를 추가하여 표시하며, 링크를 클릭하면 해당 페이지로 이동합니다.
- include 함수를 이용하여 공통적으로 사용하는 푸터 파일을 불러와 마무리합니다.