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 제 목</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 = " ".$reply_title; $number = " "; } $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> <a href='./index.html'> [목록]</a> <a href='./postform.html'> [글쓰기]</a>"); if($page != 0) { $prev_page = $page - 1; echo(" <a href='./?page=$prev_page'> [이전]</a>"); } if(!feof($indexfp)) { $next_page = $page + 1; echo(" <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. 수정하기 와 삭제하기는 숙제로 남긴다...
|
[목차] |