웹마스터 팁

몇일 바쁘게 생활하다 보니 오늘에서야 글을 올리네요


오늘 할 것은 write.php 파일과 write_ok 파일입니다

글을 쓸수 있는 파일과 그 글을 디비에 저장하는 파일이죠

제로보드는 모드 ($mode)를 이용해서 글쓰기 수정 지우기 등을 합니다  처음부터 깊게 들어가면 헷갈리니까

기본적인 사항만 쓰겠습니다 보안은 전혀 신경쓰지 않았습니다

어떻게 해서 글이 들어올 때 디비에 입력되는지만 살펴 보고 다음에 다듬기 할때 필요한 몇가지 사항을

추가해 보겠습니다  마이 어드민을 열어 놓고 글이 하나 올라갈때 어떻게 들어가는지 등을 보시면 디비에

대한 어려움이 다소 줄어듭니다



일단 글을 쓸려면 글쓴이 제목 글이 필수입니다 상황에 따라 글쓴이와 제목이 필요 없는 경우도 있지만요

익명 게시판이나 혹은 메모장등은 필요 없는 부분이 있을 수 있을테니까요


글을 쓰다보면 문장을 강조하기 위해 쌍따옴표나 따옴표가 들어갈 수 있습니다 그대로 올리다 보면  오류가 납니다

어떠한 상황을 테이블에 입력 시킬때 아래와 같이 씁니다

mysql_query("insert into 테이블이름(필드이름1,필드이름2,필드이름3)values('$data[변수]','$data[변수2]','$data[변수3]')") or error(mysql_error());

테이블이름 이란 곳에 필드이름1 에는 $data[변수] 라는 걸 넣어주고 필드이름2에는 $data[변수2]가

마찬가지로 필드이름3에는 $data[변수3]이 입력됩니다

여기서 주의할 점은

values 를 기준으로 앞부분 필드 이름 들어가는 곳은 쉼표로 연결해서 써 주고 뒷부분 들어온 변수나

입력할 문자는  '변수','변수'   와 같이 홑따옴표 변수 홑따옴표 쉼표로 연결합니다

변수가 아닌 쓰고 싶은 말을 넣어도 됩니다 제로보드 같은 경우 메모장이나 방명록  같은 경우엔 제목이

들어가지 않습니다  하지만 일반 게시판엔 제목이 들어가게 되어 있고 제목을 쓰지 않을시에는 에러문이나

자바스크립트로된 알러트 창이 뜨게 되어 있죠 그걸 방지하기 위해서 방명록이거나 메모장일때는

인위적으로 제목이 들어가는 부분에 방명록이거나 메모장이란 인위적인 글을 넣어주게 됩니다


하나 더 알아야 할 사항은 테스트란 글을 강조하기 위해서 "테스트" 라고 입력했다면  들어온

데이터는 '"테스트"' 와 같이 되어서

오류가 납니다 이와 같은 경우를 방지하기 위해 글을 쓸때

$변수 = addslashes($변수); 와 같이 인위적으로  쌍따옴표 앞뒤로 를 붙여줍니다 오류가 나지 않도록요

그리고 나서 그대로 보여주면  써 넣은 내용 앞뒤로 "내용" 과 같이 되기에

$변수 = stripslashes($변수); 와 같이 붙어 있는 를 떼어내는 작업을 해주는거죠



작업을 하시면서 가장 유념하실 사항은 테이블 명과 필드명을 정확히 표기했는지 혹은 따옴표나 구문이 끝났음을

알려주는(   ;     ) Semicolon (세미콜론)을 잘 써줬는지  if문의 구문들일 때는 중괄호의 시작과 닫음이 올바르게

되었는지를 잘 확인하셔야 합니다 아무리 좋은 소스를 만들었다고 해도 위의 사항 한두개면  오류를 내거나

최악의 상황엔 해킹의 소지를 만들수도 있습니다


페스워드니 파일 업로드 같은건 다음에 다듬기 할때 해보구 골격만 올려서 글이 올라가는지만 보겠습니다

---  보안은 전혀 신경 쓰지 않았음을 다시 한번 말씀드립니다 ---




아래는 글을 쓰는 파일 write.php 입니다 소스를 복사해서 write.php 로 만들어 list.php 파일과 동일 선상에

업로드 하세요

이하 소스
--------------------------------------------------------------------------------------------------


<?

// 라이브러리 함수 파일 인크루드

   제로보드 절대경로
   제로보드 상대경로  
   include $_zb_path."lib.php";


// DB 연결
        if(!$connect) $connect=dbConn();

// 멤버정보 구하기
        $member=member_info();


// 게시판의 정보를 갖고옴;;
        $data=mysql_fetch_array(mysql_query("select * from member_board where board_id='$id'"));




