13. PHP 게시판 만들기, list 제작 3
주의: 본 게시판은 보안을 생각하지 않고 만들어졌으므로 실제로 사용되어서는 안되는 코드입니다.
공부할 때 게시판이 이처럼 동작한다는 정도로만 이해해주세요.
자격증 시험 때문에 조금 늦어졌습니다.
오늘은 검색 부분을 만들어보려고 합니다.
먼저 하단의 파일을 받아주세요!
파일을 받고, index.php를 열어보면 아래의 코드가 있습니다.
<?php
require_once("../dbconfig.php");
/* 페이징 시작 */
//페이지 get 변수가 있다면 받아오고, 없다면 1페이지를 보여준다.
if(isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 1;
}
/* 검색 시작 */
if(isset($_GET['searchColumn'])) {
$searchColumn = $_GET['searchColumn'];
$subString .= '&searchColumn=' . $searchColumn;
}
if(isset($_GET['searchText'])) {
$searchText = $_GET['searchText'];
$subString .= '&searchText=' . $searchText;
}
if(isset($searchColumn) && isset($searchText)) {
$searchSql = ' where ' . $searchColumn . ' like "%' . $searchText . '%"';
} else {
$searchSql = '';
}
/* 검색 끝 */
$sql = 'select count(*) as cnt from board_free' . $searchSql;
$result = $db->query($sql);
$row = $result->fetch_assoc();
$allPost = $row['cnt']; //전체 게시글의 수
if(empty($allPost)) {
$emptyData = '<tr><td class="textCenter" colspan="5">글이 존재하지 않습니다.</td></tr>';
} else {
$onePage = 15; // 한 페이지에 보여줄 게시글의 수.
$allPage = ceil($allPost / $onePage); //전체 페이지의 수
if($page < 1 && $page > $allPage) {
?>
<script>
alert("존재하지 않는 페이지입니다.");
history.back();
</script>
<?php
exit;
}
$oneSection = 10; //한번에 보여줄 총 페이지 개수(1 ~ 10, 11 ~ 20 ...)
$currentSection = ceil($page / $oneSection); //현재 섹션
$allSection = ceil($allPage / $oneSection); //전체 섹션의 수
$firstPage = ($currentSection * $oneSection) - ($oneSection - 1); //현재 섹션의 처음 페이지
if($currentSection == $allSection) {
$lastPage = $allPage; //현재 섹션이 마지막 섹션이라면 $allPage가 마지막 페이지가 된다.
} else {
$lastPage = $currentSection * $oneSection; //현재 섹션의 마지막 페이지
}
$prevPage = (($currentSection - 1) * $oneSection); //이전 페이지, 11~20일 때 이전을 누르면 10 페이지로 이동.
$nextPage = (($currentSection + 1) * $oneSection) - ($oneSection - 1); //다음 페이지, 11~20일 때 다음을 누르면 21 페이지로 이동.
$paging = '<ul>'; // 페이징을 저장할 변수
//첫 페이지가 아니라면 처음 버튼을 생성
if($page != 1) {
$paging .= '<li class="page page_start"><a href="./index.php?page=1' . $subString . '">처음</a></li>';
}
//첫 섹션이 아니라면 이전 버튼을 생성
if($currentSection != 1) {
$paging .= '<li class="page page_prev"><a href="./index.php?page=' . $prevPage . $subString . '">이전</a></li>';
}
for($i = $firstPage; $i <= $lastPage; $i++) {
if($i == $page) {
$paging .= '<li class="page current">' . $i . '</li>';
} else {
$paging .= '<li class="page"><a href="./index.php?page=' . $i . $subString . '">' . $i . '</a></li>';
}
}
//마지막 섹션이 아니라면 다음 버튼을 생성
if($currentSection != $allSection) {
$paging .= '<li class="page page_next"><a href="./index.php?page=' . $nextPage . $subString . '">다음</a></li>';
}
//마지막 페이지가 아니라면 끝 버튼을 생성
if($page != $allPage) {
$paging .= '<li class="page page_end"><a href="./index.php?page=' . $allPage . $subString . '">끝</a></li>';
}
$paging .= '</ul>';
/* 페이징 끝 */
$currentLimit = ($onePage * $page) - $onePage; //몇 번째의 글부터 가져오는지
$sqlLimit = ' limit ' . $currentLimit . ', ' . $onePage; //limit sql 구문
$sql = 'select * from board_free' . $searchSql . ' order by b_no desc' . $sqlLimit; //원하는 개수만큼 가져온다. (0번째부터 20번째까지
$result = $db->query($sql);
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>자유게시판 | Kurien's Library</title>
<link rel="stylesheet" href="./css/normalize.css" />
<link rel="stylesheet" href="./css/board.css" />
</head>
<body>
<article class="boardArticle">
<h3>자유게시판</h3>
<div id="boardList">
<table>
<caption class="readHide">자유게시판</caption>
<thead>
<tr>
<th scope="col" class="no">번호</th>
<th scope="col" class="title">제목</th>
<th scope="col" class="author">작성자</th>
<th scope="col" class="date">작성일</th>
<th scope="col" class="hit">조회</th>
</tr>
</thead>
<tbody>
<?php
if(isset($emptyData)) {
echo $emptyData;
} else {
while($row = $result->fetch_assoc())
{
$datetime = explode(' ', $row['b_date']);
$date = $datetime[0];
$time = $datetime[1];
if($date == Date('Y-m-d'))
$row['b_date'] = $time;
else
$row['b_date'] = $date;
?>
<tr>
<td class="no"><?php echo $row['b_no']?></td>
<td class="title">
<a href="./view.php?bno=<?php echo $row['b_no']?>"><?php echo $row['b_title']?></a>
</td>
<td class="author"><?php echo $row['b_id']?></td>
<td class="date"><?php echo $row['b_date']?></td>
<td class="hit"><?php echo $row['b_hit']?></td>
</tr>
<?php
}
}
?>
</tbody>
</table>
<div class="btnSet">
<a href="./write.php" class="btnWrite btn">글쓰기</a>
</div>
<div class="paging">
<?php echo $paging ?>
</div>
<div class="searchBox">
<form action="./index.php" method="get">
<select name="searchColumn">
<option <?php echo $searchColumn=='b_title'?'selected="selected"':null?> value="b_title">제목</option>
<option <?php echo $searchColumn=='b_content'?'selected="selected"':null?> value="b_content">내용</option>
<option <?php echo $searchColumn=='b_id'?'selected="selected"':null?> value="b_id">작성자</option>
</select>
<input type="text" name="searchText" value="<?php echo isset($searchText)?$searchText:null?>">
<button type="submit">검색</button>
</form>
</div>
</div>
</article>
</body>
</html>
이번에도 빨간색으로 적혀진 부분이 수정된 부분입니다.
전체적인 코드는 길지만 전에 설명했던 부분이므로 빨간색 코드 부분만 설명 드리겠습니다.
/* 검색 시작 */
if(isset($_GET['searchColumn'])) {
$searchColumn = $_GET['searchColumn'];
$subString .= '&searchColumn=' . $searchColumn;
}
if(isset($_GET['searchText'])) {
$searchText = $_GET['searchText'];
$subString .= '&searchText=' . $searchText;
}
if(isset($searchColumn) && isset($searchText)) {
$searchSql = ' where ' . $searchColumn . ' like "%' . $searchText . '%"';
} else {
$searchSql = '';
}
/* 검색 끝 */
$sql = 'select count(*) as cnt from board_free' . $searchSql;
검색 시작부분부터 보면 searchColumn이라는 GET 변수와 searchText라는 GET 변수를 받아왔습니다.
거기에 $subString이라는 아직은 뭔지 이해 하기 힘든 변수가 하나 있긴 한데요,
뒷 부분에서 사용되는 변수입니다.
일단은 &가 &(엠퍼센트)라는 것만 알고 넘어가시면 되겠습니다.
그 다음 $searchColumn과 $searchText 변수가 선언되어있다면, $searchSql을 선언합니다.
선언 되어있지 않았을 때 ''(공백)을 넣는 이유는 아래 있는 $sql을 보면 나와있습니다.
만약 $searchSql에 값이 있다면,
$sql은 'select count(*) as cnt from board_free where ' . $searchColumn .' like "%' . $searchText . '%"';가 되고,
값이 없다면,
$sql은 'select count(*) as cnt from board_free가 되겠죠?
이런 작업을 통해서 검색 시에는 기존과는 다른 결과를 볼 수 있게 되는겁니다.
if(empty($allPost)) {
$emptyData = '<tr><td class="textCenter" colspan="5">글이 존재하지 않습니다.</td></tr>';
} else {
}
이 코드는 검색 기능을 넣으면서 글이 없을 때 문제가 있어서 추가한 부분입니다.
만약 $allPost의 값이 0이라면 글이 존재하지 않습니다. 라는 결과를 출력하게 만들었습니다.
$allPost가 0이 아니라면 정상적으로 실행이 되는거구요.
$paging .= '<li class="page page_start"><a href="./index.php?page=1' . $subString . '">처음</a></li>';
$paging .= '<li class="page page_prev"><a href="./index.php?page=' . $prevPage . $subString . '">이전</a></li>';
$paging .= '<li class="page"><a href="./index.php?page=' . $i . $subString . '">' . $i . '</a></li>';
$paging .= '<li class="page page_next"><a href="./index.php?page=' . $nextPage . $subString . '">다음</a></li>';
$paging .= '<li class="page page_end"><a href="./index.php?page=' . $allPage . $subString . '">끝</a></li>';
$sql = 'select * from board_free' . $searchSql . ' order by b_no desc' . $sqlLimit;
else 부분에서 수정된 코드들입니다.
먼저 $paging 변수에는 모두 $subString이라는 변수를 추가했는데요.
검색이 없었을 때의 목록이였다면 별 문제가 없지만 GET변수를 통해서 searchColumn과 searchText를 받아오게 될 때는 문제가 생깁니다.
검색을 해도 페이징이 생길 수 있는데, 만약 $subString을 사용하지 않으면 다른 페이지로 넘어간 순간 두 GET 변수가 사라지고,
그냥 일반 목록의 페이지가 표시되어버리는거죠.
여기서 위에서 선언한 $subString('&searchColumn=' . $searchColumn . '&searchText=' . $searchText;가 있으면
모든 페이지에 GET 변수인 검색 부분이 함께 따라오게 되고, 해당 검색어에 대한 결과 값이 정상적으로 보여집니다.
$sql 부분은 위에 있던 $sql처럼 검색에 대한 $searchSql을 추가해줬습니다.
이 부분을 넣음으로써 목록이 검색어에 관한 결과로 바뀝니다.
if(isset($emptyData)) {
echo $emptyData;
} else {
}
<div class="searchBox">
<form action="./index.php" method="get">
<select name="searchColumn">
<option <?php echo $searchColumn=='b_title'?'selected="selected"':null?> value="b_title">제목</option>
<option <?php echo $searchColumn=='b_content'?'selected="selected"':null?> value="b_content">내용</option>
<option <?php echo $searchColumn=='b_id'?'selected="selected"':null?> value="b_id">작성자</option>
</select>
<input type="text" name="searchText" value="<?php echo isset($searchText)?$searchText:null?>">
<button type="submit">검색</button>
</form>
</div>
마지막으로 $emptyData와 #searchBox입니다.
$emptyData는 위에서 생성했던 글이 존재하지 않습니다.라는 결과를 출력해주는 부분입니다.
$emptyData가 없다면 정상 실행 되는거구요.
그리고 #searchBox 부분은 검색 기능을 담당할 select 태그와 input 태그로 구성되어있습니다.
이 부분에 검색을 하게 되면 위에서 프로그래밍 해둔 부분이 실행 되고, 목록의 결과가 바뀌게 되는거죠.
위의 이미지는 제목에 1이 포함된 글을 출력한 부분입니다.
먼저 URL을 보시면 searchColumn과 searchText에 값이 존재하는 것을 알 수 있죠?
각각 b_title과 1이라는 값이 있고, 아래 검색 폼에도 같은 내용이 있습니다.
그 아래 URL을 보시면 page=2&searchColumn=b_title&searchText=1이라는 값이 들어있는데,
이 부분은 페이징에서 2 페이지 부분에 마우스를 댔을 때 나오는 부분입니다.
위에서 $subString 부분을 넣었기 때문에 검색에 관한 GET 변수도 함께 들어가게 된겁니다.
어렵다고 생각하실 수 있지만 여러번 읽어보시는 수밖에 없구요.
이해가 안되는 부분이 있다면 댓글 남겨주시면 최대한 빠르게 답변 해드리겠습니다^^
'Project > PHP 게시판' 카테고리의 다른 글
15. PHP 게시판 만들기, view 제작 4 (10) | 2015.04.26 |
---|---|
14. PHP 게시판 만들기, view 제작 3 (6) | 2015.04.21 |
12. PHP 게시판 만들기, list 제작 2 (37) | 2015.04.16 |
11. PHP 게시판 만들기, view 제작 2 (23) | 2015.04.14 |
10. PHP 게시판 만들기, delete 제작 2 (16) | 2015.04.13 |