본문 바로가기
Project/project 1 - JH community

[php] 게시판 페이지 1 - 게시글 홈 화면 만들기

by 끊임없는정진 2022. 11. 7.

※ 보안적 요소는 거의 고려하지 않고 php명령어 숙달용으로 혼자서 만드는 로그인 페이지 입니다.

 

▶게시판 페이지를 위해 만들어야 할 파일 (※이번 시간에 만들파일은 굵은 글씨로 표기)

 

db.php : 데이터베이스 연결파일

index.php : 게시판 홈 화면

search_result.php : 게시글 검색 화면

board_read.php : 게시글 읽는 페이지

board_modify.php : 게시글 수정&생성 페이지

modify_check.php : 게시글 수정&생성 처리 페이지

thumb_check.php : 좋아요 기능 처리 페이지

 

 

▶DB(DataBase) 구상

 

 전에 만든 로그인 페이지와는 다른 데이터베이스를 쓴다. 'post_board'라는 데이터베이스를 만들고 그 안에 board 테이블과 기타 기능을 위한 테이블을 만들어 활용할 생각이다. 우선 다음과 같은 명령어로 database를 하나 만든다.

1
2
MariaDB [(none)]> CREATE DATABASE post_board;
Query OK, 1 row affected (0.001 sec)
cs

 

그 안에 어떤값이 들어가야 하는지 생각해보면, 우선 글의 id값부터 들어가야할 것이다. 그리고 제목(title), 작성자(name), 쓴 사람의 아이디(id), 추후에 구상할 조회수 데이터(hit), 좋아요 데이터(thumbs) 등이 필요할 것이다. 여기서 글의 id값은 혼선을 막기위해 id가 아니라 idx로 설정한다. 

create table board ( idx int not null primary key auto_increment, id varchar(20) not null default '', name varchar(255) not null default '', title varchar(255) not null, content text not null, date datetime not null, hit int not null default 0, file varchar(255) NOT NULL default '' );

 

다음과 같이 구성되면 성공적으로 구성한거라 할 수 있다. 

 

 

▶연결파일(db.php) 구상

 

 데이터베이스의 이름부터 바꼈으니깐 db의 내용도 이전에 만든것과 조금은 수정해서 만들어야 한다. 게시판에서 세션정보를 많이 사용할 예정이니깐 session_start(); 도 잊지않고 넣어준다. 

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$mysql_host = "localhost";
$mysql_user = "admin";
$mysql_password = "student";
$mysql_db = "post_board";
$conn = mysqli_connect($mysql_host$mysql_user$mysql_password$mysql_db);
if (!$conn){
    die("connection error! : " . mysqli_connect_error());
}
ini_set('display_errors''1');
session_start();
?>
cs

 

 

 

▶게시판 홈 화면(index.php) 구상

 

 처음은 일단 세션을 체크해서 아이디가 세션정보에 없으면 로그아웃화면으로 리다이렉션 시킨다음 로그인 화면으로 넘어가게끔 구성했다. 앞으로 게시판 구축에 필요한 모든 페이지들은 이 코드를 가지고 있을 것이다. 

1
2
3
4
5
6
7
8
9
<?php
include ("db.php");
if(isset($_SESSION['ss_jj_id'])) {
 
}else {
        echo "<script>alert('login plz.');</script>";
        echo "<script>location.replace('logout_check.php');</script>";
}
?>
cs

 

그러고 나서 sql 구문은 idx(게시글 번호)내림차순으로 정렬되게끔 쿼리문을 구상한다.

1
2
3
<?php
 $sql2 = "select * from board order by title desc limit $start_num, $list";
          $result = mysqli_query($conn1$sql2);
cs

 

 그리고 나서 while문으로 게시글을 출력하게끔 페이지를 구성했다. 그 과정에서 글자가 30개가 넘어가면 뒷부분은 ... 처리를 해서 출력하게 만들어준다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while($board = mysqli_fetch_array($result)){
   $title=$board["title"];
     if(strlen($title)>30)
        {
         $title=str_replace($board["title"],mb_substr($board["title"],0,30,"utf-8")."...",$board["title"]);
         }
?>
 
<!-- 게시판 목록 출력 -->
      <tbody>
        <tr>
          <td width="70"><?php echo $board['idx']; ?></td>
          <td width="500">
      <a href='./board_read.php?idx=<?=$board["idx"];?>'><?=$title?></a></td>
          <td width="120"><?php echo $board['name']?></td>
          <td width="100"><?php echo $board['date']?></td>
          <td width="100"><?php echo $board['hit']; ?></td>
        </tr>
      </tbody>
      <?php } ?>
    </table>
cs

 

또한 페이지 번호도 출력하게끔 하는데 sql문과 연계해서 사용한 변수와 함수는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$sql = "SELECT * FROM board";
$res = mysqli_query($conn,$sql);
$sql_row = mysqli_fetch_array($res);
$row_num = mysqli_num_rows($res);
$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를 곱한다.
$sql2 = "select * from board order by idx desc limit $start_num, $list";
$result = mysqli_query($conn$sql2);
cs

 

또한 페이지 출력 아래에는 게시글 페이지 번호도 만들어준다. (위 코드는 게시글 5개 씩 끊었다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
//처음페이지 버튼
if($page <= 1)
          { 
            echo "<span class='fo_re'>처음</span>"
          }else{
            echo "<a href='?page=1'>처음</a>"
          }
//이전페이지 버튼
if($page <= 1)
          {
 
          }else{
          $pre = $page-1
            echo "<a href='?page=$pre'>이전</a>";
          }
//페이지번호 버튼
          for($i=$block_start$i<=$block_end$i++){
            if($page == $i){ 
              echo "<strong>[$i]</strong>"
            }else{
              echo "<a href='?page=$i'>[$i]</a>"
            }
          }
 
//다음페이지 버튼
          if($block_num >= $total_block){ 
          }else{
            $next = $page + 1
            echo "<a href='?page=$next'>다음</a>"
          }
 
//마지막페이지 버튼
          if($page >= $total_page){ 
            echo "<span class='fo_re'>마지막</span>"
          }else{
            echo "<a href='?page=$total_page'>마지막</a>";
          }
        ?>
cs

 

그리고 아랫부분에는 글쓰기 페이지에 리다이렉션 해주는 버튼과 페이지 검색 결과로 리다이렉션 해주는 form을 만들어주고 검색창도 만들어준다. 

1
2
3
4
5
6
7
8
<form action="./search_result.php" method="get">
      <select name="catgo">
        <option value="title">제목</option>
        <option value="name">글쓴이</option>
        <option value="content">내용</option>
      </select>
      <input type="text" name="search" size="40" required="required" /> <button>검색</button></form>
</form>
cs

 

그렇게 구상한 로그인 홈화면은 다음과 같다.

완성된 게시판 홈화면

 

 

 

참조 : https://blog.naver.com/PostView.naver?blogId=bgpoilkj&logNo=220751401209&redirect=Dlog&widgetTypeCall=true&directAccess=false 

댓글