이번에는 게시판에서 검색기능과 페이징 기능을 만들도록 하겠다.
우선 검색기능이다. 이는 get method를 이용하여 구현하였다. form태그에 get으로 전송을 시키고 select 태그를 이용하여 전체,제목,내용,작성자 중에서 무엇을 검색할지 고를 수 있도록 하였다.
그리고 만약 get으로 target과 keyword가 전송된다면 이에 따라서 쿼리문이 달라지도록 하였다. 예시로 target이 all이면 titl, content, writer를 like문으로 keyword로 검색하도록 하는 쿼리문을 작성하였다.
이렇게 된다면 검색된 값들만 table에 표시 될 것이다.
<?php
require_once 'tool/db_conn.php';
// require_once 'tool/chack_er.php';
$target=$_GET['target'];
$keyword=$_GET['keyword'];
if(isset($_GET["page"])){
$page=$_GET['page'];
$read=($page - 1) * 10;
}elseif(!isset($_GET["page"])){
$read=0;
}
if(isset($_GET["target"])&&isset($_GET["keyword"])){
if($_GET["target"]==="all"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE title LIKE '%" . $_GET['keyword'] . "%' OR writer LIKE '%" . $_GET['keyword'] . "%' OR content LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}elseif($_GET["target"]==="title"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE title LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}elseif($_GET["target"]==="content"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE writer LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}elseif($_GET["target"]==="writer"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE content LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}
}else {
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 ORDER BY board_id DESC LIMIT 10 OFFSET " .$read;
}
$list_board_1_all = mysqli_query($con, $list_board_1_query);
?>
다음으로 페이징 기능을 만들어보도록하겠다.
table에 데이터를 표시 할 때 리소스를 적게 사용하기 위하여 내림차순으로 10개만 출력하도록 하였다.
하지만 이 경우에는 10개 이후의 글을 볼 수가 없게 된다. 이러한 문제를 해결하기 위한 방법이 페이징 기능이다.
10개 이후 글을 볼 수 있는 방법은 쿼리문에 OFFSET을 추가해주는 것이다.
OFFSET 10을 쿼리문 뒤에 추가해주도록 하면 10개의 데이터를 건너뛰고 그 이후부터 데이터가 나오게 된다.
이를 이용하여 get으로 받은 page 값이 1이라면 처음부터, 2라면 10부터, 3이라면 20부터 글이 나오도록 할 수 있다.
page값을 변수로 저장하여 1을 뺀 뒤에 10을 곱하게 되면 위와 같은 숫자가 나오게된다. 예시는 아래와 같다.
page=1 일떄 : (1-1)*10 = 0번째부터의 데이터
이제 페이지를 이동시키는 링크를 만들어 주도록 하겠다. for문으로 링크에서 page값을 지정하고 그 값을 출력시키도록 하였다. 다만 빈 페이지가 나오면 안되기 때문에 전체 글 개수를 구해서 그 수의 0.1배 하여 페이징 링크 수를 조절하였다. 이는 mysql 함수중에 count를 이용하였으며 *을 통해 전채 행수를 구하였다. 또한 AS를 통해 total 별칭을 주었다.
이제 가져온 데이터의 total 값을 가져오고 변수로 저장한다.
다만 이 페이징 링크 또한 무한하게 길어질 수 있기 때문에 그 수를 현제 페이지에서 뒤로 5개 앞으로 5개만 출력되도록 하였다. 현제페이지에서 -6을 한 값이 1과 같거나 클경우 현제 페이지값-5부터 출력을 하고 아니면 1부터 출력을 하도록 한다. 또한 현제페이지에서 +6을 한 값이 total값과 같거나 작으면 현제페이지 +5까지, 아니라면 total까지 출력을 하도록 하였다.
현제 페이지에서 이전, 다음 페이지로 넘어가는 링크도 작성하였다. 이는 현제 페이지에서 -1, +1하여 이동하도록 하였다.
<?php
require_once 'tool/db_conn.php';
// require_once 'tool/chack_er.php';
$target=$_GET['target'];
$keyword=$_GET['keyword'];
if(isset($_GET["page"])){
$page=$_GET['page'];
$read=($page - 1) * 10;
}elseif(!isset($_GET["page"])){
$read=0;
}
if(isset($_GET["target"])&&isset($_GET["keyword"])){
if($_GET["target"]==="all"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE title LIKE '%" . $_GET['keyword'] . "%' OR writer LIKE '%" . $_GET['keyword'] . "%' OR content LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}elseif($_GET["target"]==="title"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE title LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}elseif($_GET["target"]==="content"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE writer LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}elseif($_GET["target"]==="writer"){
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 WHERE content LIKE '%" . $_GET['keyword'] . "%' ORDER BY board_id DESC LIMIT 10 OFFSET " . $read;
}
}else {
$list_board_1_query = "SELECT board_id, writer, title, regdate, updatedate FROM board_1 ORDER BY board_id DESC LIMIT 10 OFFSET " .$read;
}
$list_board_1_all = mysqli_query($con, $list_board_1_query);
?>
<!DOCTYPE html>
<html lang="kr">
<head>
<meta charset="UTF-8">
<title>IQ Spoofing</title>
<link rel="stylesheet" href="CSS/board1.css">
</head>
<body>
<h1><a href="index.php">IQ Spoofing</a></h1>
<h2>게시판1</h2>
<div id = search>
<form method="GET" action="board1.php">
<select id="target" name="target">
<option value ="all">전체</option>
<option value ="title">제목</option>
<option value ="content">내용</option>
<option value ="writer">작성자</option>
</select>
<input type="text" id="keyword" name="keyword">
<input type="submit" value="검색" id="search_btn">
</div>
<div class="write-box">
<a href="write_1.php" class="write-link">글쓰기</a>
</div> <br>
<table>
<thead>
<tr>
<th id = "board_id">id</th>
<th id = "title">제목</th>
<th id = "writer">작성자</th>
<th id = "regdate">작성날짜</th>
<th id = "updatedate">수정날짜</th>
</tr>
</thead>
<tbody>
<?php
while ($list_board_1 = mysqli_fetch_array($list_board_1_all)) {
$board_id = $list_board_1['board_id'];
$writer = $list_board_1['writer'];
$title = $list_board_1['title'];
$regdate = $list_board_1['regdate'];
$updatedate = $list_board_1['updatedate'];?>
<tr onclick="location.href='conent.php/?id=<?php echo ($board_id) ?>';">
<td><?php echo ($board_id);?></td>
<td><?php echo ($title);?></td>
<td><?php echo ($writer);?></td>
<td><?php echo ($regdate);?></td>
<td><?php echo ($updatedate);?></td>
</tr>
<?php } ?>
</tbody>
</table>
<div id="page">
<?php
if(isset($_GET["target"])&&isset($_GET["keyword"])){
if($_GET["target"]==="all"){
$total_records_query = "SELECT COUNT(*) AS total FROM board_1 WHERE title LIKE '%" . $keyword . "%' OR writer LIKE '%" . $keyword . "%' OR content LIKE '%" . $keyword . "%'";
}elseif($_GET["target"]==="title"){
$total_records_query = "SELECT COUNT(*) AS total FROM board_1 WHERE title LIKE '%" . $keyword . "%'";
}elseif($_GET["target"]==="content"){
$total_records_query = "SELECT COUNT(*) AS total FROM board_1 WHERE writer LIKE '%" . $keyword . "%'";
}elseif($_GET["target"]==="writer"){
$total_records_query = "SELECT COUNT(*) AS total FROM board_1 WHERE content LIKE '%" . $keyword . "%'";
}
}else {
$total_records_query = "SELECT COUNT(*) AS total FROM board_1";
}
$total_records_result = mysqli_query($con, $total_records_query);
$total_records = mysqli_fetch_assoc($total_records_result)['total'];
$total_pages= ceil($total_records / 10);
$current_page = isset($_GET['page']) ? $_GET['page'] : 1;
if(isset($_GET['keyword']) && isset($_GET['target'])){
$page_adress="/nk/board1.php?target=".$target."&keyword=".$keyword."&page=";
} else{
$page_adress="/nk/board1.php?page=";
}
if($current_page >= 6){
$page_b=$current_page-5;
}else{
$page_b=1;
}
if($current_page+6 <= $total_pages ){
$page_a=$current_page+5;
}else{
$page_a=$total_pages;
}
if ($current_page > 1) {
echo '<a href="' . $page_adress . ($current_page - 1) . '">이전</a>';
}
for ($i = $page_b; $i <= $page_a; $i++) {
echo '<a href="' . $page_adress . $i . '">' . $i . '</a>';
}
if ($current_page < $total_pages) {
echo '<a href="' . $page_adress . ($current_page + 1) . '">다음</a>';
}
?>
</div>
</div>
</body>
</html>
'프로그래밍 및 코딩 > PHP' 카테고리의 다른 글
Index 및 데이터 정렬 방법 (0) | 2023.05.22 |
---|---|
coding_if문 축약 (0) | 2023.05.20 |
게시판 만들기_글수정 (0) | 2023.05.19 |
게시판 만들기_글삭제 (0) | 2023.05.19 |
게시판 만들기_글쓰기 (0) | 2023.05.19 |