$data2=mysql_fetch_array(mysql_query("select * from $member_table where user_id='$id' ||  no='$member_no'"));


// MySQL 닫기
        if($connect) mysql_close($connect);
?>
<html>

<head>
<title>제목없음</title>
<meta name="generator" content="Namo WebEditor v4.0">
</head>

<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<form method=post name=write action=write_ok.php onsubmit="return check_submit();" enctype=multipart/form-data>

<input type=hidden name=id value=<?=$id?>>
<input type=hidden name=no value=<?=$no?>>
<input type=hidden name=member_id value="<?=$data[user_id]?>">
    <tr>
        <td width="1079" height="35" colspan="3" align="center" valign="middle" bgcolor="#F2F2F2">
♧  좋은 글을 남겨 주세요  ♧        </td>
    </tr>
    <tr>
        <td width="1079" height="9" colspan="3">
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="25">
           페스워드
        </td>
        <td width="1" height="25" bgcolor="silver">
        </td>
        <td width="967" height="25">
<input type=password name=password value="" size="34"  maxlength=200 class=input style=width:97%>
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="25">
            이름
        </td>
        <td width="1" height="25" bgcolor="silver">
        </td>
        <td width="967" height="25">
<input type=text name=name value="" size="34"  maxlength=200 class=input style=width:97%>
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="25">
           홈페이지
        </td>
        <td width="1" height="25" bgcolor="silver">
        </td>
        <td width="967" height="25">
<input type=text name=homepage value="" size="34"  maxlength=200 class=input style=width:97%>
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="25">
           이메일
        </td>
        <td width="1" height="25" bgcolor="silver">
        </td>
        <td width="967" height="25">
<input type=text name=email value="" size="34"  maxlength=200 class=input style=width:97%>
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="25">
           옵션
        </td>
        <td width="1" height="25" bgcolor="silver">
        </td>
        <td width="967" height="25">
<input type=checkbox name=use_html  value='1' onclick='check_use_html(this)'><ZeroBoard value=1> <font class=list_han tabindex=6>HTML 사용</font>
<input type=checkbox name=reply_mail  value=1 tabindex=7> <font class=list_han>답변메일 받기</font>
<input type=checkbox name=is_secret  value=1 tabindex=8> <font class=list_han>비밀글</font>
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="25">
           제목
        </td>
        <td width="1" height="25" bgcolor="silver">
        </td>
        <td width="967" height="25">
<input type=text name=subject value="" size="34"  maxlength=200 class=input style=width:97%>
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="187">
            내용
        </td>
        <td width="1" height="187" bgcolor="silver">
        </td>
        <td width="967" height="187">

<TEXTAREA class=textarea name="memo" style="WIDTH:97%" rows="10" cols="15">

</TEXTAREA>

        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="111" height="25">
           업로드 1
        </td>
        <td width="1" height="25" bgcolor="silver">
        </td>
        <td width="967" height="25">
<input type=file name=file1   size="20"  maxlength=255 class=input style=width:97%>
        </td>
    </tr>
    <tr>
        <td width="1079" height="1" colspan="3" bgcolor="silver">
        </td>
    </tr>
    <tr>
        <td width="1079" height="34" colspan="3">
        </td>
    </tr>
    <tr>
        <td width="1079" height="36" align="center" valign="middle" colspan="3" bgcolor="#F2F2F2">
<input type=image border=0 src="images/writeok.gif" align=absmiddle  border=0 accesskey="s"onclick="selectall('ex_field');" tabindex=44>
<img src="images/writecancel.gif" align=absmiddle border=0 style=cursor:hand onclick=history.back()>
        </td>
    </tr></form>
</table>
<p> </p>
</body>
</html>




--------------------------------------------------------------------------------------------------

이상 소스

소스 설명


글을 쓰게 되면 폼태그에 의해 폼태그에서 정한 파일(write_ok.php)로 내용 (데이터)들이 넘어갑니다

현재의 소스에서 우리가 알아야 할 사항은 글쓴이 제목  내용 글쓴시간과 함께 게시판의 아이디 게시판이름

정도입니다

<form method=post name=write action=write_ok.php onsubmit="return check_submit();" enctype=multipart/form-data>

return check_submit();이란 액션이 이뤄지면 post의 형식으로 데이터 값들을 write_ok.php 파일로 넘기게 되는거죠


<input type=hidden name=id value=<?=$id?>>
<input type=hidden name=no value=<?=$no?>>
<input type=hidden name=member_id value="<?=$data[user_id]?>">

히든 처리를 해서 기본적인 정보를 같이 넘겨 주는거죠 글내용제목 이메일 홈페이지등의 외적인 사항이 필요할때

히든으로  값을 받아서 넘겨줍니다


<input type=text name=name value="" size="34"  maxlength=200 class=input style=width:97%>

