본문 바로가기

웹 개발

[14주차] 문의 게시판 구현 #1 - 문의 글 작성

배너만 만들어두고 여태껏 놔두기만 했던 문의게시판을 만들어보겠습니다. 이제 웹 개발 프로젝트도 막바지에 다가서고 있습니다.

 

메인 페이지에서는 이 배너를 누르면 문의게시판으로 이동합니다

 

 

하지만 이 게시판은 비회원도 이용할 수 있어야 하므로 첫 페이지 오른쪽 상단에도 문의 게시판 버튼을 만들어뒀습니다.

 

<a class="nav-link" href="./qna_board.php" style="float:right;">문의 게시판</a>

 

 

전체적인 틀은 자유게시판과 동일하지만 글들을 따로 관리하기 위해 DB에 qna_board라는 새 테이블을 만들어주겠습니다.

게시판에서 사용하는 DB 파일과 비슷한 컬럼과 타입으로 만들거라 board 테이블을 확인해보겠습니다. 총 9개의 컬럼에 number를 key로 사용하고 auto_increment 설정이 되어있습니다.

좋아요 기능과 조회수기능은 문의 게시판에 굳이 필요없을 것 같으니 제거하겠습니다.

 

그럼 phpmyadmin 으로 접속해 qna_board 테이블을 만들어 주겠습니다.

컬럼은 총 7개입니다. 데이터정렬방식과 NULL check, 인덱스 설정까지 해줍니다

 

설정이 끝났으면 저장을 눌러줍니다.

 

 

웹 페이지에서 보겠습니다. 조회수와 좋아요 기능을 지우고 4개의 항목만 나타나고 있습니다.

 

 

이제 본격적인 셋팅을 해보겠습니다

 

웹의 기본인 CRUD 기능을 구현하기 위해

총 8개의 파일을 만들어줍니다. ( qna_board.php 포함해서 )
삭제버튼을 누르면 삭제를 담당할 qna_delete.php

수정하는 qna_modify.php와 실제 수정 쿼리문을 실행할 qna_modify_proc.php

게시판 내용을 읽을 qna_read.php

그리고 검색했을 때 보여줄 qna_search.php

그다음 글 작성시 창을 띄울 qna_write.php와 실제 작성 쿼리문을 실행할 qna_write_proc.php

( 여기 코드 공개 )

 

qna_board.php

<!DOCTYPE html>
<?php
if(isset($_GET['ord_ca'])){
  $ord_ca = $_GET['ord_ca'];
} else {
  //정렬을 안했을 때
  $ord_ca = 'number';
}

$con = mysqli_connect('localhost','root','1234','test');

if(isset($ord_ca)){
    $query = "SELECT * FROM qna_board order by $ord_ca";
    } else {
    $query = "SELECT * FROM qna_board";
    }
    $result = $con->query($query);


?>

<style>
#page_num{
    font-size: 14px;
    margin:0 auto;
    text-align:center;
}

#page_num ul{
  text-align:center;
}

#page_num ul li {
    margin-left: 10px;
    display:inline-block;
}

.fo_re {
    font-weight: bold;
    color:red;
}

.space {
  float: right;
}

.table thead th{
  text-align: center;
}

.table tbody tr{
  text-align: center;
}

.container{
  display: inline-block;
  margin: 0 auto;
  text-align: center;
}

.date {
  text-align: center;
}

</style>

<html lang="en">
<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>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
  </head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<?php
//상단 탭
require('./nav.html');
?>

<br>
    <h1>문의 게시판</h1>
    <HR>
<!--날짜 지정 검색 구현/3가지 태그를 나열하기 위해 table 태그 사용-->
  <tr>
<th style="width:40%;">문의사항이 있으시다면 여기에 남겨주세요!
  <p>
    <!-- <form action="" method="GET" id="ord_ca" name="frm">
    <select name="ord_ca">
    <option value="none">정렬 기준</option>
    <option value="date">날짜 순</option>
    <option value="hit">조회 순</option>
    <option value="thumbup">추천 수</option> 
    </select>
    <input type="submit" value="정렬"/>
