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

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


  1. 이전 댓글 더보기
  2. 안녕하세요 2016.10.03 02:29 신고  댓글주소  수정/삭제  댓글쓰기

    list 만들기를 그대로 따라해봤는데요 제대로 리스트가 나오긴하는데..

    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; ?>

    이 코드가 웹 화면에 나오네요..

    이유를 알고계신가요??

    • Kurien 2016.10.04 10:03 신고  댓글주소  수정/삭제

      맨 앞의 query($sql); 앞에 mysqli->가 아니라 mysqli?>라고 적혀있는지 확인해보시고, 그 문제가 아니라면 kurien92@gmail.com으로 전체 코드 보내주시면 확인 후 말씀 드리겠습니다.

  3. 게시판! 2016.10.17 04:06 신고  댓글주소  수정/삭제  댓글쓰기

    저도 앞서 다른 사람들이 말한것처럼 Fatal error: Call to a member function fetch_assoc() on boolean 라고 에러가 뜨네요. if문 사용해서 어디서부터 에러가 낮는지 찾어보니깐 php에서 board_free 테이블로 연결이 안되는게 문제인것 같은데 이 문제를 해결할 방법이 있나요?

    • Kurien 2016.10.17 13:33 신고  댓글주소  수정/삭제

      phpinfo()를 확인하셨을 때 mysqli 모듈이 포함되어 있는지 확인하셔야합니다.

      mysqli 모듈이 없다면, 서버상에서 설치하시거나 호스팅이시라면 호스팅사에 문의하셔야합니다.

      모듈 없이 진행하시려면 해당 mysqli에 맞는 mysql 함수로 변경해주셔야하구요.

  4. 요요 2016.10.20 09:10 신고  댓글주소  수정/삭제  댓글쓰기

    한번 올려보아요
    안녕하세요

    반갑습니다

  5. 요요 2016.10.27 17:57 신고  댓글주소  수정/삭제  댓글쓰기

    한번 올려보아요
    안녕하세요

    반갑습니다

  6. Rothko 2016.11.07 23:35 신고  댓글주소  수정/삭제  댓글쓰기

    오오 PHP 공부하면서 게시판 만들기좀 배울려고 구글링 하다가 들어왔습니다.!!
    설명 하나하나가 주옥같고, 이해도 잘 됩니다. 따라하해보기도 쉽고요!!
    감사합니다. 정말 , 덕분에 좋은 공부 할 수 있습니다.^^

  7. j 2016.11.07 23:39 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요

    위의 게시물을 따라 게시판을 만들고 있는 한 사람인데요

    오류가 났지만 해결을 하기 힘든 상황입니다.

    혹시 실례가 되지 않으신다면 이메일을 알려주실 수 있으신가요?

  8. 자색고구마 2016.11.18 11:26 신고  댓글주소  수정/삭제  댓글쓰기

    와 감사합니다. 엄청난 글이군요.
    php 이제 맛 시작해볼려고하는데 이런 갓 글을 발견했네요.
    위 댓글에 어렵다고 하시는 분들 아주 기본적인 서버 세팅없이 db를 사용하시려고 한 것 같은데
    최소한 서버에 phpMyAdmin 설치는 하셨는지 의문이 가네요.

    아무튼 이제 시작인데 미리 감사감사 드립니다.
    지금 리스트 뷰 라이트 까지 했는데 아주 잘되네요 ^^
    짱짱맨

  9. 궁금 2016.11.21 16:42 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? 다른 문제때문에 검색하다 여쭤볼게 있어서 질문 드려요..
    db 연결하는 코드는 dbconfig.php로 따로 만들어서 include 하셨는데
    그럼 db를 닫을때는 어떻게 하나요?
    보통 연결부터 기타 작업까지 한 문서에선
    $conn = mysql_connect($server, $user, $pass);
    으로 쓰고 닫을때는
    mysql_close($conn); 이런 식으로 하던데

    include 할때는 mysql_close(); 이런식으로도 되나요?
    왕초보라 이상한질문 죄송합니다 ^^;

    • Kurien 2016.11.24 10:40 신고  댓글주소  수정/삭제

      그냥 dbconfig.php가 인크루드 된곳 기준으로 아래의 원하는 위치 어디에서든 사용하셔도 됩니다.

      하지만 PHP의 경우에는 페이지 로드가 끝나면 자동으로 mysql_close를 해주므로 크게 신경쓰실 필요는 없습니다^^

  10. PHP좋아요 2017.10.10 12:11 신고  댓글주소  수정/삭제  댓글쓰기

    상세히 설명해주셔서 처음 접하는 사람들에게도 쉽게 다가갈 수 있어서 좋았어요!
    다시 한 번 감사드립니다~!

  11. 먹튀무법자 2019.01.25 02:15 신고  댓글주소  수정/삭제  댓글쓰기

    먹튀신고 먹튀무법자 〓주소〓 MT-MU.COM ◀◀ 먹튀무법자 카지노먹튀신고
    ■〓주소〓▶▶ MT-MU.COM ◀◀
    먹튀사이트 먹튀무법자 〓주소〓 MT-MU.COM ◀◀ 먹튀무법자 카지노검증 ■〓주소〓▶▶ MT-MU.COM ◀◀
    먹튀검증사이트 먹튀무법자 는 배터를 위한 먹튀검증 정보공유 사이트를 운영하고있습니다..
    먹튀피해자 분들의 피해신고를 접수받아서 1차 먹튀무법자 먹튀검증사이트에 공개를 하고
    협력업체 검증사이트와의 연계를 통해 보다 더 빠르고 신속하게 먹튀사이트의 공유 및 공개를 위해 빠르게 움직이고 있습니다.

  12. 먹튀무법자 2019.01.25 23:02 신고  댓글주소  수정/삭제  댓글쓰기

    먹튀신고 먹튀무법자 〓주소〓 MT-MU.COM ◀◀ 먹튀무법자 카지노먹튀신고
    ■〓주소〓▶▶ MT-MU.COM ◀◀
    먹튀사이트 먹튀무법자 〓주소〓 MT-MU.COM ◀◀ 먹튀무법자 카지노검증 ■〓주소〓▶▶ MT-MU.COM ◀◀
    먹튀검증사이트 먹튀무법자 는 배터를 위한 먹튀검증 정보공유 사이트를 운영하고있습니다..
    먹튀피해자 분들의 피해신고를 접수받아서 1차 먹튀무법자 먹튀검증사이트에 공개를 하고
    협력업체 검증사이트와의 연계를 통해 보다 더 빠르고 신속하게 먹튀사이트의 공유 및 공개를 위해 빠르게 움직이고 있습니다.

  13. 고창석 2019.02.02 23:12 신고  댓글주소  수정/삭제  댓글쓰기

    모두 반갑습니다

    naver.com gogo~

  14. 고창석 2019.02.03 14:06 신고  댓글주소  수정/삭제  댓글쓰기

    모두 반갑습니다

    naver.com gogo~

  15. 고창석 2019.02.03 14:10 신고  댓글주소  수정/삭제  댓글쓰기

    모두 반갑습니다

    naver.com gogo~

  16. 고창석 2019.02.05 23:57 신고  댓글주소  수정/삭제  댓글쓰기

    모두 반갑습니다

    naver.com gogo~

  17. Gpay(지페이) 2019.02.07 15:32 신고  댓글주소  수정/삭제  댓글쓰기

    GPAY에 오심을 환영합니다
    실체가 확실한 Gpay입니다
    지페이 구입만 하면 5배가 되여 하루에 0.25%씩 지급되며
    가맹점등에서 지페이로 구매도 할수있는
    G-pay 지금 선점 하세요

    백서도 없고 실물이 없는 pay풀랜은 가라!
    최초 백서를 동반한 실물 g-pay

    기존 pay는 p2p방식 출금은 한계가 있으나
    이제 출발하는 G-pay는 가입과 함께 3개월내에 상장확정된 주식을 담보 제공은 물론 은행과도 연동하였고 거래소 코인으로 전환후 출금 가능 합니다

    G-pay는 자산 10조되는 중국계 구일그룹
    계좌주식과 한국 금광회사에서 Gescoin을 담보로 안정성을 보장 해줍니다
    일일 보너스도 타 pay보더 높습니다

  18. 고창석 2019.02.10 11:18 신고  댓글주소  수정/삭제  댓글쓰기

    모두 반갑습니다

    naver.com gogo~

  19. 스포플레이 2019.02.11 05:15 신고  댓글주소  수정/삭제  댓글쓰기

    스포플레이 추천인 양신1

    https://www.spoplay.com/

    스포플레이 추천인 양신1

    https://www.spoplay.com/

    스포플레이 추천인 양신1


    #스포플레이


    #스포플레이추천인


  20. 임투지 2019.02.14 17:10 신고  댓글주소  수정/삭제  댓글쓰기

    소개비 없는 구인구직사이트 www.0433010.com으로
    모든정보를 공유하는 사이트입니다.\
    새해 복많이 받으시구 하시는 일이 대박나시기를 기원합니다.
    혹 사이트 등록을 원하지 않을시 이메일로 메세지를 보내주세요.
    renjie1977525@naver.com

  21. 임투지 2019.02.16 14:12 신고  댓글주소  수정/삭제  댓글쓰기

    소개비 없는 구인구직사이트 www.0433010.com으로
    모든정보를 공유하는 사이트입니다.\
    새해 복많이 받으시구 하시는 일이 대박나시기를 기원합니다.
    혹 사이트 등록을 원하지 않을시 이메일로 메세지를 보내주세요.
    renjie1977525@naver.com