이름 쓰는 인풋란입니다   타입은 글을 써 넣는 곳이니 text 로 네임값은 이름을 써 놓는 곳이니 name 으로

써 넣습니니다 만약 이메일이면 이메일 또한 글을 써 넣는  형식이니 타입은 text 네임은 email 이 되겠지요

마찬가지로 홈페이지는 homepage 로 써 넣으면 되겠죠

value=""    value값은 입력하는 곳에서 써넣은 사항이 들어오게 됩니다 홈페이지를 써 넣으면 홈페이가

들어오겠죠 들어온 사항은 폼태그를 이용해 write_ok.php 파일로 넘어가면서 변수로 받아집니다

$homepage  , $email  ,$name ,$memo 처럼요

메모(글) 는 쓰는 양이 많으므로 TEXTAREA  로 받아들이고요




아래의 소스는 write_ok.php 파일의 소스입니다

write_ok.php 파일로 만드셔서 list.php 파일과 동일 선상에 업로드 하세요


이하 소스

-----------------------------------------------------------------------------------------------

<?

제로보드 절대경로

제로보드 상대경로


   include $_zb_path."lib.php";



// DB 연결
        if(!$connect) $connect=dbConn();

// 멤버정보 구하기
        $member=member_info();


// 글쓴이의 정보를 갖고옴;;
$data=mysql_fetch_array(mysql_query("select * from member_board where board_id='$id'"));

                
                
            
                 if(isblank($subject)) Error("제목이 없습니다. 제목을 입력해 주십시오.");
                 if(isblank($memo)) Error("내용이 없습니다. 내용을 입력해 주십시오.");
                 $subject=addslashes($subject);
                 $memo=addslashes($memo);
                 $reg_date=time();



                 if($password) {
                 $temp=mysql_fetch_array(mysql_query("select password('$password')"));
                 $password=$temp[0];  
                 }






if($member[no]){// 회원일때 입력사항;

                 $name=$member[name];
                 $homepage=$member[homepage];
                 $email=$member[email];
                 $member_no=$member[no];
                 $level=$member[level];
                 $password=$member[password];

}// 회원일때 입력사항;
if(!$member[no]){// 비회원일때 입력사항;
                 if(isblank($password))Error("암호를 입력하여 주세요.<p>암호를 입력하셔야 수정/삭제를 할수 있습니다");
                 if(isblank($name)) Error("이름이 없습니다. 이름을 입력해 주십시오.");        
                 $name=$name;
                 $homepage=$homepage;
                 $email=$email;
                 $member_no=$member[no];
                 $level=$member[level];
         $password=$password;  

}










$memo = addslashes($memo);

            
mysql_query("insert into member_get_memo(board_name,board_id,member_id,name,password,homepage,email,member_no,subject,memo,reg_date,file1)values('$data[board_name]','$data[board_id]','$data[user_id]','$name','$password','+ '$homepage','$email','$member_no','$subject','$memo','$reg_date','$path')") or error(mysql_error());


         echo"<script language="javascript">
               window.alert("$data[board_name]에 글이 등록되었습니다.");
               location.href='list.php?id=$id';
              </script>";
?>

---------------------------------------------------------------------------------------------------

이상 소스




소스 설명 :


// 글쓴이의 정보를 갖고옴;;
$data=mysql_fetch_array(mysql_query("select * from member_board where board_id='$id'"));

글을 쓰고 있는 게시판의 기본 정보를 빼오기 위해서 써줍니다


글이 등록되면서 해당게시판의 아이디가 들어가야 하기 때문입니다

                 if(isblank($name)) Error("이름이 없습니다. 이름을 입력해 주십시오.");  
                 if(isblank($subject)) Error("제목이 없습니다. 제목을 입력해 주십시오.");
                 if(isblank($memo)) Error("내용이 없습니다. 내용을 입력해 주십시오.");
                 $subject=addslashes($subject);
                 $memo=addslashes($memo);
                 $reg_date=time();


만약  $name 값이 비어 있다면 에러를 냅니다 다른 부분도 마찬가지구요

$memo=addslashes($memo);

위에 써 놓았듯이 슬러시를 붙여줍니다

$reg_date=time();

글쓴 시각을 알기위해서 $reg_date 값에 시간을 넣어주는거죠

        
mysql_query("insert into member_get_memo(board_name,board_id,member_id,name,homepage,email,member_no,subject,memo,reg_date,file1)values('$data[board_name]','$data[board_id]','$data[user_id]','$name','$homepage'+ ','$email','$member_no','$subject','$memo','$reg_date','$path')") or error(mysql_error());


member_get_memo 라는 테이블의 board_name필드에는 $data[board_name]을

board_id 에는 $data[board_id]를 대입하는 식으로 들어온 변수를 넣어주게 됩니다