</form> -->
</th>
<th>
    <a href="./qna_write.php"><button type="button" style="float:right;"class="btn btn-outline-success">글쓰기</button></a>
</th>
</tr>
    <table class="table">
        <thead>
            <tr>
                <th width="70">번호</th>
                <th width="300">제목</th>
                <th width="130">글쓴이</th>
                <th width="120">작성일</th>
            </tr>
        </thead>      
        <!-- 페이징 -->
        <?php
        if(isset($_GET['page'])){
          $page = $_GET['page'];
        } else {
          $page = 1;
        }

        $row_num = mysqli_num_rows($result); //게시판 총 개수
        $list = 5; //한 페이지에 보여줄 개수
        $block_ct = 5; //블록당 보여줄 페이지 개수

        $block_num = ceil($page/$block_ct); //현재 페이지 블록 구하기
        $block_start = (($block_num-1)* $block_ct)+1; //블록의 시작번호
        $block_end= $block_start + $block_ct -1; //블록 마지막 번호

        $total_page = ceil($row_num/$list); //페이징한 페이지 수 구하기
        if($block_end >$total_page){
          $block_end = $total_page;
        } //만약 블록의 마지막 번호가 페이지수보다 많다면 마지막번호는 페이지 수
        $total_block = ceil($total_page/$block_ct); //블럭 총 개수
        $start_num = ($page-1)*$list; //시작번호 (page -1)에서 $list 를 곱한다.

        //GET으로 받은 정렬 값이 있다면 그걸로 정렬, 없으면 number순 정렬
        //근데 페이징 할때마다 $ord_ca가 사라짐
        $query2 = "SELECT * FROM qna_board order by $ord_ca desc limit $start_num,$list";
      
        $result2 = $con ->query($query2);
          while($board = $result2->fetch_array()){
            $title = $board['title']; //게시글 제목
            $number = $board['number']; //게시글 번호
            if(isset($board['name'])){
            $name = $board['name']; //작성자
            } else {
             $name = "익명"; 
            }
            $date = $board['date']; //작성 날짜
            // $thumbup = $board['thumbup']; //좋아요 수
            // $hit = $board['hit']; //조회수
            if(strlen($title)>30){
                $title = str_replace($board['title'],mb_substr($board['title'],0,30,"utf-8")."...",$board['title']);
            }
          
          //title이 30글자가 넘어가면 ...표시
          ?>
        <tbody>
            <tr>
                <td width="70"><?php echo $number; ?></td>
                <td width="300"><a href="./qna_read.php?number=<?php echo $board['number'];?>"><?php echo $title;?></td>
                <td width="130"><?php echo $name; ?></td>
                <td width="120"><?php echo $date; ?></td>
            </tr>    
        </tbody>
        <?php
          }
          ?>
        </table>
       <div id="page_num">
         <ul>
          <?php
          if($page <= 1)
          { //만약 page가 1보다 크거나 같다면
            echo "<li class='fo_re'>처음</li>"; //처음이라는 글자에 빨간색 표시
          } else {
            echo "<li><a href='?page=1&ord_ca=$ord_ca'>처음</a></li>"; //아니라면 처음글자에 1번페이지로 갈 수 있게 링크
          }
          if($page <= 1){    
          } else {
            $pre = $page -1;
            echo "<li><a href='?page=$pre&ord_ca=$ord_ca'>이전</a></li>"; //이전글자에 pre변수를 링크한다. 이러면 이전버튼을 누를때마다 현재 페이지에서 -1하게 된다.
          }
          for($i=$block_start; $i<=$block_end; $i++){ 
            //for문 반복문을 사용하여, 초기값을 블록의 시작번호를 조건으로 블록시작번호가 마지박블록보다 작거나 같을 때까지 $i를 반복시킨다
            if($page == $i){ //만약 page가 $i와 같다면 
              echo "<li class='fo_re'>[$i]</li>"; //현재 페이지에 해당하는 번호에 굵은 빨간색을 적용한다
            }else{
              echo "<li><a href='?page=$i&ord_ca=$ord_ca'>[$i]</a></li>"; //아니라면 $i
            }
          }
          if($block_num >= $total_block){ //만약 현재 블록이 블록 총개수보다 크거나 같다면 빈 값
          }else{
            $next = $page + 1; //next변수에 page + 1을 해준다.
            echo "<li><a href='?page=$next&ord_ca=$ord_ca'>다음</a></li>"; //다음글자에 next변수를 링크한다. 현재 4페이지에 있다면 +1하여 5페이지로 이동하게 된다.
          }
          if($page >= $total_page){ //만약 page가 페이지수보다 크거나 같다면
            echo "<li class='fo_re'>마지막</li>"; //마지막 글자에 긁은 빨간색을 적용한다.
          }else{
            echo "<li><a href='?page=$total_page&ord_ca=$ord_ca'>마지막</a></li>"; //아니라면 마지막글자에 total_page를 링크한다.
          }
          ?>
        </ul>
        <br><Br>
        <div class="input-group mb-3 container">
          <!-- 검색 항목 form 태그 -->
          <form action="qna_search.php" method="GET" style="margin: auto;">
            <select name="category">
             <option value="title">제목</option>
             <option value="name">글쓴이</option>
             <option value="content">내용</option> 
            </select>
  <input type="text" name="search" placeholder="검색할 게시글 입력" required="required">
  <button class="btn btn-outline-secondary" type="submit" id="button-addon2">검색</button>
  <div class="date">
    <br>    
    <div>시작일: <input type="date" name="pre_date" id="pre_date" data-placeholder="시작 날짜"/>
   종료일: <input type="date" name="end_date" id="end_date" /></div>
  </form>  
  </div>
    </div>
