3. PHP 게시판 만들기, list 제작 1
주의: 본 게시판은 보안을 생각하지 않고 만들어졌으므로 실제로 사용되어서는 안되는 코드입니다.
공부할 때 게시판이 이처럼 동작한다는 정도로만 이해해주세요.
오늘은 본격적으로 게시판 제작에 들어가겠습니다.
설명하기 전에 현재까지 진행 된 코드를 올렸습니다.
여기 있는 dbconfig.php는 더 이상 올리지 않을 생각이구요.
따라하고 계신분은 이 dbconfig.php 파일에서 DB 호스트, DB 아이디, DB 패스워드, DB 이름을 바꿔서 실행하시면 되겠습니다.
CSS의 경우 디자인을 못하기 때문에... ㅠㅠ 최소한으로만 할꺼구요.
디자인 부분은 개인적으로 만들어서 사용하시면 되겠습니다.
먼저 dbconfig.php부터 살펴보겠습니다.
<?php
$db = new mysqli('localhost', 'kurien', '********', 'kurien');
if($db->connect_error) {
die('데이터베이스 연결에 문제가 있습니다.\n관리자에게 문의 바랍니다.');
}
$db->set_charset('utf8');
?>
dbconfig.php는 짧게 만들어놨습니다.
먼저 $db에 mysql을 연결해줍니다.
저와 같이 new mysqli를 쓰던지, mysqli_connect()를 쓰던지 그 부분은 자유입니다.
개인적으로는 new mysqli()가 편하니 이걸로 진행하겠습니다.
각 항목은 위에서 말한 것처럼 DB 호스트, DB 아이디, DB 패스워드, DB 이름 순으로 나열되어있습니다.
큰 이상이 없다면 DB와 연동되었다고 생각하시면 되는데, 만약 DB가 연결되지 않는다면 오류를 출력해줍니다.
여기서 if($db->connect_error) { }는 DB 연동이 실패했을 때 예외를 처리해주는 부분입니다.
여기서는 die()함수를 통해서 메시지를 보여주고 PHP를 종료하게 됩니다.
마지막 줄의 $db->set_charset('utf8')은 해당 DB와의 연결을 어떤 인코딩으로 할지 정해줍니다.
요즘은 UTF-8을 많이 쓰므로 utf8을 적었습니다.
참고로 제가 게시판을 만들면서 제작한 모든 인코딩은 UTF-8입니다.
만약 한글이 깨진다면 인코딩 문제를 의심해주세요!
이제 dbconfig.php에 대한 설명이 끝났으니 board 폴더에 있는 index.php를 열어봅시다.
<?php
require_once("../dbconfig.php");
?>
<!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>
<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
$sql = 'select * from board_free order by b_no desc';
$result = $db->query($sql);
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"><?php echo $row['b_title']?></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>
</article>
</body>
</html>
별다른 기능도 없이 길기만 한 코드입니다.
먼저 맨 위에서 require_once를 통해서 dbconfig.php를 include 시켜줍니다.
여기서 include가 아닌 require_once를 쓴 이유는 dbconfig.php가 연동되지 않는다면 이 게시판을 볼 필요조차 없기 때문이죠.
만약 include 함수를 사용하면 dbconfig.php를 include에 실패 하더라도 이 페이지를 보여줄 수 있는 만큼 보여주고,
require 함수를 사용하면 dbconfig.php를 include에 실패하면 오류를 보내고 그대로 종료합니다.
그리고 그냥 include, require과 include_once, require_once의 차이점은 include, require의 경우 같은 파일을 여러번 include 해도 실행되지만,
once가 뒤에 붙게 되면 딱 한번만 include 되고 그 뒤의 같은 파일은 무시됩니다.
이렇게 dbconfig.php를 include 시키고, 기본적인 html들을 적어줍니다.
기본적인 html이나 css부분은 넘어가고 바로 table 부분으로 넘어가겠습니다.
caption은 웹 접근성을 지켜볼까 해서 넣은건데, readHide라는 클래스를 줘서 나중에 보이지 않게 할 생각이구요.
thead 부분을 보면 게시판에서 필요한 항목 중 list 부분에 필요한 항목을 th로 출력해줬습니다.
번호, 제목, 작성자, 작성일, 조회 순으로 지정했고, 그 아래 있는 tbody 부분부터 PHP 코드가 많이 사용됩니다.
먼저 $sql에 DB에 보낼 쿼리문을 작성합니다.
select * from board_free order by b_no desc;라는 쿼리문을 DB에 보냅니다.
가장 쉬운 select 문인데다가 어려운 부분도 없습니다.
혹시 모르는 분을 위해서 설명드리자면 이전 포스팅에서 만들었던 board_free 테이블에서 *(모든 column)을 가져오는겁니다.
그리고 마지막에 있는 order by b_no desc는 내림차순을 뜻하는건데요.
만약 내림차순이 아니라면 primary key(기본 키)를 기준으로 자동으로 오름차순 정렬이 됩니다.
이 이미지를 보면 위에서부터 1, 2, 3이 나오는데 정상적인 게시판이라면 3, 2, 1 순으로 나타나게 됩니다.
오래된 글일수록 뒤로 가야하니깐요.
아래는 order by b_no desc을 적은 후의 이미지입니다.
번호를 보면 정상적으로 나오죠?
이해가 잘 안된다면 작성일을 보시면 이해가 더 쉽게 될 것 같네요.
여기서 시간(22:17:12)만 나온 부분은 오늘 날짜를 나타내는거니, 2015-03-30이라고 생각하시면 되겠습니다.
$sql을 만들었으니 $result = $db->query($sql)을 통해 query를 보내고 결과 값을 $result에 저장합니다.
만약 이 과정에서 문제가 생겼다면 $result에는 FALSE가 들어가고, 정상적으로 query가 전송되었다면 $result에 TRUE가 들어갑니다.
이제 $row = $result->fetch_assoc()을 쓰는데요.
이 부분을 반복문 while($row = $result->fetch_assoc()) { }로 나타내면 보냈던 쿼리의 행이 끝날 때까지 자동으로 반복을 실행합니다.
제 DB에는 "안녕하세요!", "안녕하세요! 2", "테스트"라는 제목을 가진 데이터 3행이 있으니 총 3번 반복해주죠.
while문 내에는 $datetime = explode(' ', $row['b_date']);가 제일 먼저 있는데요.
$row['b_date']는 위에서 $row = $result->fetch_assoc()를 통해 얻은 DB의 데이터가 $row라는 배열에 저장된 것입니다.
배열의 key(b_date)는 column의 이름을 나타내구요.
$row['b_date']를 explode 함수를 통해 ' ' 값을 기준으로 나눈 이유는 b_date의 값은 "0000-00-00 00:00:00"과 같은 형식으로 저장되는데,
공백 기준 왼쪽에 있는 일자(년월일)와 오른쪽에 있는 시간(시분초)를 따로 나눠주기 위해서였습니다.
두 값을 나누면 $datetime[0]과 $datetime[1]에 저장되고, 다시 그 값들은 $date와 $time 변수에 저장됩니다.
여기서 만약 $date의 값이 date('Y-m-d')(오늘의 날짜)와 같다면 $row['b_date']의 값을 $time으로 바꿔주고,
오늘과 다른 날짜라면 $row['b_date']의 값을 $date로 바꿔줍니다.
여기서 이렇게 나눠줬기 때문에 작성일이 오늘인 글은 시간이 나타나게 됩니다.
이제 목록에 내용을 뿌려줄 일만 남았네요.
여기서 반복되어야 할 부분은 <tr>~</tr> 까지입니다.
순서대로 b_no, b_title, b_id, b_date, b_hit를 출력하시면 됩니다.
데이터베이스에 입력을 안하셨다면 입력을 하신 후 진행해보세요!
여기까지 list 제작 1이였습니다.
너무 세세한 것까지 설명해드려서 너무 글이 길어졌는데, 오히려 그걸로 인해 복잡할 수도 있을 것 같네요.
지적 사항이 있거나 글이 너무 어렵다면 댓글 남겨주시구요.
현재 진행 상태는 http://kurien.dothome.co.kr에서 확인하실 수 있습니다.
'Project > PHP 게시판' 카테고리의 다른 글
6. PHP 게시판 만들기, view 제작 1 (30) | 2015.04.05 |
---|---|
5. PHP 게시판 만들기, write 제작 2 (36) | 2015.04.02 |
4. PHP 게시판 만들기, write 제작 1 (13) | 2015.03.31 |
2. PHP 게시판 만들기, DB 테이블 생성 (17) | 2015.03.30 |
1. PHP 게시판 만들기 (10) | 2015.03.28 |