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.06.07 14:44 신고  댓글주소  수정/삭제  댓글쓰기

    이전 글에서 db 생성하는 코드는 어떻게 해야 db가 생성되는건가요 ㅠㅠ

    • Kurien 2016.06.10 18:08 신고  댓글주소  수정/삭제

      mysql 설치하신 후에, 해당 콘솔에서 "create database 데이터베이스_이름" 을 적어서 DB를 생성하시고, "use 데이터베이스_이름" 을 하셔서 DB에 접속하신 뒤에 말씀하신 코드를 입력하셔야합니다.

  3. 공순이 2016.06.13 21:06 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 저희는 공대 재학중인 여대생 입니다.
    과제 수행중 시험기간이 겹쳐 클래스기반 php 관리자 페이지를 만드려고 하는데 너무 어렵습니다 ㅠㅠㅠ
    우선 첫번째 단계부터 따라 가고 있는데, php, db 연결 후 (HTTP 500 error) 페이지 연결이 안되는 원인에서 해매고 있습니다. 혹시 해결방안을 아신다면 도움 부탁드립니다.

    (* 서버는 학교에서 제공하는 공용서버 호스트를 사용하고 있습니다.)

    • Kurien 2016.06.13 21:09 신고  댓글주소  수정/삭제

      어떤 주제에 관한 관리자 페이지인지 알아야 조금 더 도움 드릴 수 있을 것 같구요.

      500 error의 경우 프로그램 상의 오류가 많습니다.
      다시한번 코드에 오타가 없는지, 잘못된 부분이 없는지 확인해보세요.

  4. 공순이 2016.06.14 17:06 신고  댓글주소  수정/삭제  댓글쓰기

    위 댓글의 공순이입니다..
    현재 db연결도 성공이고 admin에 db테이블과 insert도 성공적으로 됬는데
    자유게시판에 뜨질 않아요.. 무엇이 문제인지 네시간째 고민중입니다ㅠㅠ 도와주세요...

    혹시 괜찮으시다면 메일로 카톡 ID 보내주실수 있으세요??ㅠㅠ 곤란하시다면 정말정말 괜찮습니다!

    • Kurien 2016.06.14 17:10 신고  댓글주소  수정/삭제

      메일로 카톡 아이디 보내달라고 하셨는뎅,,, 메일은 적어주셔야 보낼텐데요 ㅎㅎ;

      https://open.kakao.com/o/gcDojOk 이 링크 눌러서 채팅방 들어오세요^^

  5. 2pro 2016.06.16 17:04 신고  댓글주소  수정/삭제  댓글쓰기

    게시판만들기 글 너무너무 감사합니다.
    한가지 궁금한게 board 폴더에 index를 넣어준다면 아파치 httpd에서 루트폴더를 board로 잡아 주는게 맞나요? 저는 루트 폴더 안에 보드를 만들고 작성하니까 접근제한되더라구요...

  6. 2pro 2016.06.22 08:58 신고  댓글주소  수정/삭제  댓글쓰기

    1. while($row=mysqli_fetch_assoc($result))
    2. while($row = $result->fetch_assoc());
    1번과 2번의 차이가 뭐가요?ㅜ 2번으로하면 리스트가 안나오고 1번으로하면 리스트가 잘 나오네여...이상ㅠ

    • Kurien 2016.06.22 09:03 신고  댓글주소  수정/삭제

      결과적으로는 차이가 없구요.
      단순히 순차적으로 처리되는지 객체지향적으로 처리되는지의 차이입니다.
      while($row = $result->fetch_assoc())의 윗 부분에
      "$result = $db->query($sql);"를 사용하셨다면 리스트가 나오는게 정상입니다.

      만약 $result = mysqli_query($db, $sql)을 사용하면 $row = $result->fetch_assoc()로는 결과가 나오지 않을 수도 있습니다.

    • 2pro 2016.06.23 09:15 신고  댓글주소  수정/삭제

      답변 감사합니다.
      게시판강의는 두번정도 읽고 많은 도움 됐습니다^^
      지금은 게시판을 응용해서 다른걸 만들어보고 있어요.
      응용하려니 조금 막혀서 문제ㅠ;
      암튼 좋은하루 되시고 앞으로도 운영자님 게시판 많이 참고할게요^^

    • Kurien 2016.06.23 09:21 신고  댓글주소  수정/삭제

      하다가 막히시는 부분 있으면 질문 해주세요^^
      보는대로 답변 해드리겠습니다~

  7. ㅎㅎ 2016.07.14 22:34 신고  댓글주소  수정/삭제  댓글쓰기

    본문에 <article id = "boardList"> 로 수정하셔야될것같아요 ㅋㅋ
    css내용하고 안맞아서 댓글답니다.

  8. 직딩1 2016.07.19 21:14 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 운영자님. 게시물들 잘 보고 있습니다.
    PHP 오늘 막 시작했는데 잘 가다가 여기서 막히네요... ㅠㅠ

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in ~ on line 26
    Fatal error: Call to a member function fetch_assoc() on a non-object in ~ on line 28

    line 26은 $result=$db->query($sql); 이고, line 28은 while($row=$result->fetch_assoc()) 입니다.

    몇 시간째 이것만 붙들고 있어요... 구글링도 해봤는데 영 안 나오네요. ㅠㅠ
    혹시 무슨 설정같은 게 잘못 됐을까요? 시간이 없어서 APM 설치했는데...
    답변 부탁드립니다!

    • Kurien 2016.07.21 21:53 신고  댓글주소  수정/삭제

      mysqli 모듈이 존재하는지 (phpinfo() 함수를 사용하면 확인할 수 있습니다.)를 먼저 확인해보시구요.

      존재한다면 dbconfig 부분을 다시확인해보세요.

      존재하지 않는다면 해당 모듈을 추가하시거나, mysql을 이용한 방법으로 사용하시면 됩니다.

  9. 직딩1 2016.07.22 13:39 신고  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다.
    버전 업그레이드를 했더니 해결됐어요...
    APM을 쓰고 있었는데 버전이 너무 낮아서 그럴 수도 있다는 말을 듣고 XAMPP로 갈아탔습니다. ㅎㅎ

    추가로 CSS에 관한 것입니다만,
    운영자님께서 올리신 압축 파일 속 css 폴더와 관련 코드를 복붙했는데 이미지처럼 안 나오더라구요...
    폰트는 바뀌었지만 테이블 라인이 하나도 안 나오는데 어떻게 해야 될까요? ㅠㅠ
    이미지의 레이아웃이 너무 맘에 들어서요...
    답변 부탁드립니다.

  10. 안녕하세요 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으로 전체 코드 보내주시면 확인 후 말씀 드리겠습니다.

  11. 게시판! 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 함수로 변경해주셔야하구요.

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

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

    반갑습니다

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

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

    반갑습니다

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

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

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

    안녕하세요

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

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

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

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

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

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

  17. 궁금 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를 해주므로 크게 신경쓰실 필요는 없습니다^^

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

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

  19. slayer 2018.10.15 10:04 신고  댓글주소  수정/삭제  댓글쓰기

    http://www.sinhancar.com - 중고차매매사이트
    http://www.sinhancar.com - 중고차매매가격
    http://www.sinhancar.com - 중고차판매가격
    http://www.sinhancar.com - 중고차시세표
    http://www.sinhancar.com - 중고차시세
    http://www.sinhancar.com - 중고차가격
    http://www.sinhancar.com - 중고차
    http://www.sinhancar.com - 중고차사이트
    http://www.sinhancar.com - 중고차매매
    http://www.sinhancar.com - 중고차판매

  20. 줄리엣 2018.10.19 12:00 신고  댓글주소  수정/삭제  댓글쓰기

    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터

  21. 줄리엣 2018.10.19 15:42 신고  댓글주소  수정/삭제  댓글쓰기

    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터
    [https://www.hawaiimajor.com] 메이저사이트,메이저사이트추천,메이저사이트검증,안전놀이터