</body>
</html>

 

글 작성

그럼 이제 글 작성을 해보겠습니다

 

qna_write.php

<?php
//비회원도 이용가능해야하므로 세션없어도 이용가능해야함
session_start();
?>
<!DOCTYPE html>
<html lang="en">
<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>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
    <?php
require('./nav.html');
?>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
    <article class="article">
        <BR>
        <h1>문의 게시판 글쓰기</h1>
        <HR>
        <div id="boardwrite">
            <form action="./qna_write_proc.php" method="POST" enctype="multipart/form-data">
                <table id="boardwrite">
                    <caption class="readHIde">문의게시판 글쓰기</caption>
                    <tbody>
                        <tr>
                            <th scope="row"><label for="bTitle">제목</label></th>
                            <td class="title"><input type="text" name="bTitle" id="bTitle"></td>
                        </tr>
                        <tr>
                            <th scope="row"><label for="bContent">내용</label></th>
                            <td class="content"><textarea name="bContent" id="bContent"></textarea></td>
                        </tr>
                        <tr>
                            <th scope="row"><label for="bPassword">비밀번호</label></th>
                            <td class="password"><input type="text" name="bPassword" id="bPassword"></td>
                        </tr>
                    </tbody>
                    <div class="btnSEt">
                        
                        <button style="background-color:pink" type="submit"><div>작성</div></button>
                    </div>
                    <input type="file" name="board_file" />
                </form> 
                <a href="qna_board.php" class="btnLIst btn"><div style="border:2px solid grey;">목록</div></a>          
            </div>
        </article>
</body>
</html>

qna_write_proc.php

<?php
//세션 시작
session_start();

//작성된 값을 받아서 변수로 저장함
$name = $_SESSION['id'];
if(isset($_SESSION['id'])){
    $name = $_SESSION['id'];
} else {
    $name = "익명";
}

$bPassword = $_POST['bPassword'];
$bTitle = $_POST['bTitle'];
$date = date('Y-m-d');
$bContent = $_POST['bContent'];

