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

2015. 3. 31. 00:21
저자 : Kurien

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

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


오늘은 본격적으로 게시판 제작에 들어가겠습니다.

설명하기 전에 현재까지 진행 된 코드를 올렸습니다.


20150330_project.zip


여기 있는 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에서 확인하실 수 있습니다.