• 따뜻한 부모가 될 수 있도록 돕습니다. 현명한 학부모가 될 수 있도록 돕습니다.
  • 글도 쓰고 강연도 합니다.
  • 제 트위터는 @itmembers, 페이스북은 www.facebook.com/itmembers입니다.
  • 네이버 블로그는 charen.kr입니다. 최신 글은 네이버 블로그에서 보실 수 있습니다.
  • 요즘 중국차에 푹 빠져 있는데, 중국차에 대한 얘기도 네이버 블로그에서 전해드립니다.
  • [참고] 뽀~너스! 댓글(코멘트) 달기 구현 원리

    Posted on : 2003-08-17 | By : SON BYOUNGMOK | In : PHP 게시판 만들기 2

    태그:, , , ,

    0

    참고로 댓글은 답변형 게시판과는 또 다른 것입니다.
    일반적으로 댓글이라고 하면 어떤 글에 대해 짤막하게 답변을 다는 것을 말하는데, 원본 글이 상단에 보이면서 하단에 여러 개의 댓글이 함께 보이는 것을 말합니다.
    답변 글이 또 한번의 클릭을 해야 볼 수 있는데 반해, 댓글은 원 글의 내용을 보면서 바로 확인할 수 있다는 점에서 훨씬 편리한 커뮤니케이션 방법이라고 할 수 있습니다.

    아래 그림은 제가 만든 DJ보드에서 댓글 두 개를 달았을 때의 모습입니다.

    보시다시피, 원래의 글 밑에 두 개의 댓글이 바로 보이며, 또 댓글을 바로 달 수 있는 입력 폼이 함께 있습니다.

    원리는 비교적 간단합니다. 답변형 게시판을 구현하는 것에 비하면 간단하다고 할 수 있죠.
    그러나 답변형 게시판은 기존 테이블에 필드 두 세 개를 추가해서 만들 수 있는 반면, 댓글 게시판은 댓글을 저장하기 위한 별도의 테이블을 생성시켜야 합니다(꼭 이렇게 해야한다는 것은 아니지만…).

    예를 들어, 자유게시판용 free 테이블이 있다면,

    1. 이 테이블의 댓글을 저장하기 위한 free_comment 테이블을 따로 만들어 둡니다.

    2. free_comment 테이블은 대개 다음과 같은 필드로 구성하면 됩니다.
      • 댓글 고유 번호(식별자) – 예) number

      • 원 글의 번호를 저장하기 위한 필드 – 예) parent
      • 댓글 작성자 이름, 아이디, 패스워드 등 – 예) name, userid, password
      • 실제 댓글이 저장되는 부분 – 예) comment
      • 댓글 작성자 IP 및 작성 시간 등 – 예) ip, wirtetime

      이제 어느 정도 감~이 잡히셨나요?
      이제 어떻게 해야할까요?

    3. 글 내용을 보는 화면(view.php) 하단에 댓글을 달 수 있는 입력 폼을 추가해야 하겠죠.
    4. 그리고 그 입력 폼에서 전달된 값을 저장할 수 있는 프로그램(예 comment_ok.php)을 만들어야겠지요.
    5. 글 내용을 보는 화면(view.php)에서는, 기본 글 내용 뿐만 아니라 연관된 댓글도 함께 보여줄 수 있는 로직을 구현해야겠지요.
      예를 들어, free 게시판의 3번 글의 내용을 보여 준다면, free_comment 테이블에서 parnet 값이 3 인 내용도 모두 읽어와 함께 보여 주면 됩니다.

    6. 마지막으로 자신이 작성한 댓글을 삭제할 수 있는 기능을 추가하면… 끝~~~~

    어떻습니까?
    원리가 어느 정도 이해되시나요?

    보다 자세한 구현 방법은 답변형 게시판 강좌가 끝난 다음에 하겠습니다.

    이상, 선선한 일요일 아침 동주아빠 손병목이었습니다.

    답변형 게시판 구현 원리 (1/2) TYPE 1

    Posted on : 2003-08-16 | By : SON BYOUNGMOK | In : PHP 게시판 만들기 2

    태그:, , , ,

    0

    게시판을 통해 메일을 통해 답변형 게시판의 원리와 구현 방법에 대한 설명을 부탁하신 분들이 꽤 있습니다. 저 역시 답변형 게시판의 구현을 2차 PHP 게시판 프로젝트의 주요한 목표로 설정해 놓고도 시간이 없어 진행하지 못했는데요, 이번 연휴를 맞아 드디어 시작하게 되었습니다.
    짝~짝~짝~~~~~~ (자축의 박수부터 치고…)

    대개의 프로그래밍이 그러하듯이 원하는 기능을 구현하기 위한 방법은 다양합니다.
    답변형 게시판도 예외는 아닙니다. 답변 기능을 구현하는 로직은 여러 가지가 있습니다. 나름대로의 장단점이 있구요.
    두 시간에 걸쳐 답변 기능을 구현하는 두 가지 원리를 소개해 드리는데, 이번 시간에 그 중 하나를 설명하겠습니다.
    원리를 설명하고 난 다음에 구체적인 실습을 하겠습니다.

    답변 기능을 구현하기 위해 가장 먼저 어떤 게 필요할까요?
    답변 글과 원 글과의 관계에 대한 규정이 필요합니다. 다시 말해, ‘이 글은 어느 글(= 원 글)의 답변 글이다’라는 걸 답변 글 어딘가에 기록해 둬야 한다는 겁니다.
    그리고 또 하나, 이 글은 몇 단계(깊이)의 답변 글이냐 하는 것도 중요합니다. 원 글의 답변이 1단계라면, 그 답변의 답변은 2단계라고 할 수 있고, 이렇게 계속해서 ‘답변의 답변의 답변의 답변의 답변…’과 같은 식으로 확대될 수 있는 겁니다.
    마지막으로 글 정렬 순서인데요, 이렇게 복잡하게 얽힌 글 목록을 원 글과 답변 글의 관계를 고려하여 보기 좋게 나열해야 하는 겁니다.

    기본적인 원리는 위와 같지만 실제 구현하기 위한 방법에는 약간의 차이가 있습니다.
    그 중 하나를 지금부터 설명드리죠.

    새로 글을 작성할 때 그 글을 구분하는 유일한 식별자가 무엇이죠?
    지금까지 우리는 number 라는 필드에 고유한 값을 자동으로 입력되도록 했습니다. 가장 기본이 되는 식별자입니다.
    거기에 답변 기능을 구현하기 위해 3개의 필드를 추가합니다.
    list_numberdepth, parent 등 세 개의 필드가 필요합니다.(항상 이런 건 아니구요, 다음 시간에 사용할 방법은 두 개의 필드만 필요합니다.)

    이제 글을 하나씩 등록해 볼까요?

    1. 첫 번째 글을 등록할 경우

      모든 번호가 다 1입니다.
      이것만 봐서는 도저히 알 수가 없습니다.

    2. 두 번째 글을 등록할 경우

      number는 순서대로 늘어나기 때문에 2가 됩니다.
      list_number는 화면에서 보여주는 순서이기 때문에 나중에 등록된 글을 먼저 보여주기 위해 두 번째 등록한 글이 1이 되고, 첫 번째 글은 2가 됩니다.
      답변 글이 아니기 때문에 depth는 1이 됩니다.
      마찬가지로 답변 글이 아니기 때문에 parent는 원 글의 number와 동일한 2가 됩니다.

      이 정도만으로도 아하~ 하고 깨닫는 분이 분명 있을 겁니다.

    3. 두 번째 글에 답변 글을 작성할 경우

      number는 순서대로 늘어나기 때문에 3이 됩니다.
      list_number는 화면에서 보여주는 순서라고 했죠? 가장 위쪽에 두 번째 글을 보여주고, 그 아래에 두 번째 글의 답변 글, 가장 아래에 첫 번째 글이 보이겠죠?
      정리하면, 두 번째 글의 답변 글은, 두 번째 글의 list_number보다 큰 첫 번째 글의 list_number값을 1 증가시키고(=3), 자신은 원 글의 list_number에 1을 더합니다(=2). 원 글(두 번째 글)의 list_number값은 그대로 둡니다(=1).
      depth는 답변 글이기 때문에 2가 되고,
      parent에는 원 글의 번호(number)인 2가 저장됩니다.

    4. 세 번째 글을 등록할 경우

      number는 순서대로 늘어나기 때문에 4가 됩니다. 고유 번호이죠.
      list_number는 화면에서 보여주는 순서라고 했죠? 지금 쓴 글이 가장 위쪽에 배치되어야 하므로, 자신의 글은 1이 되고, 나머지 글의 list_number의 값은 모두 1씩 증가시킵니다.
      depth는 답변 글이 아니므로 1이 되고,
      parent에는 원 글의 번호, 즉 자신의 번호(number)인 4가 저장됩니다.

      마지막으로 하나의 예만 더 들어 볼까요?

    5. 첫 번째 글의 답변 글을 작성할 경우

      number는 순서대로 5.
      list_number는 첫 번째 글의 list_number(=4)보다 큰 list_number가 없으므로 나머지는 모두 그대로 두고, 자신만 첫 번째 글의 list_number에 1을 더하게 됩니다(=5).
      depth는 답변 글이므로 2가 되고, (만약 답변의 답변일 경우에는 depth가 3이 되겠죠.)
      parent에는 원 글의 번호 (number)인 1이 저장됩니다.

      자~ 다 되었습니다.
      이제 list_number를 기준으로 다시 정렬해 볼까요?

      이해가 되시나요?

    그런데, 이렇게 게시판을 구현하려고 하면,
    게시판을 처음 만들 때부터 이를 고려해서, 글이 저장될 때마다 자신 뿐만 아니라 다른 게시물의 list_number의 값도 수정해야 합니다. 게시물의 수가 엄청나게 많다면 이것도 보통 일은 아니겠죠? 또한 이곳 게시판 강좌를 꾸준히 따라하셔서 나름대로 게시판을 만들어 운영하고 있는 분이라면 매우 난감한 일이 아닐 수 없습니다.

    답변 기능까지 구현된 게시판을 처음부터 새로 설계한다면 고려해 볼만한 방식입니다만, 저를 믿고 이 프로젝트를 순서대로 따라하신 분이라면 다음 시간에 설명드릴 방법으로 한번 해보시는 게 어떨까 생각합니다. (물론 각각의 장단점은 모두 있어 어느 것이 월등히 좋다고 말씀드릴 수는 없겠네요…)

    가을 정취가 물씬 풍기는 주말 오후네요.
    이상, 동주아빠 손병목이었습니다.

    게시판에 여러 개의 파일 첨부하기(2/2)

    Posted on : 2003-08-15 | By : SON BYOUNGMOK | In : PHP 게시판 만들기 2

    태그:, , , ,

    0

    전 시간에 이어서 설명합니다.

    지난 시간에 write.php와 insert.php를 설명드렸는데요, 지난 시간 내용만 이해하셨다면 이번 시간에는 가볍게 넘어갈 수 있습니다.

    이 강좌에서 설명하고 있는 소스 파일은 자료실에 등록되어 있습니다. 참조하시기 바랍니다.

    view.php

    24~27행까지는 첨부 파일의 크기를 구하는 부분입니다.

    87~126행까지는 첨부 파일의 이름과 경로를 구하는 부분입니다. 기존 1개에서 3개로 늘린 것 뿐이니 별다른 설명이 필요 없을 것 같네요.

    modify.php

    전 시간에 설명드린 write.php와 비슷합니다. 글 수정 폼입니다.
    배열의 첨자에 사용되는 변수의 값이 $num 의 값에 따라 변하는 것이 특징입니다.
    잘 보시고 이해하세요.

    modify_ok.php

    27~72행을 보면 전 시간의 insert.php와 거의 같죠?
    따로 설명드릴 게 없네요.

    79~87행은 첨부 파일이 있을 경우에만 update 문을 이용해 DB를 수정하는 부분입니다. 기존 1개에서 3개로 늘린 것 뿐입니다.

    좀 전에 광복절 기념 평양 노래자랑이 끝났습니다. 세상 많이 변했죠?
    이상, 동주아빠 손병목이었습니다.

    게시판에 여러 개의 파일 첨부하기(1/2)

    Posted on : 2003-08-15 | By : SON BYOUNGMOK | In : PHP 게시판 만들기 2

    태그:, , , ,

    0

    정말 오랜만에 강좌 업데이트합니다.
    이번 주에 답변형 게시판에 대한 강좌를 시작하려고 하는데, 그보다 앞서 우선 여러 개의 파일을 첨부할 수 있는 기능을 추가해보겠습니다. 앞 강좌에서 1개의 파일을 첨부할 수 있는 기능을 추가했는데, 앞 강좌의 연장선상에서 진행하겠습니다. 사실 게시판을 만드는데 달랑 첨부 파일이 하나만 업로드할 수 있다면 기능이 좀 약하다는 느낌이 들잖아요.

    이번 실습에서는 3개의 파일을 업로드할 수 있도록 하겠습니다. 여기에 약~~~간만 손되면 첨부 파일의 갯수는 맘껏 조정할 수 있습니다.

    만들어 볼 폼음 우선 아래와 같습니다.

    이 기능을 모두 구현하기 위해서는 다음과 같이 5개의 파일을 손 봐야 합니다.

    • 글 쓰기 폼과 DB 저장 부분 : write.php insert.php

    • 글 내용 보기 : view.php
    • 글 내용 수정 폼과 DB 저장 부분 : modify.php modify_ok.php

    그 전에 DB 테이블에 첨부 파일의 이름을 저장할 수 있도록 몇 개의 필드를 추가해야겠죠.

    이 강좌와 관련된 소스 파일(5개)은 자료실에 등록해 두었습니다. 참조하시기 바랍니다.

    bbs 테이블 수정

    기존 테이블은 첨부 파일을 하나만 저장할 수 있도록 되어 있었습니다.
    첨부 파일 하나를 저장하기 위해서는 파일의 정확한 경로와 이름을 모두 저장하는 필드와 파일 이름만 저장하는 필드, 이렇게 두 개의 필드가 필요했습니다.
    따라서 3개의 파일을 저장하기 위해서는 파일의 경로와 이름을 저장하는 필드, 파일 이름만 저장하는 필드 등 각각 2개씩 추가해야겠지요.

    필드를 어떻게 추가해야하는지 모른다구요?
    http://localhost/myadmin/ 이렇게 해서 추가를 합니다. 그래도 모르시겠다면 PHP 게시판 1 강좌 중에서 테이블 생성하는 부분을 참조하시기 바랍니다.

    write.php

    비교적 간단합니다.
    기존 파일 첨부 부분을 아래와 같이 수정합니다.
    for 문을 사용하여 파일 첨부 입력 폼을 3개까지 만들 수 있도록 했습니다.
    여기서 주의할 것은 파일 첨부를 위한 input name의 속성 값이 각각 다르게 지정해야 한다는 겁니다.
    127행을 보시면 name 속성에 $selectfile 값이 대입되도록 되어 있습니다.
    $selectfile 값은 124행에서 지정하였듯이 “upfile”이라는 문자 뒤에 $num 값이 연결된 형식, 즉 upfile1 upfile2 upfile3 과 같은 식으로 지정되는 겁니다.

    insert.php

    이 강좌의 핵심이 되는 부분입니다.
    그러나 기본적인 원리에 대해서는 이미 수 차례에 걸쳐 이미 설명을 드렸던 것이니 자세한 설명은 따로 하지 않겠습니다.
    파일 업로드 기능 구현 및 게시판에 파일 첨부 기능 추가와 관련된 강좌를 참조하시기 바랍니다.

    역시 for 문을 사용해서 업로드한 파일을 3개까지 반복하여 저장하고 있습니다.

    25행을 보면, $upfile = ${“upfile”.$num} 이라고 되어 있습니다.
    $num의 값이 1,2,3으로 바뀔 때마다 $upfile의 값도 $upfile1, $upfile2, $upfile3으로 바뀌도록 한 것입니다.
    변수를 지정할 때 중괄호 { } 의 용도에 대해 단적으로 알 수 있는 부분입니다.
    중괄호 { }를 적절히 사용하면 변수 이름을 다양하게 응용할 수 있습니다.

    만약 위 예에서 만약 $upfile = $upfle.$num 과 같이 했다면 어떻게 될까요?
    그러면 $upfile에 저장된 값과 $num의 값이 합쳐져서 이상한 값이 $upfile에 저장될 것입니다.

    마지막으로 insert 문을 볼까요?

    이렇게 써도 되는데, 다음과 같이 필드명을 나열하여 쓰는 것이 정석입니다.
    가끔 위와 같이 해서 저장이 안된다는 분들이 있어 아래와 같이 사용하기를 권장합니다.
    (이 강좌를 처음부터 순서대로 제대로 따라하시면 상관없는데 그렇지 않은 경우에 저장이 안될 수 있으니까요…)

    $sql = “insert into bbs
    (number,name,password,email,homepage,subject,memo,count,ip,writetime,file_name1,s_file_name1,file_name2,s_file_name2,file_name3,s_file_name3)
    values(”,’$name’,'$password’,'$email’,'$homepage’,'$subject’,'$memo’,$count,’$ip’,$writetime,’$target1′,’$upfile1_name’,'$target2′,’$upfile2_name’,'$target3′,’$upfile3_name’)”;


    어떠세요?
    너무 오랜만에 업데이트해서 따라하시는 데에 힘들진 않으셨나요?

    이상, 광복절 오후에 동주아빠 손병목이었습니다.

    게시판에 파일 첨부 기능 추가(3/3)

    Posted on : 2003-02-23 | By : SON BYOUNGMOK | In : PHP 게시판 만들기 2

    태그:, , , ,

    1

    지난 시간 2회에 걸쳐 게시판의 글 쓰기 프로그램(write.php insert.php)에 파일 업로드 기능을 추가해 보았습니다.

    이번 시간에는 마지막으로 글 수정(modify.php modify_ok.php) 및 내용 보기(view.php) 부분에서 관련 기능을 구현하기 위해 짚고 넘어가야 할 몇 가지만 얘기하겠습니다.

    1. modify.php 파일을 열어 80행과 148~157행을 아래와 같이 수정합니다.


    wirte.php와 동일한데, 다만 152행에서와 같이 기존에 첨부한 파일의 이름을 보여주는 부분만 눈여겨 보시면 됩니다.(bbs 테이블의 s_file_name1 필드의 내용(첨부 파일 이름)을 보여주고 있습니다.)
    웹 브라우저에는 아래와 같이 보입니다.

    1. modify_ok.php 파일은 지난 시간에 다루었던 insert.php 파일과 거의 비슷합니다.
      단, 69~71행에서와 같이 첨부 파일을 새로 업로드했을 경우에만 첨부 파일 이름이 기록된 fiel_name1 s_file_name1 필드의 내용을 업데이트해야 합니다. 그렇지 않고 다른 컬럼과 마찬가지로 그냥 업데이트하면 기존의 값을 지워버리게 됩니다.

    1. view.php 파일은 아래와 같이 두 부분을 수정합니다.

    filesize는 파일의 크기를 byte로 구해주는 PHP 내장 함수입니다.
    따라서 filesize($array[file_name1])은 file_name1에 저장된 값(디렉토리명 + 파일이름)에 해당되는 파일을 찾아 그 크기를 구해주는 기능을 합니다.
    파일 크기를 바이트로 구한 다음, 1024로 나누면 KB가 됩니다.
    그 값을 다시 소수점 반올림한 값으로 구하기 위해 round 함수를 사용했습니다.
    Round(xxx,2)라고하면 xxx 값을 반올림하여 소수점 이하 둘째자리까지 구하게 됩니다.

    85~100행은 파일 이름과 크기를 보여주고, 해당 파일로 링크를 걸어주는 코드입니다.

    끝났습니다.

    이제 list.php를 실행하면 아래와 같이 파일의 이름과 크기가 표시됩니다.


    벌써 2월도 어느덧 마지막 주에 접어 들었습니다.
    빠르네요…

    이상, 동주아빠 손병목이었습니다.

    Switch to our mobile site