//파일 관련 변수
if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_FILES['board_file'])){
    
// $filesize=$_FILES['board_file']['size'];
// $file_error=$_FILES['board_file']['error'];
$tmpfile = $_FILES['board_file']['tmp_name'];
$origin_filename = $_FILES['board_file']['name'];
$allowed_mime_types =['image/jpeg','image/png','image/gif','application/zip','application/x-hwp','application/msword','application/pdf']; //mime허락된 형식
$filename = iconv("UTF-8","EUC-KR",$_FILES['board_file']['name']);

$timestamp = time();
$new_filename = $timestamp.'_'.$filename;
$file_mime_type = mime_content_type($tmpfile);
// if(in_array($file_mime_type, $allowed_mime_types)){
    //파일 저장 경로
    $upload_path = './upload/'.$new_filename;
    if(move_uploaded_file($tmpfile,$upload_path)){
        $_SESSION['write_error'] = '파일 업로드 success!';
    } else {
        $_SESSION['write_error'] = '파일 업로드 Fail ㅜㅜ';
    } 
};
    

//데이터베이스에 저장할 쿼리 엶
$con = mysqli_connect('localhost','root','1234','test');

if(!empty($origin_filename)){
$query = "INSERT INTO qna_board (title, content, date, name,password,file) VALUES ('$bTitle','$bContent','$date','$name','$bPassword','$new_filename')";
} else {
    $query = "INSERT INTO qna_board (title, content, date, name,password,file) VALUES ('$bTitle','$bContent','$date','$name','$bPassword',NULL)";
}
if ($con->query($query)){
    echo "<h1>글쓰기 완료</h1>";
    echo "<p>작성한 글이 성공적으로 등록되었습니다.</p>";
    echo "<a href='qna_board.php'><button>목록으로 돌아가기</button></a>";
} else {
    echo "Error:".$sql."<br>".mysqli_error($con);
    echo "<a href='qna_write.php'><button>돌아가기</button></a>";
}
?>

 

 

간단한 문의인 것처럼 글 작성을 하고 작성 버튼을 누르니 게시판 리스트에 잘 등록된 것을 볼 수 있습니다

 

 

읽기

qna_read.php

<?php
//세션 시작
session_start();
if(isset($_SESSION['id'])){
$login_id = $_SESSION['id'];
} else {
$login_id = "익명";
}

//클릭할 때 number GET으로 가져옴
$bno = $_GET['number'];

//게시판 DB 연결
$con = mysqli_connect('localhost','root','1234','test');

//SQL Injection 대응
$boardlike_id = mysqli_real_escape_string($con,filter_var(strip_tags($bno), FILTER_SANITIZE_SPECIAL_CHARS));

//게시판 내용 보여주기
$query = "SELECT * FROM qna_board WHERE number='".$bno."'";
$result = $con->query($query);
$board = $result->fetch_array();

//문의게시판에는 조회수 기능 필요 없음
// $hit = $board['hit'];
// $hit = $hit + 1;
// $hit_query = "UPDATE board SET hit = '".$hit."' WHERE number ='".$bno."'";
// $hit_result = $con->query($hit_query);

?>
<!DOCTYPE html>
<html lang="en">
<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>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<?php
require('./nav.html');
?>

<!-- 게시글 불러오기 -->
<h2><?php echo $board['title']; ?></h2><HR>
<div>작성자 :<?php echo $board['name']; ?>
<?php echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;작성날짜 : ".$board['date']; ?></div>
<!-- 기준선 -->
<HR>
<?php 
$filename = explode('_', $board['file'])[1]; //타임스탬프를 제거 후 파일명만 분리
$download_url = 'download_proc.php?filename='.$board['file'];
echo '<p>파일 : <a href="'.$download_url.'">'.$filename.'</a></p>';
?>

<textarea style="width:100%; height:15rem;" readonly><?php echo $board['content']; ?></textarea>

<br><Br>
<a href="./qna_modify.php?number=<?php echo $board['number'];?>"><button class="btn btn-secondary">수정</button></a>
<a href="./qna_delete.php?number=<?php echo $board['number'];?>" onclick="return confirm('정말로 삭제하시겠습니까? 삭제 후에는 되돌릴 수 없습니다.')"><button class="btn btn-secondary">삭제</button></a>
<a href="./qna_board.php"><button class="btn btn-secondary">목록</button></a>
<p>