$path  이부분은 차후에 그림이나 파일이 올라왔을때 들어가게 되는 부분입니다

제가 생각한 방식은 데이터 폴더에 각아이디별로 폴더를 생성하게 해서 그 안에

사용자아이디_게시판이름_날짜 와 같이 연결해서 넣어주는 방법입니다  사용자 아이디별로 폴더가 생성되니

관리하기가 좀 수월할듯 싶어서요 데이터 폴더안에 풀어서 넣어버릴 수도 있지만 만약 뒤섞인 상태에서

해당 게시물의 파일을 수동으로 지워야하는 일이 있다면 사용자의 아이디만 안다면 빨리 해당 게시물을

찾기 편할테니까요




         echo"<script language="javascript">
               window.alert("$data[board_name]에 글이 등록되었습니다.");
               location.href='list.php?id=$id';
              </script>";


게시물이 등록되면 해당 게시판의 list.php 파일로 돌려줍니다



잠깐 팁:

. php파일 안에서 쌍따옴표를 쓰실때는 위의 자바스크립트 처럼 쌍따옴표 앞에 를 넣어주셔야

오류가 나지 않습니다

. 소스를 만들면서 필요한 사항들이 있을때는 적절한 위치를 찾아서 넣어줘야 합니다

예를 들면

소스를 A B C D 라는식으로 작성해야 Z 라는 결과물이 나온다 했을때

A  B D C 라는 식으로  소스를 작성했다면 Z라는 결과 값이 나오지 않을 수 있습니다

옷을 입을 때 속옷 겉옷 외투를 입듯이 순서가 맞아야 원하는 결과물이 자연스럽게 나옵니다

소스를 만들 때 그런 점들도 유념하시면 편할듯 합니다





파일을 다 올리신후 변경하실 사항은 리스트 파일과 뷰파일의 글쓰기란을 아래와 같이 바꿔 주시면 됩니다

<a href=<?="write.php?id=$data[board_id]"?>>글쓰기</a>

또한 아래의 경로로 images 폴더를 만드셔서 필요한 그림 파일을 업로드 해서 연결해 주면 됩니다

writecancel.gif   writeok.gif 로 적당한 그림을 images 폴더안에 업로드 해주세요

------- 인덱스 페이지
    |____ 제로보드 (bbs,zboard)
    |____ mini
    |          |__admin ----- mini_home_modify.php
    |          |                |__ mini_home_modify_ok.php
    |          |  
    |          |__ layer
    |          |__ skin
    |          |__ images
    |          |
    |          |_____ 미니홈에 들어가는 파일들
    |
    |
    |____ 기타 파일들

제목 글쓴이 날짜
개판 오분전 라인 그래프 [4] 미친개 2004.12.01
실명 진위여부 확인 [10] piasol 2004.12.01
나만의 미니홈 만들기 ㅡ write.php 파일과 write_ok [5] 예뜨락 2004.11.30
나만의 미니홈 만들기 ㅡ view.php 파일과 제목링크 [9] file 예뜨락 2004.11.27
나만의 미니홈 만들기 ㅡ list.php , 디비 테이블 생성 [6] file 예뜨락 2004.11.26
나만의 미니홈 만들기 ㅡ 게시판 list.php 파일의 모양새 [6] 예뜨락 2004.11.23
나만의 미니홈 만들기 ㅡ 게시판의 디자인 file 예뜨락 2004.11.22
나만의 미니홈 만들기 ㅡ 미니홈 생성 페이지 [3] file 예뜨락 2004.11.20
나만의 미니홈 만들기 ㅡ 기초적인 관리 페이지 [3] file 예뜨락 2004.11.20
나만의 미니홈 만들기 ㅡ 메인 기초 설계3 .레이아웃 [2] file 예뜨락 2004.11.19
나만의 미니홈 만들기 ㅡ 메인 기초 설계2 .레이아웃 예뜨락 2004.11.18
나만의 미니홈 만들기 ㅡ 글쓰기에 앞서... [1] 예뜨락 2004.11.17
[타키의 초보강좌]PHP 기초 강좌 제 2탄[mysql로 들어가보자.] [2] 타키 2004.10.24
소수[솟수] 쉽게 구하기[에라토스테네스의 해 알고리즘사용] , 경우의 수 구하기 [5] 타키 2004.10.23
[타키의 초보강좌]PHP 기초 강좌 제 1탄[패스워드 인증] [8] 타키 2004.10.23
www자동 붙히기 [8] 미오유 2004.10.22
IP to 정수변환(;) [4] 플로렐라 2004.10.21
한글자르는 문제 PHP차원에서 해결된 건가? [5] 겜방 2004.10.20
MySQL의 패턴 매칭 맛보기 [2] 손상모 2004.10.19
그래프 만들어주는 소스 [10] 미친개 2004.10.15