PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제4장 파일처리 프로그램

    4. 파일을 이용한 게시판 만들기

단계 1. 목록보기 화면( index.html )

board/라는 디렉토리를 만들고, 하위 디렉토리로 data/와 images/라는 디렉토리를 만든다. 아래와 같은 디렉토리 구조가 된다.

 

board/

    |

    +---- data/

    |           |     

    |           +---- index.data

    |           |       

    |           +---- 1

    |         

    +---- images/

    +---- index.html

    +---- postform.html

    +---- post.html

    +---- viewbody.html

 

data/디렉토리의 권한설정을 707로 바꾼다.

index.data와 1이라는 파일들은, data/디렉토리 밑에 만들어진다.

index.data 파일의 내용 :

1 || 연습용게시판 || 10 || 2001.6.10 || 이진관 || jklee@leelab.co.kr

1 파일의 내용 :

0000 || 이진관 || 안녕하세요 || 4 || || || 2001/04/22 Sun 17:48 || 202.31.147.47 || 안녕하세요. 연습용입니다. || 0 ||

위의 데이터 파일은 자동으로 만들어진다.

그리고, 아래와 같이 목록보기 화면(index.html)을 만들자.

1. 목록보기

파일명 : index.html

<html>

<head>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-kr">  

<title>게시판</title>

<STYLE TYPE="text/css">

<!--

td      { font-family:굴림,굴림체; font-size:10pt}