<?php
  if(isset($_SESSION['write_error'])){
    echo $_SESSION['write_error'];
    unset($_SESSION['write_error']);
  }
?>
</body>
</html>

 

클릭하면? read도 잘 됩니다

 

검색

검색은 잘될까요?

 

qna_search.php

<!DOCTYPE html>

<?php
session_start();

$con = mysqli_connect('localhost','root','1234','test');
//get으로 카테고리와 검색값을 받음
$category = $_GET['category'];
$search_title= $_GET['search'];

if(isset($_GET['ord_ca'])){
  $ord_ca = $_GET['ord_ca'];
} else {
  //정렬을 안했을 때
  $ord_ca = 'number';
}

//get으로 날짜 지정값을 받음
$pre_date = $_GET['pre_date'];
$end_date = $_GET['end_date'];


//GET으로 page받음
if(isset($_GET['page'])){
  $page = $_GET['page'];
} else {
  $page = 1;
}



if($category=='title'){
  $catname = "제목";
} else if ($category=="name"){
  $catname = "작성자";
} else if ($category=="content"){
  $catname = '내용';
}


if($pre_date&&$end_date){
  $query = "SELECT * FROM qna_board WHERE $category LIKE '%$search_title%' AND date BETWEEN '$pre_date' and '$end_date' ORDER BY $ord_ca DESC" ;
} else {
  $query = "SELECT * FROM qna_board WHERE $category like '%$search_title%' order by $ord_ca desc";
}


$result = $con->query($query);

?>

<style>
#page_num{
    font-size: 14px;
    margin:0 auto;
    text-align:center;
}

#page_num ul{
  text-align:center;
}

#page_num ul li {
    margin-left: 10px;
    display:inline-block;
}

.fo_re {
    font-weight: bold;
    color:red;
}

.space {
  float: right;
}

.table thead th{
  text-align: center;
}

.table tbody tr{
  text-align: center;
}

.container{
  display: inline-block;
  margin: 0 auto;
  text-align: center;
}
.date {
  text-align: center;
}
</style>

<html lang="en">
<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>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
  </head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
<?php
require('./nav.html');
?>
<br>
    <h1>문의 게시판 검색결과</h1>
   <hr>
    <th><?php echo $catname." 내에서 ".$_GET['search']." 검색결과 표시" ?>
    <p>


