13. PHP 게시판 만들기, list 제작 3

2015. 4. 19. 22:49
저자 : Kurien

주의: 본 게시판은 보안을 생각하지 않고 만들어졌으므로 실제로 사용되어서는 안되는 코드입니다.

공부할 때 게시판이 이처럼 동작한다는 정도로만 이해해주세요.


자격증 시험 때문에 조금 늦어졌습니다.

오늘은 검색 부분을 만들어보려고 합니다.


먼저 하단의 파일을 받아주세요!


20150419_project.zip


파일을 받고, 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 .= '&amp;searchColumn=' . $searchColumn;

}

if(isset($_GET['searchText'])) {

$searchText = $_GET['searchText'];

$subString .= '&amp;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 .= '&amp;searchColumn=' . $searchColumn;

}

if(isset($_GET['searchText'])) {

$searchText = $_GET['searchText'];

$subString .= '&amp;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이라는 아직은 뭔지 이해 하기 힘든 변수가 하나 있긴 한데요,

뒷 부분에서 사용되는 변수입니다.

일단은 &amp;가 &(엠퍼센트)라는 것만 알고 넘어가시면 되겠습니다.


그 다음 $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('&amp;searchColumn=' . $searchColumn . '&amp;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 변수도 함께 들어가게 된겁니다.


어렵다고 생각하실 수 있지만 여러번 읽어보시는 수밖에 없구요.

이해가 안되는 부분이 있다면 댓글 남겨주시면 최대한 빠르게 답변 해드리겠습니다^^