a:link  { font-family:굴림,굴림체; font-size:10pt;color:#003355; text-decoration:none; }

a:visited  { font-family:굴림,굴림체; font-size:10pt; text-decoration: none; }

-->

</STYLE>

</head>

<body>

<table width="700" border=0>

<tr><td align=center>

<table board=0 width=100%><tr><td align=center>

<B><FONT SIZE="3" COLOR="blue">[ 게시판 ]</FONT></B><br>

<hr width=500 size=1>

</td></tr></table>

<?

function ScriptErrMsg($strMsg)  // 에러 메시지를 출력하는 함수

{

    echo("

        <script language='javascript'>

        <!--

            alert('$strMsg');

            history.back(-1);

        //-->

        </script>

    ");

        exit;

}

 

$data_dir = "./data";   // 데이터가 저장될 디렉토리

$index_file = "./data/index.data";  // 인덱스를 저장할 파일

$page_term = 10;   // 한페이지에 나타날 목록의 개수

$php_self = $PHP_SELF;

$remote_addr = $REMOTE_ADDR;

$page = 0;

 

$td1_font = "<font size=2 color=#ffffee face=굴림>";

$td2_font = "<font size=2 color=black face=굴림>";

$td3_font = "<font size=2 color=black face=굴림 color=coral>";

 

$today = strftime("%Y.%m.%d");  // 오늘 날짜

//$new_img = "<img src='./images/new.gif' border=0>";

$new_img = "<font size=2 color=red>new</font>";

//$reply_img = "<img src='./images/reply_level.gif' border=0>";

$reply_img = "<font size=2 color=blue>[re]</font>";

 

$jump_line = 0;

$line_count = 0;

 

echo("

<table cellspacing=0 cellpadding=0 border=0>

<td bgcolor=#bbbbbb align=center>

        <table border=0 cellspacing=1 cellpadding=2>

          <tr>

            <td bgcolor=#205490 align=center>$td1_font 번호</td>

            <td bgcolor=#205490 width=400 align=center>$td1_font

                제&nbsp;&nbsp;&nbsp;&nbsp;목</td>

            <td bgcolor=#205490 align=center>$td1_font 조회</td>

            <td bgcolor=#205490 align=center>$td1_font 날짜</td>

            <td bgcolor=#205490 align=center>$td1_font 글쓴이</td>

          </tr>

    ");

 

$indexfp = fopen($index_file, "r");  // 인덱스 파일을 열고

if(!$indexfp) {

//      ScriptErrMsg("File Not Found !");

//      exit;

        $fp = fopen($index_file, "w");

    fclose($fp);

        $indexfp = fopen($index_file, "r");  // 인덱스 파일을 열고

 

}

while(!feof($indexfp))  {

     $char_data = fgetc($indexfp);  // 한자씩 읽어와서

     if($char_data != "\n") // 한 목록씩 파싱

            $line_data .= $char_data;

     else  {

            if($jump_line < $page * $page_term) {

// 페이지만큼 읽음.

                        $jump_line++;

                $line_data = "";

                        continue;

            }

        $col_data = explode(" || ", $line_data);  // 각 항목별로 파싱

            $number = $col_data[0];

            $title = $col_data[1];

            $count = $col_data[2];

            $date = $col_data[3];

            $name = $col_data[4];

            $email = $col_data[5];

 

            $reply_level = array();

            $reply_level = explode("-", $number);

            $reply_level_no = count($reply_level) - 1;

            $reply_title = "";

            if($reply_level_no) {

// 응답일 경우에는 번호를 출력하지 않고

                        $reply_title = $reply_img.$reply_title;

                        while(--$reply_level_no)

                            $reply_title = "&nbsp;&nbsp;&nbsp;&nbsp;".$reply_title;

                        $number = "&nbsp;";

            }

            $today_title = "";

            if($today == $date)  // 오늘 작성된 목록이면 new이미지 첨가.

                        $today_title = $new_img;

 

// 각 목록의 내용을 출력

                echo("

                <tr>

                    <td bgcolor=#eeeeee width=45 align=center>$td2_font $number</td>

                ");

                echo("

                    <td bgcolor=white>$td2_font $reply_title

                        <a href='./viewbody.html?id=$col_data[0]&page=$page'

                        onMouseOver=\"window.status='$title';return true\">$title</a>

                        $today_title</td>

                    <td bgcolor=white align=center>$td2_font $count</td>

                    <td bgcolor=white align=center>$td2_font $date</td>

            ");

                if($email == "")

                echo("        <td bgcolor=white width=75 align=center>$td2_font

                        $name</a></td></tr>");

            else

                        echo("        <td bgcolor=white width=75 align=center>$td2_font

                        <a href='mailto:$email'>$name</a></td></tr>");

            $line_data = "";

            $line_count++;

 

                if($line_count == $page_term) break;

    }

}

 

echo("<tr><td bgcolor=white colspan=6><table width=100% cellspacing=0 cellpadding=0 border=0>

<tr><td align=left>&nbsp;&nbsp;&nbsp;&nbsp;<a href='./index.html'>

[목록]</a>

&nbsp;&nbsp;&nbsp;&nbsp;<a href='./postform.html'>

[글쓰기]</a>");

    if($page != 0) {

        $prev_page = $page - 1;

        echo("&nbsp;&nbsp;&nbsp;&nbsp;<a href='./?page=$prev_page'>

                [이전]</a>");

    }

    if(!feof($indexfp)) {

        $next_page = $page + 1;

        echo("&nbsp;&nbsp;&nbsp;&nbsp;<a href='./?page=$next_page'>

                [다음]</a>");

    }

    fclose($indexfp);

?>

</td></tr></table>

</td></tr></table>

</td></table>

 

</td></tr></table>

</BODY>

</HTML>

 

2. 글쓰기

파일명 : postform.html (글쓰기 폼)

<HTML>

<HEAD>

<TITLE> 파일게시판 - 글쓰기 </TITLE>

</HEAD>

 

<BODY BGCOLOR="#FFFFFF">

<?

    $td1_font = "<font face='돋움' size=2>";

    $td2_font = "<font face='Arial' size=2>";

    $td3_font = "<font face='Arial' size=2 color=red>";

 

    echo("

    <form method='post' action='post.html'>

        <table border=0 align=center>

        <tr><td bgcolor=white align=center>

        <font size =5>[ 게시판 ]</font>

        </td></tr>

        <tr><td bgcolor=white>

        <table border=0>

          <tr>

            <td bgcolor=#E0D890 align=center>$td1_font 이    름 </td>

            <td bgcolor=white><input type='text' size='10' name='name' value='$name'></td>

          </tr>

          <tr>

            <td bgcolor=#E0D890 align=center>$td1_font 암    호 </td>

            <td bgcolor=white><input type='password' size='8' name='password'><font size=2> 암호는 자료실 글의 수정과 삭제시에 쓰입니다.</td>

          </tr>

          <tr>

            <td bgcolor=#E0D890 align=center>$td2_font  E-mail  </td>

            <td bgcolor=white ><input type='text' size='30' name='email' value='$email'></td>

          </tr>

          <tr>

            <td bgcolor=#E0D890 align=center>$td2_font Homepage </td>

            <td  bgcolor=white>$td3_font http://</b></font><input type='text' size='30' name='homepage' value='$homepage'></td>

          </tr>

          <tr>

            <td bgcolor=#E0D890 align=center>$td1_font 제    목 </td>

            <td  bgcolor=white><input type='text' size='50' name='title' value='$title'></td>

          </tr>

          <tr>

            <td colspan=2 bgcolor=white><textarea name='comment' rows=15 cols=60>$comment</textarea></td>

          </tr>

          <tr>

            <td colspan=4 align=center bgcolor=white>

              <input type='hidden' name='page' value='$page'>

              <input type='submit' value='           글     올     리     기          '>

              <input type='reset' value='   다 시 쓰 기  '>

            </td>

          </tr>

        </table>

        </td></tr></table>

    ");

    echo("</form>");

?>

</BODY>

</HTML>

 

 

파일명 : post.html (글쓰기 처리)

<?

$data_dir = "./data";   // 데이터가 저장될 디렉토리

$index_file = "./data/index.data";  // 인덱스를 저장할 파일

$remote_addr = $REMOTE_ADDR;

 

function ScriptErrMsg($strMsg)  // 에러 메시지를 출력하는 함수

{

    echo("

        <script language='javascript'>

        <!--

            alert('$strMsg');

            history.back(-1);

        //-->

        </script>

    ");

        exit;

}

 

    if($name == "")

        $name = "손님";

    if($password == "")

        ScriptErrMsg('암호을 입력해주세요 !!!.');

    if($title == "")

        ScriptErrMsg('제목을 입력해주세요 !!!.');

    if($comment == "")

        ScriptErrMsg('내용을 입력해주세요 !!!.');

 

//    chmod($data_dir, 0777);

//    chmod($index_file, 0777);

 

    if($indexfp = fopen($index_file, 'r'))  // 인덱스 파일을 열어서

    {

        $line_data = fread($indexfp, 80);  // 맨 첫 라인을 읽어옴

        $number = explode(" || ", $line_data);  // 번호를 파싱

        $number[0]++;  // 다음 번호를 얻어옴

        fclose($indexfp);

    }

 

    $count = 0; ////  조회수

    $new_child = 0;   //// 응답수

 

    $date = strftime("%Y.%m.%d");  // 날짜

//   index.data 파일에 저장될 내용

    $write_index_data = $number[0]." || ".$title." || ".$count." || ".$date." || ".$name." || ".$email." || "."\n";   

 

    $comment = eregi_replace("\n", "<br>", $comment);

    $comment = eregi_replace("^M", "", $comment);

 

    $fulldate = strftime("%Y/%m/%d %a %H:%M");  // 날짜

 ////// 각각의 번호파일에 저장될 내용

$write_comment_data = $password." || ".$name." || ".$title." || ".$count." || ".$email." || ".$homepage." || ".$fulldate." || ".$remote_addr." || ".$comment." || ".$new_child." || "."\n";  

 

        if(!is_dir($data_dir))   ////// data 디렉토리가 없을때

            mkdir($data_dir, 0707);

 

    if(!file_exists($index_file))  //////// index.data 파일이 없을때

    {

        $tempfp = fopen($index_file, 'w');

        fclose($tempfp);

    }

 

    $file_size = filesize($index_file);

    if($indexfp = fopen($index_file, 'r'))  ///// index.data 파일에 있던

    {                                   ///// 내용 읽어오기

            $file_data = fread($indexfp, $file_size);

            fclose($indexfp);

    }

 

    if($indexfp = fopen($index_file, 'w'))  ///// index.data 파일에 쓰기

    {

        fwrite($indexfp, $write_index_data, strlen($write_index_data));

            fwrite($indexfp, $file_data, strlen($file_data));

        fclose($indexfp);

        }

        else

            echo("$index_file을 열 수 없습니다.");

 

 

    $comment_file = $data_dir."/".$number[0];

    if($commentfp = fopen($comment_file, 'w'))

    {

                fwrite($commentfp, $write_comment_data, strlen($write_comment_data));

                fclose($commentfp);

    }

 

//    chmod($comment_file, 0755);

//    chmod($index_file, 0755);

//    chmod($data_dir, 0755);

echo "<SCRIPT>location.replace('./');</SCRIPT>";

?>

 

3. 게시내용 보기 : viewbody.html

<HTML>

<HEAD>

<TITLE> 게시판 </TITLE>

<STYLE TYPE="text/css">

<!--

td      { font-family:굴림,굴림체; font-size:10pt}

a:link  { font-family:굴림,굴림체; font-size:10pt;color:#003355; text-decoration:none; }

a:visited  { font-family:굴림,굴림체; font-size:10pt; text-decoration: none; }

-->

</STYLE>

 

</HEAD>

 

<BODY BGCOLOR="#FFFFFF">

<table width="600" border=0>

<tr><td align=center>

<table board=0 width=100%><tr><td align=center>

<B><FONT SIZE="3" COLOR="blue">[ 게시판 ]</FONT></B><br>

<hr width=500 size=1>

</td></tr></table>

 

<?

function ScriptErrMsg($strMsg)  // 에러 메시지를 출력하는 함수

{

    echo("

        <script language='javascript'>

        <!--

            alert('$strMsg');

            history.back(-1);

        //-->

        </script>

    ");

        exit;

}

 

$data_dir = "./data";   // 데이터가 저장될 디렉토리

$index_file = "./data/index.data";  // 인덱스를 저장할 파일

 

    $td1_font = "<font size=2 color=white face=굴림>";

    $td2_font = "<font size=1 face=Arial>";

    $td3_font = "<font size=2 color=black face=굴림>";

 

    $id_file = $data_dir."/".$id;  // 내용을 보여줄 파일

 

    $filesize = filesize($index_file);

    if($indexfp = fopen($index_file, 'r'))  // 인덱스 파일을 열고

    {

        $index_data = fread($indexfp, $filesize);  // 데이터를 읽어옴

        fclose($indexfp);

    }

    $per_index_line = explode("\n", $index_data);  // 각 목록별로 파싱

    $no = 0;

    if($indexfp = fopen($index_file, 'w'))

    {

        while($per_data = $per_index_line[$no++])  // 각 목록을 검사

        {

            $col_data = explode(" || ", $per_data);

            if($col_data[0] != $id)  // 내용을 보여줄 파일이 아니면

            {

                fwrite($indexfp, $per_data, strlen($per_data));

                fwrite($indexfp, "\n", strlen("\n"));

            }

            else      //  내용을 보여줄 파일이면

            {

                $col_data[2]++;  // 조회 회수를 증가하고 쓰기

                $return_data = implode($col_data, " || ");

                fwrite($indexfp, $return_data, strlen($return_data));

                fwrite($indexfp, "\n", strlen("\n"));

                

            }

        }

        fclose($indexfp);

    }

 

    $filesize = filesize($id_file);

    if($idfp = fopen($id_file, 'r'))  // 내용을 보여줄 파일을 열어서

        $idfile_data = fread($idfp, $filesize);  // 데이터를 읽어옴

    else

        echo("$id_file을 여는데 실패했습니다.");

 

    $col_data = explode(" || ", $idfile_data);  // 각 항목별로 파싱하고

    $col_data[3]++;

    $return_data = implode($col_data, " || ");

 

    if($idfp = fopen($id_file, 'w'))

        fwrite($idfp, $return_data);

    else

        echo("$id_file을 여는데 실패했습니다.");

 

    $name = $col_data[1];

    $title = $col_data[2];

    $count = $col_data[3];

    $email = $col_data[4];

    $homepage = $col_data[5];

    $date = $col_data[6];

    $remote_addr = $col_data[7];

    $comment = $col_data[8];

    $child = $col_data[9];

 

// 해당 파일을 내용을 화면에 보여줌

    echo("

        <table width=600 border=0 cellspacing=0 cellpadding=4>

          <tr>

    ");

 

    if($email != "")

    {

        echo("<td bgcolor=#205490  align=left width=150>$td1_font 글쓴이:

        <a href='mailto:$email'>$td1_font $name</a></td>\n");

    }

    else

    {

        echo("<td bgcolor=#205490  align=left width=150>$td1_font 글쓴이:$name</td>\n");

    }

 

    echo("

            <td  bgcolor=#205490 align=left width=360>$td1_font <b>$title</td>\n

            <td bgcolor=#205490 align=right>$td1_font 조회수:$count</td>\n

          </tr></table>

<table width=600 cellspacing=0 cellpadding=0 border=0><td bgcolor=#bbbbbb>

<table width=600 cellspacing=1 cellpadding=10 border=0>

    ");

 

    echo("

        <tr><td bgcolor=#ffffff>$td3_font ");

    echo("

        $td3_font $comment</td></tr>

        </table>

        </td></table>

        <table width=600 cellspacing=0 cellpadding=4 border=0>

    ");

 

    if($homepage != "")

    {

        echo("  <tr><td bgcolor=#205490 align=left >

                <a href='http://$homepage' target=_blank>$td1_font http://$homepage</a></td>");

    }

    else

    {

        echo("  <tr><td bgcolor=#205490 align=left>$td1_font

                http://www.leelab.co.kr</td>");

    }

 

 

echo("

<td bgcolor=#205490 align=right><font size=2 color=white>

글쓴시간:$date $td2_font from $remote_addr</td>

</table>

        <table width=600 cellspacing=0 cellpadding=4 border=0>

    <tr>

      <td align=left >

                <a href='./?page=$page'>[목록]</a>

                <a href='./replyform.html?id=$id&child=$child&page=$page'>

                [답변]</a>

                <a href='./deleteform.html?id=$id&page=$page'>

                [삭제]</a>

                <a href='./modifyform.html?id=$id&page=$page'>

                [수정]</a>

      </td>

    </tr>

  </table>

    ");

?>

</td></tr></table>

 

</BODY>

</HTML>

 

 

4. 수정하기 와 삭제하기는 숙제로 남긴다...

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.