</th>
    
    <th>
    <a href="./qna_write.php"><button itype="button" class="btn btn-outline-success space">글쓰기</button></a>
    </th>

    <table class="table">
        <thead>
            <tr>
                <th width="70">번호</th>
                <th width="300">제목</th>
                <th width="130">글쓴이</th>
                <th width="120">작성일</th>
            </tr>
        </thead>      
        <?php
        $row_num = mysqli_num_rows($result); //게시판 총 개수
        $list = 5; //한 페이지에 보여줄 개수
        $block_ct = 5; //블록당 보여줄 페이지 개수
        $block_num = ceil($page/$block_ct); //현재 페이지 블록 구하기
        $block_start = (($block_num-1)* $block_ct)+1; //블록의 시작번호
        $block_end= $block_start + $block_ct -1; //블록 마지막 번호

        $total_page = ceil($row_num/$list); //페이징한 페이지 수 구하기
        if($block_end >$total_page){
          $block_end = $total_page;
        } //만약 블록의 마지막 번호가 페이지수보다 많다면 마지막번호는 페이지 수
        $total_block = ceil($total_page/$block_ct); //블럭 총 개수
        $start_num = ($page-1)*$list; //시작번호 (page -1)에서 $list 를 곱한다.
       
        if($pre_date&&$end_date){
          $query3 = "SELECT * FROM qna_board WHERE $category LIKE '%$search_title%' AND date BETWEEN '$pre_date' AND '$end_date' order by $ord_ca DESC limit $start_num,$list";
        } else {
          $query3 = "SELECT * FROM qna_board WHERE $category like '%$search_title%' order by $ord_ca desc limit $start_num,$list";
        }
  
        $result3 = $con ->query($query3);
          while($s_board = $result3->fetch_array()){
            $title = $s_board['title'];
            $number = $s_board['number'];
            $name = $s_board['name'];
            $date = $s_board['date'];
            if(strlen($title)>30){
                $title = str_replace($s_board['title'],mb_substr($s_board['title'],0,30,"utf-8")."...",$s_board['title']);
            }
          
          //title이 30글자가 넘어가면 ...표시
          ?>
        <tbody>
            <tr>
                <td width="70"><?php echo $number; ?></td>
                <td width="300"><a href="./qna_read.php?number=<?php echo $s_board['number'];?>"><?php echo $title;?></td>
                <td width="130"><?php echo $name; ?></td>
                <td width="120"><?php echo $date; ?></td>
            </tr>    
        </tbody>
        <?php
          }
          ?>
        </table>
       <div id="page_num">
         <ul>
          <?php
          if($page <= 1)
          { //만약 page가 1보다 크거나 같다면
            echo "<li class='fo_re'>처음</li>"; //처음이라는 글자에 빨간색 표시
          } else {
            echo "<li><a href='?page=1&ord_ca=$ord_ca'>처음</a></li>"; //아니라면 처음글자에 1번페이지로 갈 수 있게 링크
          }
          if($page <= 1){    
          } else {
            $pre = $page -1;
            echo "<li><a href='?category=$category&search=$search_title&page=$pre&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>이전</a></li>"; //이전글자에 pre변수를 링크한다. 이러면 이전버튼을 누를때마다 현재 페이지에서 -1하게 된다.
          }
          for($i=$block_start; $i<=$block_end; $i++){ 
            //for문 반복문을 사용하여, 초기값을 블록의 시작번호를 조건으로 블록시작번호가 마지박블록보다 작거나 같을 때까지 $i를 반복시킨다
            if($page == $i){ //만약 page가 $i와 같다면 
              echo "<li class='fo_re'>[$i]</li>"; //현재 페이지에 해당하는 번호에 굵은 빨간색을 적용한다
            }else{
              echo "<li><a href='?category=$category&search=$search_title&page=$i&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>[$i]</a></li>"; //아니라면 $i
            }
          }
          if($block_num >= $total_block){ //만약 현재 블록이 블록 총개수보다 크거나 같다면 빈 값
          }else{
            $next = $page + 1; //next변수에 page + 1을 해준다.
            echo "<li><a href='?category=$category&search=$search_title&page=$next&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>다음</a></li>"; //다음글자에 next변수를 링크한다. 현재 4페이지에 있다면 +1하여 5페이지로 이동하게 된다.
          }
          if($page >= $total_page){ //만약 page가 페이지수보다 크거나 같다면
            echo "<li class='fo_re'>마지막</li>"; //마지막 글자에 긁은 빨간색을 적용한다.
          }else{
            echo "<li><a href='?category=$category&search=$search_title&page=$total_page&pre_date=$pre_date&end_date=$end_date&ord_ca=$ord_ca'>마지막</a></li>"; //아니라면 마지막글자에 total_page를 링크한다.
          }
          ?>
        </ul>
        <br><Br>
        <div class="input-group mb-3 container">
          <form action="qna_search.php" method="GET" style="margin: auto;">
          <select name="category">
             <option value="title">제목</option>
             <option value="name">글쓴이</option>
             <option value="content">내용</option> 
            </select>
  <input type="text" name="search" placeholder="검색할 게시글 입력" required="required">
  <button class="btn btn-outline-secondary" type="submit" id="button-addon2">검색</button>
  <br>
  <div>시작일: <input type="date" name="pre_date" id="pre_date" data-placeholder="시작 날짜"/>
   &nbsp;종료일: <input type="date" name="end_date" id="end_date" /></div>        
  </form>
    </div>
</body>
</html>

제목 옵션을 주고 '문의'라고 검색하니 방금 작성한 문의글이 잘 검색되었습니다.

 

수정

다음은 수정 기능입니다

 

qna_modify.php

<?php
session_start();

//클릭한 게시글의 number를 가져옴
$bno = $_GET['number'];

//데이터베이스 연결 기본 셋팅
$con = mysqli_connect('localhost','root','1234','test');
$query = "SELECT * FROM qna_board WHERE number='$bno';";
$result = $con->query($query);
$board = $result->fetch_array();


?>

<!DOCTYPE html>
<html lang="en">
<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>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
    <?php
    require('nav.html');
    ?>
        <h1>문의 게시판 글수정</h1>
        <hr>
        <div id="boardwrite">
        <h6>문의게시판 글수정</h6>
        <br>
            <form action="./qna_modify_proc.php?number=<?php echo $bno; ?>" method="POST">
                <table>
                    <thead>
                    <tr>
                            <th>비밀번호</th>
                            <td class="password"><input type="text" name="bPassword" id="bPassword"></td>
                        </tr>
                        <tr>
                            <th>제목</th>
                            <td class="title"><textarea type="text" name="bTitle" id="bTitle" maxlength="100"><?php echo $board['title']; ?></textarea>
                            </td>
                        </tr>
                        <tr>
                            <th>내용</th>
                            <td class="content"><textarea name="bContent" id="bContent" maxlength="100"><?php echo $board['content']; ?></textarea></td>
                        </tr>
                        </thead>
            </table>
            <br>
            <div class="btnSEt">
                        <button type="submit" class="btnSubmit btn">수정 완료</button>
                        <a href="./qna_board.php" class="btnLIst btn">목록</a></div>
                    </form>   
</body>
</html>

 

qna_modify_proc.php

<?php
session_start();

$con = mysqli_connect('localhost','root','1234','test');

//이 부분은 url로 전달받음
$bno = $_GET['number'];

//이건 로그인한 이후로 원래 있는거
if(isset($_SESSION['id'])){
    $username = $_SESSION['id'];
} else {
    $username = "익명";
}
//post로 전달받은 부분
$userpw = $_POST['bPassword'];
$title = $_POST['bTitle'];
$content = $_POST['bContent'];

//쿼리문 실행
$query = "UPDATE qna_board SET name='$username',password='$userpw',title='$title',content='$content' WHERE number='$bno'";
$result = $con->query($query);

echo "수정이 완료되었습니다!<br><br>";
echo "<a href='qna_board.php'><button>게시판으로 돌아가기</button></a>";
?>

 

 

 

완료 후 클릭해 게시글을 읽어보니 수정사항이 잘 반영되었습니다.

 

삭제

이젠 삭제를 테스트 해보겠습니다

 

qna_delete.php

<?php
session_start();

$con = mysqli_connect('localhost','root','1234','test');

//이 부분은 url로 전달받음
$bno = $_GET['number'];

//삭제 쿼리문 실행
$query = "DELETE from qna_board WHERE number='$bno'";
$result = $con->query($query);

echo "삭제가 완료되었습니다!<br><br>";
echo "<a href='qna_board.php'><button>게시판으로 돌아가기</button></a>";
?>

 

버튼을 누르면 정말 취소할 건지 확인을 해주고

 

확인을 누르면 삭제가 되었다는 창이 나옵니다

 

그리고 다시 돌아가면 정말 삭제가 잘 되었네요!

자 이렇게 문의 게시판을 구현해보았는데요

만들어야할 파일과 군데군데 손봐야할 곳은 좀 더 있지만

기존에 만들었던 게시판의 틀을 거의 이용해서 난이도는 어렵지 않았던 것 같습니다.

 

그런데 현재는 세션이 없어도 main.php로 연결될 위험이 있기 때문에 비회원이 이용해야할 때 문의 게시판만 이용하도록 좀 더 손봐야할 것 같습니다.

 

봐주셔서 감사합니다