Programming/PHP2010/02/12 09:01
PHP를 하다 보면 당연히 Javascript를 할수 있어야 한다.

Javascript를 이용하다 보면 항상 불편한점이 있다.

PHP에는 있는 함수가 Javascript에는 없는 경우가 그 때이다.

예를들어 PHP의 number_format() 함수가 있다.

Javascript에는 PHP의 number_format() 에 해당하는 함수가 없어서 만들어 쓰거나 포기해야 하는 경우가 많다.

근데 웹서핑중에 발견한 유용한 사이트가 있다.

왠만한 php 함수는 전부 Javascript 함수로 만들어 놓은 곳이다.

http://kevin.vanzonneveld.net/techblog/article/phpjs_licensing/  여기가 그곳이다.
PHP.JS

http://kevin.vanzonneveld.net/techblog/article/phpjs_licensing



여기에 가보면 진짜 많다. ㅎㅎㅎ

킹왕짱!

출처 : http://handsome.pe.kr/

저작자 표시 비영리 변경 금지
Posted by Mizix
TAG javascript, JS, php
Programming/PHP2010/02/11 16:30
드디어 설치형 게시판의 마지막 시간입니다.

이번시간에는 답글달기, 글수정, 글삭제에 대해서 배워보도록 하겠습니다.

특별한 부분만 설명을 하고 나머지는 주석을 통해 이해하실수 있을것입니다.

본 게시판은 http://handsome.hosting.paran.com/i_board/ 에서 확인하실수 있습니다.

답글 부분은 관계형 게시판 만들기 부분에서 설명해 드렸습니다.(http://handsome.pe.kr/70)

답글달기 부분입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_reply_level]){
    alert("권한이 없습니다.", "./index.php");
}

// 6. 글정보 가져오기
$b_idx = $_GET[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 7. 해당 글이 있는지 와 비밀글이면 비밀번호 입력여부 체크체크
if(!$data[b_idx]){
    alert("존재 하지 않는 글입니다.");
}

// 8. 댓글이 가능한지 검사
// 8-1. 이 글의 단계가 몇단계 인지 검사후 3단계면 댓글 불가
if(strlen($data[b_reply]) == 3){
    alert("더이상 댓글을 쓸수가 없습니다.");
}

// 8-2 이글에 달린 댓글의 마지막 댓글이 몇번째인지 검사

$sql2 = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_num = '".$data[b_num]."' and b_reply like '".$data[b_reply]."%' order by b_reply desc limit 1";
$result2 = sql_query($sql2);
$data2 = mysql_fetch_array($result2);

if(substr($data2[b_reply], strlen($data[b_reply]), 1) == "Z"){
    alert("더이상 댓글을 쓸수가 없습니다.");
}

// 9. 게시판 상단 이미지 출력
$dir = "./data/board_config";
$head_file = $dir."/".$board_config[bc_idx]."_head";

if($board_config[bc_head_file] && file_exists($head_file)){
?>
<br/>
<img src="<?=$head_file?>">
<?
}

// 10. 게시판 상단 내용 출력
if($board_config[bc_head]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_head]?></td>
    </tr>
</table>
<?
}

// 11. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">답글쓰기</td>
    </tr>
</table>
<br/>
<form name="bWriteForm" method="post" enctype="multipart/form-data" action="./board_reply_save.php" style="margin:0px;">
<input type="hidden" name="bc_code" value="<?=$bc_code?>">
<input type="hidden" name="b_idx" value="<?=$b_idx?>">
<input type="hidden" name="page" value="<?=$_GET[page]?>">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">글제목</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="b_title" style="width:780px;"></td>
    </tr>
    <?
    // 12.로그인 한 상태가 아니면 이름을 쓰고 로그인 한 상태면 hidden 으로 넘김
    if(!$_SESSION[user_idx]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">작성자명< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_name" style="width:780px;"></td>
    </tr>
    <?
    }else{
    ?>
    <input type="hidden" name="m_name" value="<?=$_SESSION[user_name]?>">
    <?
    }

    // 13. 비밀글을 사용하면 비밀글 체크 여부와 비밀번호 입력받기
    if($board_config[bc_use_secret]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀글 여부</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="checkbox" name="b_is_secret" value="1"> 비밀글이면 체크</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="b_pass" style="width:100px;"></td>
    </tr>
    <?
    }

    // 14. 파일 업로드를 사용하면 파일 입력
    if($board_config[bc_use_file]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">첨부파일< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="file" name="b_file" ></td>
    </tr>
    <?
    }
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:200px;background-color:#CCCCCC;">글내용< /td>
        <td align="left" valign="middle" style="width:800px;height:200px;">
        <textarea name="b_contents" style="width:800px;height:200px;"></textarea>
        </td>
    </tr>
    <!-- 15. 글쓰기 버튼 클릭시 입력필드 검사 함수 write_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 글쓰기 " onClick="write_save();">&nbsp;&nbsp;&nbsp;<input type="button" value=" 뒤로가기 " onClick="history.back();"></td>
    </tr>
</table>
</form>
<script>
// 16.입력필드 검사함수
function write_save()
{
    // 17.form 을 f 에 지정
    var f = document.bWriteForm;

    // 18.입력폼 검사

    if(f.b_title.value == ""){
        alert("글제목을 입력해 주세요.");
        return false;
    }

    <?
    // 19. 비밀글을 사용하면 비밀글 체크 여부와 비밀번호 입력 체크
    if($board_config[bc_use_secret]){
    ?>
    if(f.b_is_secret.checked == true && f.b_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }
    <?
    }
    ?>
   
    if(f.b_contents.value == ""){
        alert("글내용을 입력해 주세요.");
        return false;
    }

    // 20.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>

<?
// 21. 게시판 하단 내용 출력
if($board_config[bc_tail]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_tail]?></td>
    </tr>
</table>
<?
}

// 22. 게시판 하단 이미지 출력
$dir = "./data/board_config";
$tail_file = $dir."/".$board_config[bc_idx]."_tail";

if($board_config[bc_tail_file] && file_exists($tail_file)){
?>
<br/>
<img src="<?=$tail_file?>">
<?
}
?>
[board_reply.php 소스]

답글 저장 부분입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_POST[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_reply_level]){
    alert("권한이 없습니다.", "./index.php");
}

// 6. 부모글정보 가져오기
$b_idx = $_POST[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 7. 해당 글이 있는지 와 비밀글이면 비밀번호 입력여부 체크체크
if(!$data[b_idx]){
    alert("존재 하지 않는 글입니다.");
}

// 8. 댓글이 가능한지 검사
// 8-1. 부모글의 단계가 몇단계 인지 검사후 3단계면 댓글 불가
if(strlen($data[b_reply]) == 3){
    alert("더이상 댓글을 쓸수가 없습니다.");
}

// 8-2 부모글에 달린 댓글의 마지막 댓글이 몇번째인지 검사

$sql2 = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_num = '".$data[b_num]."' and b_reply like '".$data[b_reply]."%' order by b_reply desc limit 1";
$result2 = sql_query($sql2);
$data2 = mysql_fetch_array($result2);

$last_reply_char = substr($data2[b_reply], strlen($data[b_reply]), 1);
if($last_reply_char == "Z"){
    alert("더이상 댓글을 쓸수가 없습니다.");
}

// 9. 넘어온 변수 검사
if(trim($_POST[b_title]) == ""){
    alert("글제목을 입력해 주세요.");
}

if(trim($_POST[b_contents]) == ""){
    alert("글내용을 입력해 주세요.");
}

if($board_config[bc_use_secret] && $_POST[b_is_secret] == 1 && trim($_POST[b_pass]) == ""){
    alert("비밀번호를 입력해 주세요.");
}

// 10. b_num 과 b_reply 만들기
$b_num = $data[b_num];
if($last_reply_char){
    $b_reply = $data[b_reply].chr(ord($last_reply_char) + 1);
}else{
    $b_reply = $data[b_reply]."A";
}

// 11. 파일 변수 만들기
if($_FILES[b_file][tmp_name]){
    $b_filename = $_FILES[b_file][name];
    $b_filesize = $_FILES[b_file][size];
}else{
    $b_filename = "";
    $b_filesize = 0;
}

// 12. 글저장
$sql = "insert into ".$_cfg['board_table']." set bc_code = '".$bc_code."', b_num = '".$b_num."', b_reply = '".$b_reply."', m_id = '".$_SESSION[user_id]."', m_name = '".addslashes(htmlspecialchars($_POST[m_name]))."', b_title = '".addslashes(htmlspecialchars($_POST[b_title]))."', b_contents = '".addslashes(htmlspecialchars($_POST[b_contents]))."', b_is_secret = '".$_POST[b_is_secret]."', b_pass = '".$_POST[b_pass]."', b_filename = '".$b_filename."', b_filesize = '".$b_filesize."', b_regdate = now()";
sql_query($sql);

// 13. 저장된 글번호 찾기
$b_idx = mysql_insert_id();


// 14. 파일저장
$dir = "./data";
$b_file = $dir."/".$b_idx;

if($_FILES[b_file][tmp_name] && $b_filename){
    if(file_exists($b_file)){
        @unlink($b_file);
    }
    move_uploaded_file($_FILES[b_file][tmp_name], $b_file);
    chmod($b_file, 0666);

}

// 15. 글목록 페이지로 보내기
alert("글이 저장 되었습니다.", "./board_list.php?bc_code=".$bc_code."&page=".$_POST[page]);
?>
[board_reply_save.php 소스]

글수정 부분입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

// 3. 글 데이터 불러오기
$b_idx = $_GET[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 4. 글이 없으면 메세지 출력후 되돌리기
if(!$data[b_idx]){
    alert("존재하지 않는 글입니다.");
}

// 5. 본인의 글이 아니면 메세지 출력후 되돌리기
if($data[m_id] != $_SESSION[user_id] && $u_level != 9){
    alert("본인의 글이 아닙니다.");
}

// 6. 게시판 상단 이미지 출력
$dir = "./data/board_config";
$head_file = $dir."/".$board_config[bc_idx]."_head";

if($board_config[bc_head_file] && file_exists($head_file)){
?>
<br/>
<img src="<?=$head_file?>">
<?
}

// 7. 게시판 상단 내용 출력
if($board_config[bc_head]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_head]?></td>
    </tr>
</table>
<?
}

// 8. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">글수정</td>
    </tr>
</table>
<br/>
<form name="bWriteForm" method="post" enctype="multipart/form-data" action="./board_modify_save.php" style="margin:0px;">
<input type="hidden" name="bc_code" value="<?=$bc_code?>">
<input type="hidden" name="b_idx" value="<?=$b_idx?>">
<input type="hidden" name="page" value="<?=$_GET[page]?>">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">글제목</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="b_title" style="width:780px;" value="<?=$data[b_title]?>"></td>
    </tr>

    <?
    // 10. 비밀글을 사용하면 비밀글 체크 여부와 비밀번호 입력받기
    if($board_config[bc_use_secret]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀글 여부</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="checkbox" name="b_is_secret" value="1" <?if($data[b_is_secret] == 1)echo "checked";?>> 비밀글이면 체크</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="b_pass" style="width:100px;"  value="<?=$data[b_pass]?>"></td>
    </tr>
    <?
    }

    // 11. 파일 업로드를 사용하면 파일 입력
    if($board_config[bc_use_file]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">첨부파일< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;">
        <?
        // 11-1 파일이 있으면
        if($data[b_filename]){
        ?>
        <a href="./download.php?bc_code=<?=$bc_code?>&b_idx=<?=$b_idx?>"><?=$data[b_filename]?></a> <input type="checkbox" name="b_file_del" value="1"> 삭제<br>
        <?}?>
        <input type="file" name="b_file" >
        </td>
    </tr>
    <?
    }
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:200px;background-color:#CCCCCC;">글내용< /td>
        <td align="left" valign="middle" style="width:800px;height:200px;">
        <textarea name="b_contents" style="width:800px;height:200px;"><?=$data[b_contents]?></textarea>
        </td>
    </tr>
    <!-- 12. 수정하기 버튼 클릭시 입력필드 검사 함수 write_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 수정하기 " onClick="write_save();">&nbsp;&nbsp;&nbsp;<input type="button" value=" 뒤로가기 " onClick="history.back();"></td>
    </tr>
</table>
</form>
<script>
// 13.입력필드 검사함수
function write_save()
{
    // 14.form 을 f 에 지정
    var f = document.bWriteForm;

    // 15.입력폼 검사

    if(f.b_title.value == ""){
        alert("글제목을 입력해 주세요.");
        return false;
    }

    <?
    // 16. 비밀글을 사용하면 비밀글 체크 여부와 비밀번호 입력 체크
    if($board_config[bc_use_secret]){
    ?>
    if(f.b_is_secret.checked == true && f.b_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }
    <?
    }
    ?>
   
    if(f.b_contents.value == ""){
        alert("글내용을 입력해 주세요.");
        return false;
    }

    // 17.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>

<?
// 18. 게시판 하단 내용 출력
if($board_config[bc_tail]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_tail]?></td>
    </tr>
</table>
<?
}

// 19. 게시판 하단 이미지 출력
$dir = "./data/board_config";
$tail_file = $dir."/".$board_config[bc_idx]."_tail";

if($board_config[bc_tail_file] && file_exists($tail_file)){
?>
<br/>
<img src="<?=$tail_file?>">
<?
}
?>
[board_modify.php 소스]

글수정 저장 부분입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_POST[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

// 3. 글 데이터 불러오기
$b_idx = $_POST[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 4. 글이 없으면 메세지 출력후 되돌리기
if(!$data[b_idx]){
    alert("존재하지 않는 글입니다.");
}

// 5. 본인의 글이 아니면 메세지 출력후 되돌리기
if($data[m_id] != $_SESSION[user_id] && $u_level != 9){
    alert("본인의 글이 아닙니다.");
}

// 6. 넘어온 변수 검사
if(trim($_POST[b_title]) == ""){
    alert("글제목을 입력해 주세요.");
}

if(trim($_POST[b_contents]) == ""){
    alert("글내용을 입력해 주세요.");
}

if($board_config[bc_use_secret] && $_POST[b_is_secret] == 1 && trim($_POST[b_pass]) == ""){
    alert("비밀번호를 입력해 주세요.");
}

// 7. 파일삭제가 체크되어 있으면 파일 지우고 파일변수 설정
$dir = "./data";
$b_file = $dir."/".$b_idx;
if($_POST[b_file_del]){
    @unlink($b_file);
    $b_filename = "";
    $b_filesize = 0;
    $file_sql = ", b_filename = '".$b_filename."', b_filesize = '".$b_filesize."'";
}

// 8. 파일 변수 만들기
if($_FILES[b_file][tmp_name]){
    $b_filename = $_FILES[b_file][name];
    $b_filesize = $_FILES[b_file][size];
    $file_sql = ", b_filename = '".$b_filename."', b_filesize = '".$b_filesize."'";
}

// 7. 글저장
$sql = "update ".$_cfg['board_table']." set b_title = '".addslashes(htmlspecialchars($_POST[b_title]))."', b_contents = '".addslashes(htmlspecialchars($_POST[b_contents]))."', b_is_secret = '".$_POST[b_is_secret]."', b_pass = '".$_POST[b_pass]."' ".$file_sql." where b_idx = '".$b_idx."'";
sql_query($sql);


// 10. 파일저장
$dir = "./data";
$b_file = $dir."/".$b_idx;

if($_FILES[b_file][tmp_name] && $b_filename){
    if(file_exists($b_file)){
        @unlink($b_file);
    }
    move_uploaded_file($_FILES[b_file][tmp_name], $b_file);
    chmod($b_file, 0666);

}

// 12. 글목록 페이지로 보내기
alert("글이 저장 되었습니다.", "./board_view.php?bc_code=".$bc_code."&b_idx=".$b_idx."&page=".$_POST[page]);
?>
[board_modify_save.php 소스]

여기서 파일 처리하는 부분은 어드민에서 파일처리하는 부분(http://handsome.pe.kr/76)과 다르게 했습니다.

파일 삭제시나 또는 새로운 파일이 올라왔을때 $file_sql 이라는 sql 문자열을 만들어 쿼리시에 추가하는 방법으로 하였습니다.


글삭제 부분입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

// 3. 글 데이터 불러오기
$b_idx = $_GET[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 4. 글이 없으면 메세지 출력후 되돌리기
if(!$data[b_idx]){
    alert("존재하지 않는 글입니다.");
}

// 5. 본인의 글이 아니면 메세지 출력후 되돌리기
if($data[m_id] != $_SESSION[user_id] && $u_level != 9){
    alert("본인의 글이 아닙니다.");
}

// 6. 파일 과 댓글 삭제하기
$file_sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_num = '".$data[b_num]."' and b_reply like '".$data[b_reply]."%'";
$file_result = sql_query($file_sql);

while($file_data = mysql_fetch_array($file_result)){
    // 6-1 파일 삭제
    $dir = "./data";
    $b_file = $dir."/".$file_data[b_idx];
    @unlink($b_file);

    // 6-2 댓글 삭제
    $comment_delete = "delete from ".$_cfg['comment_table']." where b_idx = '".$file_data[b_idx]."'";
    sql_query($comment_delete);
}

// 7. 글 삭제하기
$sql_delete = "delete from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_num = '".$data[b_num]."' and b_reply like '".$data[b_reply]."%'";
sql_query($sql_delete);


// 8. 글목록 페이지로 보내기
alert("글이 삭제 되었습니다.", "./board_list.php?bc_code=".$bc_code."&page=".$_GET[page]);
?>
[board_delete.php 소스]

글 삭제시 해당 글의 하위 답글과 댓글들도 모두 삭제 하게 제작이 되었습니다.

그리고 파일도 모두 삭제하게 됩니다.

글을 삭제전에 파일과 댓글들을 앟ㄹ아내야 하기때문에 글삭제전 파일 과댓글을 삭제 하였습니다.

그럼 다음 시간에는 쇼핑몰의 기본이 되는 포인트 몰에 대해서 배워보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:28
안녕하세요.

새해 복많이 받으시길 바라며 오늘도 강좌를 이어가겠습니다.

이번 강좌는 게시판의 글보기 부분입니다.

먼저 글보기 전 비밀번호를 체크 하는 부분입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_read_level]){
    alert("권한이 없습니다.", "./index.php");
}

// 6. 게시판 상단 이미지 출력
$dir = "./data/board_config";
$head_file = $dir."/".$board_config[bc_idx]."_head";

if($board_config[bc_head_file] && file_exists($head_file)){
?>
<br/>
<img src="<?=$head_file?>">
<?
}

// 7. 게시판 상단 내용 출력
if($board_config[bc_head]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_head]?></td>
    </tr>
</table>
<?
}

// 8. 페이징 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}

// 9. 글정보 가져오기
$b_idx = $_GET[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 10. 해당 글이 있는지체크
if(!$data[b_idx]){
    alert("존재 하지 않는 글입니다.");
}

// 11.비밀번호 입력 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">글보기 비밀번호 확인</td>
    </tr>
</table>
<br/>
<form name="passForm" method="post" action="./board_password_chk.php" style="margin:0px;">
<input type="hidden" name="bc_code" value="<?=$bc_code?>">
<input type="hidden" name="b_idx" value="<?=$b_idx?>">
<input type="hidden" name="page" value="<?=$_GET[page]?>">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="b_pass" style="width:380px;"></td>
    </tr>
    <!-- 12. 글보기 버튼 클릭시 입력필드 검사 함수 pass_chk 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 글보기 " onClick="pass_chk();">&nbsp;<input type="button" value=" 취소 " onClick="history.back();"></td>
    </tr>
</table>
</form>
<script>
// 13.입력필드 검사함수
function pass_chk()
{
    // 14.form 을 f 에 지정
    var f = document.passForm;

    if(f.b_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }

    // 15.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
<?
// 16. 게시판 하단 내용 출력
if($board_config[bc_tail]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_tail]?></td>
    </tr>
</table>
<?
}

// 17. 게시판 하단 이미지 출력
$dir = "./data/board_config";
$tail_file = $dir."/".$board_config[bc_idx]."_tail";

if($board_config[bc_tail_file] && file_exists($tail_file)){
?>
<br/>
<img src="<?=$tail_file?>">
<?
}
?>
[board_password.php 소스]

입력한 비밀번호를 체크하는 파일입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_POST[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_read_level]){
    alert("권한이 없습니다.", "./index.php");
}

// 6. 페이징 변수 설정
if($_POST[page] && $_POST[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_POST[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}

// 7. 글정보 가져오기
$b_idx = $_POST[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 8. 해당 글이 있는지체크
if(!$data[b_idx]){
    alert("존재 하지 않는 글입니다.");
}

// 9. 비밀번호가 맞는지 체크
if($data[b_pass] == $_POST[b_pass]){
    // 10. 맞으면 해당글의 비밀번호 체크 여부를 세션에 저장하고 이동
    $_SESSION["b_pass_".$b_idx] = true;
    goto_url("./board_view.php?bc_code=".$bc_code."&b_idx=".$b_idx."&page=".$_POST[page]);
}else{
    alert("비밀번호가 다릅니다.");
}

?>
[board_password_chk.php 소스]

10번에서 비밀번호가 맞으면 세션에 저장을 하는데 세션의 이름을 b_pass_글번호 로 저장을 합니다.

글보기 부분 파일입니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_read_level]){
    alert("권한이 없습니다.", "./index.php");
}

// 6. 게시판 상단 이미지 출력
$dir = "./data/board_config";
$head_file = $dir."/".$board_config[bc_idx]."_head";

if($board_config[bc_head_file] && file_exists($head_file)){
?>
<br/>
<img src="<?=$head_file?>">
<?
}

// 7. 게시판 상단 내용 출력
if($board_config[bc_head]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_head]?></td>
    </tr>
</table>
<?
}

// 8. 페이징 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}

// 9. 글정보 가져오기
$b_idx = $_GET[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 10. 해당 글이 있는지 와 비밀글이면 비밀번호 입력여부 체크체크
if(!$data[b_idx]){
    alert("존재 하지 않는 글입니다.");
}

if($data[b_is_secret] && !$_SESSION["b_pass_".$b_idx] && $_SESSION[user_id] != $data[m_id] && $u_level != 9){
    alert("비밀번호를 입력하여 주세요.");
}

// 11.글내용 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">글보기</td>
    </tr>
</table>
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">글제목</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><?=$data[b_title]?></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">작성자명< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><?=$data[m_name]?></td>
    </tr>
    <?

    // 12. 파일 업로드를 사용하면 파일 입력
    if($board_config[bc_use_file] && $data[b_filename]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">첨부파일< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><a href="./download.php?bc_code=<?=$bc_code?>&b_idx=<?=$b_idx?>"><?=$data[b_filename]?></a></td>
    </tr>
    <?
    }
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:200px;background-color:#CCCCCC;">글내용< /td>
        <td align="left" valign="middle" style="width:800px;height:200px;"><?=nl2Br($data[b_contents])?></td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><input type="button" value=" 목록보기 " onClick="location.href='./board_list.php?bc_code=<?=$bc_code?>&page=<?=$page?>';"></td>
    <?// 13. 권한 체크 후 답글쓰기 보여주기?>
    <?if($board_config[bc_use_reply ] && $u_level >= $board_config[bc_reply_level]){?>
        <td align="center" valign="middle"><input type="button" value=" 답글쓰기 " onClick="location.href='./board_reply.php?bc_code=<?=$bc_code?>&b_idx=<?=$b_idx?>&page=<?=$page?>';"></td>
    <?}?>
    <?// 13. 권한 체크 후 글수정 보여주기?>
    <?if($_SESSION[user_id] == $data[m_id] || $u_level == 9){?>
        <td align="center" valign="middle"><input type="button" value=" 글수정 " onClick="location.href='./board_modify.php?bc_code=<?=$bc_code?>&b_idx=<?=$b_idx?>&page=<?=$page?>';"></td>
    <?}?>
    <?// 13. 권한 체크 후 글삭제 버튼 보여주기?>
    <?if($_SESSION[user_id] == $data[m_id] || $u_level == 9){?>
        <td align="center" valign="middle"><input type="button" value=" 글삭제 " onClick="location.href='./board_delete.php?bc_code=<?=$bc_code?>&b_idx=<?=$b_idx?>&page=<?=$page?>';"></td>
    <?}?>
    </tr>
</table>

<?
// 13. 댓글 부분 권한 체크 및 출력 결정
if($board_config[bc_use_comment]){

    // 14. 댓글 권한 체크 후 댓글쓰기 부분 출력
    if($u_level >= $board_config[bc_comment_level]){
    ?>
    <br/>
    <table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
        <tr>
            <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">댓글작성</td>
        </tr>
    </table>
    <br/>
    <form name="bWriteForm" method="post" enctype="multipart/form-data" action="./board_comment_save.php" style="margin:0px;">
    <input type="hidden" name="bc_code" value="<?=$bc_code?>">
    <input type="hidden" name="b_idx" value="<?=$b_idx?>">
    <input type="hidden" name="page" value="<?=$page?>">
    <table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
        <tr>
            <td align="center" valign="middle" width="100" style="height:30px;background-color:#CCCCCC;">이름</td>
            <td align="center" valign="middle" width="800" style="height:30px;background-color:#CCCCCC;">댓글내용</td>
            <td align="center" valign="middle" width="100" style="height:30px;background-color:#CCCCCC;">&nbsp;</td>
        </tr>
        <tr>
            <td align="center" valign="middle" width="100" style="height:30px;background-color:#FFFFFF;">
            <input typr="text" name="m_name" <?if($_SESSION[user_idx]){ echo " value='".$_SESSION[user_name]."' readOnly";}?>  style="width:90px;">
            </td>
            <td align="center" valign="middle" width="800" style="height:30px;background-color:#FFFFFF;"><input type="text" name="co_contents" style="width:780px;"></td>
            <td align="center" valign="middle" width="100" style="height:30px;background-color:#FFFFFF;"><input type="button" value=" 댓글쓰기 " onClick="write_save();"></td>
        </tr>
    </table>
    <script>
    function write_save()
    {
        var f = document.bWriteForm;

        if(f.m_name.value == ""){
            alert("이름을 입력해 주세요.");
            return false;
        }

        if(f.co_contents.value == ""){
            alert("댓글내용을 입력해 주세요.");
            return false;
        }

        f.submit();
    }
    </script>
    </form>
    <?
    }


    // 15. 댓글 목록 출력
    ?>
    <br/>
    <table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
        <tr>
            <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">댓글목록</td>
        </tr>
    </table>
    <br/>
    <table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
        <tr>
            <td align="center" valign="middle" width="5%" style="height:30px;background-color:#CCCCCC;">번호</td>
            <td align="center" valign="middle" width="60%" style="height:30px;background-color:#CCCCCC;">댓글내용</td>
            <td align="center" valign="middle" width="15%" style="height:30px;background-color:#CCCCCC;">글쓴이</td>
            <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">작성일</td>
        </tr>
    <?

    // 16. 전체 댓글 갯수 알아내기
    $sql = "select count(*) as cnt from ".$_cfg['comment_table']." where b_idx = '".$b_idx."' ";
    $total_count = sql_total($sql);


    // 17. 댓글목록 구하기
    $query = "select * from ".$_cfg['comment_table']." where b_idx = '".$b_idx."' order by co_idx desc ";
    $result = mysql_query($query, $connect);

    // 18.데이터 갯수 체크를 위한 변수 설정
    $i = 0;

    // 19.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
    while($data_commnent = mysql_fetch_array($result)){


    ?>
        <tr>
            <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=($total_count - $i )?></td>
            <td align="left" valign="middle" style="height:30px;background-color:#FFFFFF;">&nbsp;<?=$data_commnent[co_contents]?></td>
            <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data_commnent[m_name]?></td>
            <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=substr($data_commnent[co_regdate],0,10)?></td>
        </tr>
    <?
        // 21.데이터 갯수 체크를 위한 변수를 1 증가시킴
        $i++;
    }

    // 22. 댓글데이터가 하나도 없으면
    if($i == 0){
    ?>
        <tr>
            <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">댓글이 하나도 없습니다.</td>
        </tr>
    <?
    }
}
// 댓글 목록 권한 체크 및 출력 결정 끝


// 20. 게시판 하단 내용 출력
if($board_config[bc_tail]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_tail]?></td>
    </tr>
</table>
<?
}

// 21. 게시판 하단 이미지 출력
$dir = "./data/board_config";
$tail_file = $dir."/".$board_config[bc_idx]."_tail";

if($board_config[bc_tail_file] && file_exists($tail_file)){
?>
<br/>
<img src="<?=$tail_file?>">
<?
}
?>
[board_view.php 소스]

10번을 보면 비밀번호 체크후 저장된 세션을 체크해서 비밀버호 체크가 이루어지지 않았으면 경고 후 되돌립니다.

13번 부분은 댓글을 사용하는지 여부를 체크 한 후 댓글 목록과 댓글쓰기를 출력합니다.

댓글 저장부분입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_POST[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_comment_level]){
    alert("권한이 없습니다.");
}

// 6. 해당 글이 있는지체크
$b_idx = $_POST[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);
if(!$data[b_idx]){
    alert("존재 하지 않는 글입니다.");
}

// 7. 넘어온 변수 검사

if(trim($_POST[m_name]) == ""){
    alert("이름을 입력해 주세요.");
}

if(trim($_POST[co_contents]) == ""){
    alert("댓글내용을 입력해 주세요.");
}


// 8. 글저장
$sql = "insert into ".$_cfg['comment_table']." set b_idx = '".$b_idx."', m_id = '".$_SESSION[user_id]."', m_name = '".addslashes(htmlspecialchars($_POST[m_name]))."', co_contents = '".addslashes(htmlspecialchars($_POST[co_contents]))."', co_regdate = now()";
sql_query($sql);


// 9. 글보기 페이지로 보내기
alert("댓글이 저장 되었습니다.", "./board_view.php?bc_code=".$bc_code."&b_idx=".$b_idx."&page=".$_POST[page]);
?>
[board_comment_save.php 소스]

다운로드 파일입니다.
<?
// 1. 공통 인클루드
include "./inc/config.php";

// 2. 출력 헤더 만들기
$alert_header = "
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=euc-kr'>
<title></title>
</head>
";

// 3. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    echo $alert_header;
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    echo $alert_header;
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_read_level]){
    echo $alert_header;
    alert("권한이 없습니다.", "./index.php");
}

// 6. 글정보 가져오기
$b_idx = $_GET[b_idx];
$sql = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' and b_idx = '".$b_idx."'";
$data = sql_fetch($sql);

// 7. 해당 글이 있는지 와 비밀글이면 비밀번호 입력여부 체크체크
if(!$data[b_idx]){
    echo $alert_header;
    alert("존재 하지 않는 글입니다.");
}

if($data[b_is_secret] && !$_SESSION["b_pass_".$b_idx] && $_SESSION[user_id] != $data[m_id] && $u_level != 9){
    echo $alert_header;
    alert("비밀번호를 입력하여 주세요.");
}

// 8. 파일이 등록되어 있는지 검사
if(!$data[b_filename]){
    echo $alert_header;
    alert("파일이 존재 하지 않습니다.");
}

// 9. 파일 이름과 실제 파일
$dir = "./data";
$file_path = $dir."/".$b_idx;
$original = $data[b_filename];

// 10.파일이 있으면
if (file_exists($file_path)) {

    // 11. 다운로드 헤더 만들기

    if(eregi("(MSIE 5.0|MSIE 5.1|MSIE 5.5|MSIE 6.0)", $HTTP_USER_AGENT))
    {
      if(strstr($HTTP_USER_AGENT, "MSIE 5.5"))
      {
        header("Content-Type: doesn/matter");
        header("Content-disposition: filename=$original");
        header("Content-Transfer-Encoding: binary");
        header("Pragma: no-cache");
        header("Expires: 0");
      }

      if(strstr($HTTP_USER_AGENT, "MSIE 5.0"))
      {
        Header("Content-type: file/unknown");
        header("Content-Disposition: attachment; filename=$original");
        Header("Content-Description: PHP3 Generated Data");
        header("Pragma: no-cache");
        header("Expires: 0");
      }

      if(strstr($HTTP_USER_AGENT, "MSIE 5.1"))
      {
        Header("Content-type: file/unknown");
        header("Content-Disposition: attachment; filename=$original");
        Header("Content-Description: PHP3 Generated Data");
        header("Pragma: no-cache");
        header("Expires: 0");
      }
     
      if(strstr($HTTP_USER_AGENT, "MSIE 6.0"))
      {
        Header("Content-type: application/x-msdownload");
        Header("Content-Length: ".(string)(filesize("$file_path")));
        Header("Content-Disposition: attachment; filename=$original");
        Header("Content-Transfer-Encoding: binary");
        Header("Pragma: no-cache");
        Header("Expires: 0");
       
      }


    } else {
      Header("Content-type: doesn/matter");  
      Header("Content-Length: ".(string)(filesize("$file_path")));
      Header("Content-Disposition: attachment; filename=$original");
      Header("Content-Description: PHP3 Generated Data");
      Header("Pragma: no-cache");
      Header("Expires: 0");
    }
    flush();

    // 12. 파일을 읽어 내보내기
    if (is_file($file_path)) {
        $fp = fopen($file_path, "rb");

        while(!feof($fp)) {
            echo fread($fp, 100*1024);
            flush();
        }
        fclose ($fp);
        flush();
    }
   

} else {
    echo $alert_header;
    alert("파일이 존재 하지 않습니다.");
}
?>
[download.php 소스]

글보기 파일에서 업로드한 파일이 있으면 다운로드 파일로 링크가 됩니다.

파일을 다운로드 시킬때는 파일이 html 이 아니라 다운로드라는 부분을 보내게 됩니다.

이것을 헤더라고 하는데요 header() 함수를 이용해 파일의 헤더를 만듭니다.

헤더는 브라우저 버전마다 다 다른데요. 일반적으로 Content-type, 파일길이, 파일명, 출력방식(다운로드니 binary 등의 것들입니다.), 캐쉬여부, 등을 출력해 줍니다.

또 여기 사용된 flush() 함수는 php에서 만든 내용을 끝까지 기다리지 말고 바로 출력하란느 내용입니다.

파일의 크기가 클때는 다 출력이 되지않기 때문에 그때그때 파일을 읽어서 내보내는 즉시 출력해 보리는 것입니다.

간단하게 설명을 드렸습니다.

이쯤되면 각 함수들에 대해서는 php 매뉴얼을 통해서도 알아볼수 있어야 합니다.

질문은 댓글을 이용해 남겨주시면 되구요.

다음 시간에는 답글달기와 글삭제를 배우도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:27
오늘 이 시간에는 게시판 목록보기와 게시판에 글쓰는 부분을 만들어 보도록 하겠습니다.

이 부분도 관계형 게시판때 배웠던 내용이 많이 포함되어 있습니다.

우선 게시판 목록 파일입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_list_level]){
    alert("권한이 없습니다.", "./index.php");
}

// 6. 게시판 상단 이미지 출력
$dir = "./data/board_config";
$head_file = $dir."/".$board_config[bc_idx]."_head";

if($board_config[bc_head_file] && file_exists($head_file)){
?>
<br/>
<img src="<?=$head_file?>">
<?
}

// 7. 게시판 상단 내용 출력
if($board_config[bc_head]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_head]?></td>
    </tr>
</table>
<?
}

// 8.게시판 목록 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">글목록</td>
    </tr>
</table>
<br/>
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="5%" style="height:30px;background-color:#CCCCCC;">번호</td>
        <td align="center" valign="middle" width="60%" style="height:30px;background-color:#CCCCCC;">글제목</td>
        <td align="center" valign="middle" width="15%" style="height:30px;background-color:#CCCCCC;">글쓴이</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">작성일</td>
    </tr>
<?

// 9. 페이지 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}
// 한 페이지에 보일 글 수
$page_row = 10;
// 한줄에 보여질 페이지 수
$page_scale = 10;
// 페이징을 출력할 변수 초기화
$paging_str = "";

// 10. 전체 글 갯수 알아내기
$sql = "select count(*) as cnt from ".$_cfg['board_table']." where bc_code = '".$bc_code."' ";
$total_count = sql_total($sql);

// 11. 페이지 출력 내용 만들기
$paging_str = paging($page, $page_row, $page_scale, $total_count, "bc_code=".$bc_code);

// 12. 시작 열을 구함
$from_record = ($page - 1) * $page_row;

// 13. 글목록 구하기
$query = "select * from ".$_cfg['board_table']." where bc_code = '".$bc_code."' order by b_num desc, b_reply asc limit ".$from_record.", ".$page_row;
$result = mysql_query($query, $connect);

// 14.데이터 갯수 체크를 위한 변수 설정
$i = 0;

// 15.데이터가 있을 동안 반복해서 값을 한 줄씩 읽기
while($data = mysql_fetch_array($result)){

    // 16. 댓글 앞에 붙을 기호 만들기
    $reply_str = "";
    $reply_depth = strlen($data[b_reply]);
    if ($reply_depth > 0){
        for ($k=0; $k<$reply_depth; $k++){
            $reply_str .= '&nbsp;&nbsp;&nbsp;';
        }
        $reply_str .= "┗";
    }

    // 17. 게시글 링크 및 비밀글표시 만들기
    $mark_secret = "";
    if($data[b_is_secret]){
        $mark_secret = "[비밀글] ";
    }
    // 게시글을 볼 권한 여부에 따라서
    if($u_level >= $board_config[bc_read_level]){
        // 비밀글 여부 따지기
        if($data[b_is_secret]){
            // 글쓴이와 관리자 여부 따지기
            if($_SESSION[user_id] == $data[m_id] || $_SESSION[user_id] == 9 || ($_SESSION[user_id] == $board_config[bc_admin] && $board_config[bc_admin])){
                $article_link = "./board_view.php?bc_code=".$bc_code."&b_idx=".$data[b_idx]."&page=".$page;
            }else{
                $article_link = "./board_password.php?bc_code=".$bc_code."&b_idx=".$data[b_idx]."&page=".$page;
            }
        }else{
            $article_link = "./board_view.php?bc_code=".$bc_code."&b_idx=".$data[b_idx]."&page=".$page;
        }
    }else{
        $article_link = "javascript:alert('글을 읽을 권한이 없습니다.');";
    }


?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=($total_count - (($page - 1) * $page_row) - $i )?></td>
        <td align="left" valign="middle" style="height:30px;background-color:#FFFFFF;">&nbsp;<?=$reply_str?><a href="<?=$article_link?>"><?=$mark_secret?><?=$data[b_title]?></a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[m_name]?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=substr($data[b_regdate],0,10)?></td>
    </tr>
<?
    // 17.데이터 갯수 체크를 위한 변수를 1 증가시킴
    $i++;
}

// 18.데이터가 하나도 없으면
if($i == 0){
?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">게시글이 하나도 없습니다.</td>
    </tr>
<?
}
?>
</table>
<br/>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><?=$paging_str?></td>
    </tr>
    <?// 19. 권한 체크 후 글쓰기 버튼 보여주기?>
    <?if($u_level >= $board_config[bc_write_level]){?>
    <tr>
        <td align="center" valign="middle"><input type="button" value=" 글쓰기 " onClick="location.href='./board_write.php?bc_code=<?=$bc_code?>';"></td>
    </tr>
    <?}?>
</table>
<?
// 20. 게시판 하단 내용 출력
if($board_config[bc_tail]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_tail]?></td>
    </tr>
</table>
<?
}

// 21. 게시판 하단 이미지 출력
$dir = "./data/board_config";
$tail_file = $dir."/".$board_config[bc_idx]."_tail";

if($board_config[bc_tail_file] && file_exists($tail_file)){
?>
<br/>
<img src="<?=$tail_file?>">
<?
}
?>
[board_list.php 소스]

2번에서 게시판 코드 부분을 검사합니다.

3번에서 게시판 코드로 게시판 설정을 불러 $board_config 란 변수에 대입합니다.

4번에서 게시판이 존재하는 지 검사합니다.

5번에서 목록을볼수 있는 권한이 있는지 검사합니다.

6.7번에서 상단 이미지와내용을 출력합니다.

11번에서 페이징 부분을 만들때 게시판 코드를 추가 코드로 함수에 넣어줍니다.

17번에서 비밀글 표시를 만들고 권한 및 관리자 여부를 따져서 글보기 링크를 만들어 줍니다.
권한이 없을 경우는 권한이 없다는 경고창을 띄워주고 관리자나 본인의 글이 아니면 비밀번호를 입력받는 부분으로 보냅니다.

19번에서 글쓰기 권한을 체크해서 쓰기권한이 있으면 글쓰기 버튼을 출력합니다.

20, 21번에서 하단 내용과 이미지를 출력합니다.

[실행화면]


글쓰기 부분입니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_GET[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_write_level]){
    alert("권한이 없습니다.");
}

// 6. 게시판 상단 이미지 출력
$dir = "./data/board_config";
$head_file = $dir."/".$board_config[bc_idx]."_head";

if($board_config[bc_head_file] && file_exists($head_file)){
?>
<br/>
<img src="<?=$head_file?>">
<?
}

// 7. 게시판 상단 내용 출력
if($board_config[bc_head]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_head]?></td>
    </tr>
</table>
<?
}

// 8. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">글쓰기</td>
    </tr>
</table>
<br/>
<form name="bWriteForm" method="post" enctype="multipart/form-data" action="./board_write_save.php" style="margin:0px;">
<input type="hidden" name="bc_code" value="<?=$bc_code?>">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">글제목</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="b_title" style="width:780px;"></td>
    </tr>
    <?
    // 9.로그인 한 상태가 아니면 이름을 쓰고 로그인 한 상태면 hidden 으로 넘김
    if(!$_SESSION[user_idx]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">작성자명< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_name" style="width:780px;"></td>
    </tr>
    <?
    }else{
    ?>
    <input type="hidden" name="m_name" value="<?=$_SESSION[user_name]?>">
    <?
    }

    // 10. 비밀글을 사용하면 비밀글 체크 여부와 비밀번호 입력받기
    if($board_config[bc_use_secret]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀글 여부</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="checkbox" name="b_is_secret" value="1"> 비밀글이면 체크</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="b_pass" style="width:100px;"></td>
    </tr>
    <?
    }

    // 11. 파일 업로드를 사용하면 파일 입력
    if($board_config[bc_use_file]){
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">첨부파일< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="file" name="b_file" ></td>
    </tr>
    <?
    }
    ?>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:200px;background-color:#CCCCCC;">글내용< /td>
        <td align="left" valign="middle" style="width:800px;height:200px;">
        <textarea name="b_contents" style="width:800px;height:200px;"></textarea>
        </td>
    </tr>
    <!-- 12. 글쓰기 버튼 클릭시 입력필드 검사 함수 write_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 글쓰기 " onClick="write_save();">&nbsp;&nbsp;&nbsp;<input type="button" value=" 뒤로가기 " onClick="history.back();"></td>
    </tr>
</table>
</form>
<script>
// 13.입력필드 검사함수
function write_save()
{
    // 14.form 을 f 에 지정
    var f = document.bWriteForm;

    // 15.입력폼 검사

    if(f.b_title.value == ""){
        alert("글제목을 입력해 주세요.");
        return false;
    }

    <?
    // 16. 비밀글을 사용하면 비밀글 체크 여부와 비밀번호 입력 체크
    if($board_config[bc_use_secret]){
    ?>
    if(f.b_is_secret.checked == true && f.b_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }
    <?
    }
    ?>
   
    if(f.b_contents.value == ""){
        alert("글내용을 입력해 주세요.");
        return false;
    }

    // 17.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>

<?
// 18. 게시판 하단 내용 출력
if($board_config[bc_tail]){
?>
<br/>
<table border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td align="left" valign="middle" style="font-zise:15px;"><?=$board_config[bc_tail]?></td>
    </tr>
</table>
<?
}

// 19. 게시판 하단 이미지 출력
$dir = "./data/board_config";
$tail_file = $dir."/".$board_config[bc_idx]."_tail";

if($board_config[bc_tail_file] && file_exists($tail_file)){
?>
<br/>
<img src="<?=$tail_file?>">
<?
}
?>
[board_write.php 소스]

특별한 부분만 설명 드리겠습니다.

bc_code 값을 hidden 으로 넘겨줍니다.

9번에서 로그인한 상태면 세션에 저장된 이름을 hidden 으로 넘겨주고 로그인하지 않은 상태면 이름을 입력 받습니다.

10번. 비밀글 사용여부에 따라 비밀글 여부 체크박스와 비밀번호 입력부분을 출력합니다.

11번 파일 업로드 사용여부에 따라 파일 입력 부분을 출력합니다.

16번 입력필드 검사시 비밀글 사용여부에 따라서 비밀글 체크여부에 따른 비밀번호 입력을 체크합니다.

[출력화면]

글저장 소스
<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 게시판 코드 검사
$bc_code = $_POST[bc_code];
if($bc_code){
    // 3. 게시판 코드가 있으면 게시판 설정 불러오기
    $b_config_sql = "select * from ".$_cfg['config_table']." where bc_code = '".$bc_code."'";
    $board_config = sql_fetch($b_config_sql);
}else{
    alert("게시판 코드가 없습니다.");
}

// 4. 존재하는 게시판인지 확인
if(!$board_config[bc_idx]){
    alert("존재 하지 않는 게시판입니다.");
}

// 5. 게시판 권한 체크
if($_SESSION[user_level]){
    $u_level = $_SESSION[user_level];
}else{
    $u_level = 0;
}

if($u_level < $board_config[bc_write_level]){
    alert("권한이 없습니다.");
}

// 6. 넘어온 변수 검사
if(trim($_POST[b_title]) == ""){
    alert("글제목을 입력해 주세요.");
}

if(trim($_POST[b_contents]) == ""){
    alert("글내용을 입력해 주세요.");
}

if($board_config[bc_use_secret] && $_POST[b_is_secret] == 1 && trim($_POST[b_pass]) == ""){
    alert("비밀번호를 입력해 주세요.");
}

// 7. 파일 변수 만들기
if($_FILES[b_file][tmp_name]){
    $b_filename = $_FILES[b_file][name];
    $b_filesize = $_FILES[b_file][size];

}else{
    $b_filename = "";
    $b_filesize = 0;
}

// 8. 글저장
$sql = "insert into ".$_cfg['board_table']." set bc_code = '".$bc_code."', b_reply = '', m_id = '".$_SESSION[user_id]."', m_name = '".addslashes(htmlspecialchars($_POST[m_name]))."', b_title = '".addslashes(htmlspecialchars($_POST[b_title]))."', b_contents = '".addslashes(htmlspecialchars($_POST[b_contents]))."', b_is_secret = '".$_POST[b_is_secret]."', b_filename = '".$b_filename."', b_filesize = '".$b_filesize."', b_regdate = now()";
sql_query($sql);

// 9. 저장된 글번호 찾기
$b_idx = mysql_insert_id();


// 10. 파일저장
$dir = "./data";
$b_file = $dir."/".$b_idx;

if($_FILES[b_file][tmp_name] && $b_filename){
    if(file_exists($b_file)){
        @unlink($b_file);
    }
    move_uploaded_file($_FILES[b_file][tmp_name], $b_file);
    chmod($b_file, 0666);

}

// 11. 글번호 저장
$sql = "update ".$_cfg['board_table']." set b_num = '".$b_idx."' where b_idx = '".$b_idx."'";
sql_query($sql);

// 12. 글목록 페이지로 보내기
alert("글이 저장 되었습니다.", "./board_list.php?bc_code=".$bc_code);
?>
[board_write_save.php]

7번에서 원래 파일명과 파일크기를 구합니다.

10번에서 글 저장후 파일을 저장합니다.

11번에서 글번호를 저장합니다.

지난번 관계형 게시판을 배우셨으니 크게 어렵지 않으리라 생각합니다.

그럼 다음시간에는 글보기 부분(직접보기와 비밀글을 입력후 보기)과 첨부파일 다운로드를 배워보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:27
오늘은 사용자 페이지의 로그인, 로그아웃, 회원정보 수정에 대해서 배워보겠습니다.

이 세가지 기능 모두 지난시간과 마찬가지로 관계형 게시판 만들기에서 배웠던 부분과 동일합니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    alert("로그인 하신 상태입니다.");
}
// 3. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">회원 로그인</td>
    </tr>
</table>
<br/>
<form name="loginForm" method="post" action="./login_chk.php" style="margin:0px;">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">아이디</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_id" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass" style="width:380px;"></td>
    </tr>
    <!-- 4. 로그인 버튼 클릭시 입력필드 검사 함수 login_chk 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 로그인 " onClick="login_chk();"></td>
    </tr>
</table>
</form>
<script>
// 5.입력필드 검사함수
function login_chk()
{
    // 6.form 을 f 에 지정
    var f = document.loginForm;

    // 7.입력폼 검사
    if(f.m_id.value == ""){
        // 8.값이 없으면 경고창으로 메세지 출력 후 함수 종료
        alert("아이디를 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }

    // 9.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[login.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    alert("로그인 하신 상태입니다.");
}

// 3. 넘어온 변수 검사
if(trim($_POST[m_id]) == ""){
    alert("아이디를 입력해 주세요.");
}

if($_POST[m_pass] == ""){
    alert("비밀번호를 입력해 주세요.");
}

// 4. 같은 아이디가 있는지 검사
$chk_sql = "select * from bd__member where m_id = '".trim($_POST[m_id])."'";
$chk_result = sql_query($chk_sql);
$chk_data = mysql_fetch_array($chk_result);

// 5. 아이디가 존재 하는 경우
if($chk_data[m_idx]){

    // 6. 입력된 비밀번호와 저장된 비밀번호가 같은지 비교해서
    if($_POST[m_pass] == $chk_data[m_pass]){
        // 7. 비밀번호가 같으면 세션값 부여 후 이동
        $_SESSION[user_idx] = $chk_data[m_idx];
        $_SESSION[user_id] = $chk_data[m_id];
        $_SESSION[user_name] = $chk_data[m_name];
        $_SESSION[user_level] = $chk_data[m_level];
       
        alert("환영합니다.", "./index.php");
    }else{
        // 8. 비밀번호가 다르면
        alert("비밀번호가 다릅니다.");
    }
}else{
    // 9. 아이디가 존재하지 않으면
    alert("존재하지 않는 회원입니다.");
}
?>

[login_chk.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 모든 세션값을 빈값으로
$_SESSION[user_idx] = "";
$_SESSION[user_id] = "";
$_SESSION[user_name] = "";
$_SESSION[user_level] = "";

alert("로그아웃이 되었습니다.", "./login.php");
?>
[logout.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 안한 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인 하셔야 합니다.", "./login.php");
}

// 3. 회원 설정 데이터 불러오기
$sql = "select * from bd__member where m_idx = '".$_SESSION[user_idx]."'";
$data = sql_fetch($sql);

// 4. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">회원 정보 수정</td>
    </tr>
</table>
<br/>
<form name="modifyForm" method="post" action="./member_modify_save.php" style="margin:0px;">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">회원이름< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_name" style="width:780px;" value="<?=$data[m_name]?>"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호 확인</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass2" style="width:380px;"></td>
    </tr>
    <!-- 5. 정보수정 버튼 클릭시 입력필드 검사 함수 member_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 정보수정 " onClick="member_save();"></td>
    </tr>
</table>
</form>
<script>
// 6.입력필드 검사함수
function member_save()
{
    // 7.form 을 f 에 지정
    var f = document.modifyForm;

    // 8.입력폼 검사

    if(f.m_name.value == ""){
        alert("회원이름을 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value != f.m_pass2.value){
        // 9.비밀번호와 확인이 서로 다르면 경고창으로 메세지 출력 후 함수 종료
        alert("비밀번호를 확인해 주세요.");
        return false;
    }

    // 10.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[member_modify.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인 안한 회원은 로그인 페이지로 보내기
if(!$_SESSION[user_id]){
    alert("로그인 하셔야 합니다.", "./login.php");
}

// 3. 넘어온 변수 검사
if($_POST[m_name] == ""){
    alert("이름을 입력해 주세요.");
}

if($_POST[m_pass] == ""){
    alert("비밀번호를 입력해 주세요.");
}

if($_POST[m_pass] != $_POST[m_pass2]){
    alert("비밀번호를 확인해 주세요.");
}


// 4. 회원정보 적기
$sql = "update bd__member set m_name = '".$_POST[m_name]."', m_pass = '".$_POST[m_pass]."' where m_id = '".$_SESSION[user_id]."'";
sql_query($sql);

// 5. 첫 페이지로 보내기
alert("회원정보가 수정 되었습니다.", "index.php");
?>
[member_modify_save.php 소스]

그럼 다음 시간에는 게시판에 글쓰기와 게시판 목록보기를 배워보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:26
오늘은 사용자페이지에서 사용하는 공통파일과 사용자들이 회원가입을 하는 페이지를 배워보도록 하겠습니다.

[사용자 페이지 공통파일]
<?
include "./inc/config.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title></title>
</head>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" colspan="3" style="font-zise:15px;font-weight:bold;">
        PHPer's Heaven 설치형게시판
        </td>
    </tr>
    <?
    // 1.로그인 여부에 따라 상단 메뉴가 다르게
    if($_SESSION[user_idx]){
    ?>
    <tr>
        <?
        // 로그인한 사람이 관리자면 관리자페이지 링크를, 아니면 홈 링크를
        if($_SESSION[user_level] == 9){
        ?>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./admin_index.php">관리자페이지</a></td>
        <?}else{?>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./index.php">홈</a></td>
        <?}?>

        <td align="center" valign="middle" style="font-size:12px;"><a href="./member_modify.php">정보수정</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./logout.php">로그아웃</a></td>
    </tr>
    <?}else{?>
    <tr>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./index.php">홈</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./member_join.php">회원가입</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./login.php">로그인</a></td>
    </tr>
    <?}?>
</table>
<br>
<table style="width:1000px;height:30px;border:5px #CCCCCC solid;">
    <tr>
<?
// 2. 생성된 게시판 목록 불러와 링크 만들기
    $sql = "select * from bd__board_config where 1 order by bc_idx desc";
    $data = sql_list($sql);
    for($i=0;$i<count($data);$i++){
        // 3. 게시판 목록을 보여주는 파일에 게시판 종류를 구분하는 bc_code 를 get 으로 연결
?>
        <td><a href="./board_list.php?bc_code=<?=$data[$i][bc_code]?>"><?=$data[$i][bc_name]?></a></td>
    <?
    }
    ?>
    </tr>
</table>
[head.php 소스]

특별한 부분은 2번부터 입니다.

어드민에서 생성한 게시판들의 목록을 가져다 모두 동일하게 글목록을 보여주는  파일인 board_list.php 에 get 값으로 어떤 게시판인지 구분하기 위한 bc_code  값을 같이 보내게 하는 링크를 만들어 줍니다.

만들어진 index.php 파일은 다음과 같습니다.
<?
// 1. 공통 인클루드 파일
include ("./head.php");
?>
[index.php 소스]

[실행화면]



다음은 회원가입입니다.

예전에 관계형 게시판의 회워가입과 동일합니다.

단 회원정보 저장시에 m_level 을 기록해 주는것이 차이가있습니다.

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    ?>
    <script>
        alert("로그인 하신 상태입니다.");
        history.back();
    </script>
    <?
}
// 3. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">회원가입</td>
    </tr>
</table>
<br/>
<form name="registForm" method="post" action="./member_join_save.php" style="margin:0px;">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">아이디</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_id" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">이름</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_name" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호 확인</td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass2" style="width:380px;"></td>
    </tr>
    <!-- 4. 회원가입 버튼 클릭시 입력필드 검사 함수 member_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 회원가입 " onClick="member_save();"></td>
    </tr>
</table>
</form>
<script>
// 5.입력필드 검사함수
function member_save()
{
    // 6.form 을 f 에 지정
    var f = document.registForm;

    // 7.입력폼 검사
    if(f.m_id.value == ""){
        // 8.값이 없으면 경고창으로 메세지 출력 후 함수 종료
        alert("아이디를 입력해 주세요.");
        return false;
    }

    if(f.m_name.value == ""){
        alert("이름을 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value != f.m_pass2.value){
        // 9.비밀번호와 확인이 서로 다르면 경고창으로 메세지 출력 후 함수 종료
        alert("비밀번호를 확인해 주세요.");
        return false;
    }

    // 10.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[member_join.php 소스]

<?
// 1. 공통 인클루드 파일
include ("./head.php");

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    ?>
    <script>
        alert("로그인 하신 상태입니다.");
        history.back();
    </script>
    <?
}

// 3. 넘어온 변수 검사
if(trim($_POST[m_id]) == ""){
    ?>
    <script>
        alert("아이디를 입력해 주세요.");
        history.back();
    </script>
    <?
    exit;
}

if(trim($_POST[m_name]) == ""){
    ?>
    <script>
        alert("이름을 입력해 주세요.");
        history.back();
    </script>
    <?
    exit;
}

if($_POST[m_pass] == ""){
    ?>
    <script>
        alert("비밀번호를 입력해 주세요.");
        history.back();
    </script>
    <?
    exit;
}

if($_POST[m_pass] != $_POST[m_pass2]){
    ?>
    <script>
        alert("비밀번호를 확인해 주세요.");
        history.back();
    </script>
    <?
    exit;
}

// 4. 같은 아이디가 있는지 검사
$chk_sql = "select * from bd__member where m_id = '".trim($_POST[m_id])."'";
$chk_result = sql_query($chk_sql);
$chk_data = mysql_fetch_array($chk_result);

// 5. 가입된 아이디가 있으면 되돌리기
if($chk_data[m_idx]){
    ?>
    <script>
        alert("이미 가입된 아이디 입니다.");
        history.back();
    </script>
    <?
    exit;
}

// 6. 회원정보 적기
$sql = "insert into bd__member (m_id, m_name, m_pass, m_level) values ('".trim($_POST[m_id])."', '".trim($_POST[m_name])."', '".$_POST[m_pass]."', 1)";
sql_query($sql);

// 7. 로그인 페이지로 보내기
?>
<script>
alert("회 원가입이 완료 되었습니다.");
location.replace("./index.php");
</script>
[member_join_save.php 소스]

그럼 다음시간에는 사용자 로그인과 정보수정을 배우겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:26
지난시간에는 게시판을 생성하고 수정관리하는 페이지를 만들었습니다.

오늘은 회원들을 관리하는 페이지를 만들어 보도록 하겠습니다.

들어간 소스들은 지난시간의 게시판 관리 부분과 크게 차이가 없으니 설명은 생량하도록 하겠습니다.

<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 페이지 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}
// 한 페이지에 보일 글 수
$page_row = 10;
// 한줄에 보여질 페이지 수
$page_scale = 10;
// 페이징을 출력할 변수 초기화
$paging_str = "";

// 3. 전체 회원 갯수 알아내기
$sql = "select count(*) as cnt from bd__member where 1";
$total_count = sql_total($sql);

// 4. 페이지 출력 내용 만들기
$paging_str = paging($page, $page_row, $page_scale, $total_count);

// 5. 시작 열을 구함
$from_record = ($page - 1) * $page_row;

// 6. 목록 구하기
$query = "select * from bd__member where 1 order by m_idx desc limit ".$from_record.", ".$page_row;
$data = sql_list($query);
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">회원 목록</td>
    </tr>
</table>
<br/>
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="5%" style="height:30px;background-color:#CCCCCC;">번호</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">아이디</td>
        <td align="center" valign="middle" width="45%" style="height:30px;background-color:#CCCCCC;">이름</td>
        <td align="center" valign="middle" width="30%" style="height:30px;background-color:#CCCCCC;">레벨</td>
    </tr>
<?
if($total_count > 0){
    for($i=0;$i<count($data);$i++){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=($total_count - (($page - 1) * $page_row) - $i )?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./admin_member_modify.php?m_idx=<?=$data[$i][m_idx]?>&page=<?=$page?>"><?=$data[$i][m_id]?></a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./admin_member_modify.php?m_idx=<?=$data[$i][m_idx]?>&page=<?=$page?>"><?=$data[$i][m_name]?></a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;">
        <?
        if($data[$i][m_level] == 1){
            echo "일반회원";
        }else if($data[$i][m_level] == 9){
            echo "어드민";
        }else{
            echo $data[$i][m_level];
        }?>
        </td>
    </tr>
<?
    }
}else{?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">회원이 하나도 없습니다.</td>
    </tr>
<?}?>
</table>
[admin_member_list.php 소스]

[실행화면]



<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 회원 설정 데이터 불러오기
$sql = "select * from bd__member where m_idx = '".$_GET[m_idx]."'";
$data = sql_fetch($sql);
if(!$data[m_idx]){
    alert("없는 회원입니다.");
}
// 3. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:30px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">회원 정보수정</td>
    </tr>
</table>
<br/>
<form name="bWriteForm" method="post" action="./admin_member_modify_save.php" style="margin:0px;">
<input type="hidden" name="m_idx" value="<?=$data[m_idx]?>">
<table style="width:1000px;height:30px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">회원아이디< /td>
        <td align="left" valign="middle" style="width:800px;height:30px;">&nbsp;<?=$data[m_id]?></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">회원이름< /td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="text" name="m_name" style="width:780px;" value="<?=$data[m_name]?>"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">레벨</td& gt;
        <td align="left" valign="middle" style="width:800px;height:30px;">
        &nbsp;
        <select name="m_level">
            <option value="1" <?if($data[m_level] == 1){echo "selected";}?>>일반회원</option>
            <option value="9" <?if($data[m_level] == 9){echo "selected";}?>>어드민</option>
        </select>
        </td>
    </tr>
    <!-- 4. 수정 버튼 클릭시 입력필드 검사 함수 write_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 회원수정 " onClick="write_save();">&nbsp;&nbsp;&nbsp;<input type="button" value=" 삭제 " onClick="location.replace('./admin_member_delete.php?m_idx=<?=$data[m_idx]?>')">&nbsp;&nbsp;&nbsp;<input type="button" value=" 뒤로가기 " onClick="history.back();"></td>
    </tr>
</table>
</form>
<script>
// 5.입력필드 검사함수
function write_save()
{
    // 6.form 을 f 에 지정
    var f = document.bWriteForm;

    // 7.입력폼 검사

    if(f.m_name.value == ""){
        alert("회원이름을 입력해 주세요.");
        return false;
    }

    // 8.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[admin_member_modify.php 소스]

<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 회원 존재여부 검사
$sql = "select * from bd__member where m_idx = '".$_POST[m_idx]."'";
$data = sql_fetch($sql);
if(!$data[m_idx]){
    alert("없는 회원입니다.");
}

// 3. 넘어온 변수 검사
if(trim($_POST[m_name]) == ""){
    alert("회원이름을 입력해 주세요.");
}

$m_idx = $_POST[m_idx];

// 4. 회원 저장
$sql = "update bd__member set
        m_name = '".trim($_POST[m_name])."',
        m_level = '".$_POST[m_level]."'
        where m_idx = '".$m_idx."'
        ";
sql_query($sql);


// 5. 이름이 바귀었으면 회원 글과 코멘트의 이름 수정
if($data[m_name] != trim($_POST[m_name])){
    $sql = "update bd__board set m_name ='".trim($_POST[m_name])."' where m_id = '".$data[m_id]."'";
    sql_query($sql);

    $sql = "update bd__comment set m_name ='".trim($_POST[m_name])."' where m_id = '".$data[m_id]."'";
    sql_query($sql);
}


// 6. 회원목록 페이지로 보내기
alert("회원이 수정 되었습니다.", "./admin_member_list.php");
?>
[admin_member_modify_save.php 소스]

<?
// 1. 공통 인클루드 파일
include "./admin_head.php";


// 2. 회원 존재여부 검사
$sql = "select * from bd__member where m_idx = '".$_GET[m_idx]."'";
$data = sql_fetch($sql);
if(!$data[m_idx]){
    alert("없는 회원입니다.");
}

$m_idx = $_GET[m_idx];

// 4. 회원 삭제
$sql = "delete from bd__member where m_idx = '".$m_idx."'";
sql_query($sql);

// 5. 글에 딸린 코멘트 및 파일 삭제를 위한 게시글 목록 구하기
$sql = "select * from bd__board where m_id = '".$data[m_id]."'";
$data1 = sql_list($sql);

// 6. 게시글 삭제
$sql = "delete from bd__board where m_id = '".$data[m_id]."'";
sql_query($sql);

// 7. 게시글에 딸린 코멘트 및 게시물 파일 삭제
for($i=0;$i<count($data1);$i++){
    $sql = "delete from bd__comment where b_idx = '".$data1[b_idx]."'";
    sql_query($sql);

    $b_file = "./data/".$data1[b_idx];
    @unlink($b_file);
}

// 8. 코멘트 삭제
$sql = "delete from bd__comment where m_id = '".$data1[m_id]."'";
sql_query($sql);

// 9. 회원목록 페이지로 보내기
alert("회원이 삭제 되었습니다.", "./admin_member_list.php");
?>
[admin_member_delete.php 소스]

다음시간에는 회원쪽의 공통인클루드와 회원가입부분을 배워보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:25
이번시간에는 설치때 만든 어드민 아이디로 로그인해서 게시판을 생성하고 또 그 게시판의 설정을 변경하는 부분을 만들어 보겠습니다.

우선 로그인 페이지 입니다.

<?
// 1. 공통 인클루드
include "./inc/config.php";

// 2. 로그인 입력 HTML
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title></title>
</head>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" colspan="3" style="font-zise:15px;font-weight:bold;">
        PHPer's Heaven 설치형게시판 관리자
        </td>
    </tr>
</table>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">관리자 로그인</td>
    </tr>
</table>
<br/>
<form name="loginForm" method="post" action="./admin_login_chk.php" style="margin:0px;">
<table style="width:1000px;height:50px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">아이디</td& gt;
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="text" name="m_id" style="width:380px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:50px;background-color:#CCCCCC;">비밀번호< /td>
        <td align="left" valign="middle" style="width:800px;height:50px;"><input type="password" name="m_pass" style="width:380px;"></td>
    </tr>
    <!-- 3. 로그인 버튼 클릭시 입력필드 검사 함수 login_chk 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 로그인 " onClick="login_chk();"></td>
    </tr>
</table>
</form>
<script>
// 4.입력필드 검사함수
function login_chk()
{
    // 6.form 을 f 에 지정
    var f = document.loginForm;

    // 7.입력폼 검사
    if(f.m_id.value == ""){
        // 8.값이 없으면 경고창으로 메세지 출력 후 함수 종료
        alert("아이디를 입력해 주세요.");
        return false;
    }

    if(f.m_pass.value == ""){
        alert("비밀번호를 입력해 주세요.");
        return false;
    }

    // 9.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[admin_login.php 소스]

로그인 체크 페이지
<?
// 1. 공통 인클루드 파일
include "./inc/config.php";

// 2. 로그인한 회원은 뒤로 보내기
if($_SESSION[user_id]){
    alert("로그인 하신 상태입니다.");
}

// 3. 넘어온 변수 검사
if(trim($_POST[m_id]) == ""){
    alert("아이디를 입력해 주세요.");
}

if($_POST[m_pass] == ""){
    alert("비밀번호를 입력해 주세요.");
}

// 4. 같은 아이디가 있는지 검사
$chk_sql = "select * from bd__member where m_id = '".trim($_POST[m_id])."'";
$chk_result = sql_query($chk_sql);
$chk_data = mysql_fetch_array($chk_result);

// 5. 아이디가 존재 하는 경우
if($chk_data[m_idx]){

    // 5. 입력된 비밀번호와 저장된 비밀번호가 같은지 비교해서
    if($_POST[m_pass] == $chk_data[m_pass]){
        // 6. 비밀번호가 같으면 세션값 부여 후 이동
        $_SESSION[user_idx] = $chk_data[m_idx];
        $_SESSION[user_id] = $chk_data[m_id];
        $_SESSION[user_name] = $chk_data[m_name];
        $_SESSION[user_level] = $chk_data[m_level];

        alert("환영합니다.", "./admin_index.php");
    }else{
        // 7. 비밀번호가 다르면
        alert("비밀번호가 다릅니다.");
    }
}else{
    // 8. 아이디가 존재하지 않으면
    alert("존재하지 않는 회원입니다.");
}
?>
[admin_login_chk.php 소스]

다음은 로그인한 후의 공통 head 부분입니다.

<?
include "./inc/config.php";

if(!$_SESSION[user_id] || $_SESSION[user_level] < 9){
    alert("어드민 아이디로 로그인하여 주시기 바랍니다.", "./admin_login.php");
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title></title>
</head>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" colspan="3" style="font-zise:15px;font-weight:bold;">
        PHPer's Heaven 설치형게시판 관리자
        </td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./admin_board_list.php">게시판목록</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./admin_member_list.php">회원목록</a></td>
        <td align="center" valign="middle" style="font-size:12px;"><a href="./admin_logout.php">로그아웃</a></td>
    </tr>
</table>
[admin_head.php 소스]

로그아웃 페이지입니다.
<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 모든 세션값을 빈값으로
$_SESSION[user_idx] = "";
$_SESSION[user_id] = "";
$_SESSION[user_name] = "";
$_SESSION[user_level] = "";

alert("로그아웃이 되었습니다.", "./admin_login.php");
?>
[admin_logout.php 소스]

이제 로그인은 다 되었습니다.

이제 게시판 목록을 출력하고 각 게시판의 생성 및 설정을 변경하는 부분을 만들어 보겠습니다.

게시판 목록
<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 페이지 변수 설정
if($_GET[page] && $_GET[page] > 0){
    // 현재 페이지 값이 존재하고 0 보다 크면 그대로 사용
    $page = $_GET[page];
}else{
    // 그 외의 경우는 현재 페이지를 1로 설정
    $page = 1;
}
// 한 페이지에 보일 글 수
$page_row = 10;
// 한줄에 보여질 페이지 수
$page_scale = 10;
// 페이징을 출력할 변수 초기화
$paging_str = "";

// 3. 전체 게시판 갯수 알아내기
$sql = "select count(*) as cnt from bd__board_config where 1";
$total_count = sql_total($sql);

// 4. 페이지 출력 내용 만들기
$paging_str = paging($page, $page_row, $page_scale, $total_count);

// 5. 시작 열을 구함
$from_record = ($page - 1) * $page_row;

// 6. 글목록 구하기
$query = "select * from bd__board_config where 1 order by bc_idx desc limit ".$from_record.", ".$page_row;
$data = sql_list($query);
?>
<br/>
<table style="width:1000px;height:50px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">게시판 목록</td>
    </tr>
</table>
<br/>
<table cellspacing="1" style="width:1000px;height:50px;border:0px;background-color:#999999;">
    <tr>
        <td align="center" valign="middle" width="5%" style="height:30px;background-color:#CCCCCC;">번호</td>
        <td align="center" valign="middle" width="20%" style="height:30px;background-color:#CCCCCC;">게시판코드</td>
        <td align="center" valign="middle" width="45%" style="height:30px;background-color:#CCCCCC;">게시판이름</td>
        <td align="center" valign="middle" width="30%" style="height:30px;background-color:#CCCCCC;">게시판관리자</td>
    </tr>
<?
if($total_count > 0){
    for($i=0;$i<count($data);$i++){
?>
    <tr>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=($total_count - (($page - 1) * $page_row) - $i )?></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./admin_board_modify.php?bc_idx=<?=$data[$i][bc_idx]?>&page=<?=$page?>"><?=$data[$i][bc_code]?></a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><a href="./admin_board_modify.php?bc_idx=<?=$data[$i][bc_idx]?>&page=<?=$page?>"><?=$data[$i][bc_name]?></a></td>
        <td align="center" valign="middle" style="height:30px;background-color:#FFFFFF;"><?=$data[$i][bc_admin]?></td>
    </tr>
<?
    }
}else{?>
    <tr>
        <td align="center" valign="middle" colspan="4" style="height:50px;background-color:#FFFFFF;">게시판이 하나도 없습니다.</td>
    </tr>
<?}?>
</table>
<br/>
<table style="width:1000px;height:50px;">
    <tr>
        <td align="center" valign="middle"><?=$paging_str?></td>
    </tr>
    <tr>
        <td align="center" valign="middle"><input type="button" value=" 게시판생성 " onClick="location.href='./admin_board_insert.php';"></td>
    </tr>
</table>
[admin_board_list.php 소스]

게시판 생성 페이지
<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:30px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">게시판 생성</td>
    </tr>
</table>
<br/>
<form name="bWriteForm" method="post" enctype="multipart/form-data" action="./admin_board_insert_save.php" style="margin:0px;">
<table style="width:1000px;height:30px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판코드< /td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="text" name="bc_code" style="width:780px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판이름< /td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="text" name="bc_name" style="width:780px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판 상단이미지</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="file" name="bc_head_file" size="80"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판상단내용< /td>
        <td align="left" valign="middle" style="width:800px;height:100px;"><textarea name="bc_head" style="width:800px;height:100px;"></textarea></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판하단내용< /td>
        <td align="left" valign="middle" style="width:800px;height:100px;"><textarea name="bc_tail" style="width:800px;height:100px;"></textarea></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판하단이미지& lt;/td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="file" name="bc_tail_file" size="80"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:120px;background-color:#CCCCCC;">권한설정< /td>
        <td align="left" valign="middle" style="width:800px;height:120px;">
        목록 레벨 : <select name="bc_list_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>"><?=$i?></option>
        <?}?>
        </select><br>
        읽기 레벨 : <select name="bc_read_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>"><?=$i?></option>
        <?}?>
        </select><br>
        쓰기 레벨 : <select name="bc_write_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>"><?=$i?></option>
        <?}?>
        </select><br>
        답글 레벨 : <select name="bc_reply_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>"><?=$i?></option>
        <?}?>
        </select><br>
        댓글 레벨 : <select name="bc_comment_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>"><?=$i?></option>
        <?}?>
        </select>
        </td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판 관리자ID</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="text" name="bc_admin" style="width:780px;"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">파일 업로드 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_file" value="1"> 사용</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">비밀글 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_secret" value="1"> 사용</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">답글 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_reply" value="1"> 사용</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">댓글 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_comment" value="1"> 사용</td>
    </tr>
    <!-- 3. 생성 버튼 클릭시 입력필드 검사 함수 write_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 게시판생성 " onClick="write_save();">&nbsp;&nbsp;&nbsp;<input type="button" value=" 뒤로가기 " onClick="history.back();"></td>
    </tr>
</table>
</form>
<script>
// 4.입력필드 검사함수
function write_save()
{
    // 5.form 을 f 에 지정
    var f = document.bWriteForm;

    // 6.입력폼 검사

    if(f.bc_code.value == ""){
        alert("게시판코드를 입력해 주세요.");
        return false;
    }

    if(f.bc_name.value == ""){
        alert("게시판이름을 입력해 주세요.");
        return false;
    }

    // 7.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>

[admin_board_insert.php 소스]



여기서 전에 없었던 부분은 form 태그의 enctype="multipart/form-data" 부분입니다.
이것은 파일을 업로드 하기위해서 필요한 부분입니다.

게시판 생성 저장 페이지
<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 넘어온 변수 검사
if(trim($_POST[bc_code]) == ""){
    alert("게시판코드를 입력해 주세요.");
}

$sql = "select * from bd__board_config where bc_code = '".trim($_POST[bc_code])."'";
$data = sql_fetch($sql);
if($data[bc_idx]){
    alert("이미 존재하는 게시판입니다.");
}

if(trim($_POST[bc_name]) == ""){
    alert("게시판이름을 입력해 주세요.");
}



// 3. 파일 저장 디렉토리 검사 후 없으면 생성
$dir = "./data/board_config";
if(!is_dir($dir)){
    @mkdir($dir, 0707);
    @chmod($dir, 0707);
}

// 4. 파일이 jpg나 gif 인지 검사
if($_FILES[bc_head_file][tmp_name]){
    if($_FILES[bc_head_file][type] == "image/gif" || $_FILES[bc_head_file][type] == "image/jpeg"){
        $bc_head_file = $_FILES[bc_head_file][name];
    }else{
        $bc_head_file = "";
    }
}
if($_FILES[bc_tail_file][tmp_name]){
    if($_FILES[bc_tail_file][type] == "image/gif" || $_FILES[bc_tail_file][type] == "image/jpeg"){
        $bc_tail_file = $_FILES[bc_tail_file][name];
    }else{
        $bc_tail_file = "";
    }
}


// 5. 게시판 저장
$sql = "insert into bd__board_config set
        bc_code = '".trim($_POST[bc_code])."',
        bc_name = '".trim($_POST[bc_name])."',
        bc_head_file = '".$bc_head_file."',
        bc_head = '".$_POST[b_title]."',
        bc_tail_file = '".$bc_tail_file."',
        bc_tail = '".$_POST[bc_tail]."',
        bc_list_level = '".$_POST[bc_list_level]."',
        bc_read_level = '".$_POST[bc_read_level]."',
        bc_write_level = '".$_POST[bc_write_level]."',
        bc_reply_level = '".$_POST[bc_reply_level]."',
        bc_comment_level = '".$_POST[bc_comment_level]."',
        bc_admin = '".$_POST[bc_admin]."',
        bc_use_file = '".$_POST[bc_use_file]."',
        bc_use_secret = '".$_POST[bc_use_secret]."',
        bc_use_reply = '".$_POST[bc_use_reply]."',
        bc_use_comment = '".$_POST[bc_use_comment]."'
        ";
sql_query($sql);


// 6. 저장된 게시판번호 찾기
$bc_idx = mysql_insert_id();

// 7. 파일저장
if($_FILES[bc_head_file][tmp_name] && $bc_head_file){
    if(file_exists($head_file)){
        @unlink($head_file);
    }
    move_uploaded_file($_FILES[bc_head_file][tmp_name], $head_file);
    chmod($head_file, 0666);

}
if($_FILES[bc_tail_file][tmp_name] && $bc_tail_file){
    if(file_exists($tail_file)){
        @unlink($tail_file);
    }
    move_uploaded_file($_FILES[bc_tail_file][tmp_name], $tail_file);
    chmod($tail_file, 0666);

}


// 8. 게시판목록 페이지로 보내기
alert("게 시판이 생성 되었습니다.", "./admin_board_list.php");
?>
[admin_board_insert_save.php 소스]

input 태그의 type 이 file 인 경우에는 $_FILES[input 태그 name] 으로 파일들이 저장됩니다.
$_FILES[input 태그 name][name] : 파일이름
$_FILES[input 태그 name][tmp_name] : 임시저장된 파일
$_FILES[input 태그 name][type] : 파일종류
$_FILES[input 태그 name][size] : 파일사이즈
$_FILES[input 태그 name][error] : 에러

이것을 이용해 이미지 파일중에 jpg 인지 gif 인지도 검사합니다.

move_uploaded_file(업로드파일, 저장할파일) 은 저장할 파일로 업로드한 파일을 옮기는 함수입니다.

게시판 수정 페이지
<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 게시판 설정 데이터 불러오기
$sql = "select * from bd__board_config where bc_idx = '".$_GET[bc_idx]."'";
$data = sql_fetch($sql);
if(!$data[bc_idx]){
    alert("없는 게시판입니다.");
}
// 3. 입력 HTML 출력
?>
<br/>
<table style="width:1000px;height:30px;border:5px #CCCCCC solid;">
    <tr>
        <td align="center" valign="middle" style="font-zise:15px;font-weight:bold;">게시판 생성</td>
    </tr>
</table>
<br/>
<form name="bWriteForm" method="post" enctype="multipart/form-data" action="./admin_board_modify_save.php" style="margin:0px;">
<input type="hidden" name="bc_idx" value="<?=$data[bc_idx]?>">
<table style="width:1000px;height:30px;border:0px;">
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판코드< /td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="text" name="bc_code" style="width:780px;" value="<?=$data[bc_code]?>"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판이름< /td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="text" name="bc_name" style="width:780px;" value="<?=$data[bc_name]?>"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판 상단이미지</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><?if($data[bc_head_file]){?><?=$data[bc_head_file]?>&nbsp;<input type="checkbox" name="bc_head_file_del" value="1"> 삭제<br><?}?><input type="file" name="bc_head_file" size="80"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판상단내용< /td>
        <td align="left" valign="middle" style="width:800px;height:100px;"><textarea name="bc_head" style="width:800px;height:100px;"><?=$data[bc_head]?></textarea></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판하단내용< /td>
        <td align="left" valign="middle" style="width:800px;height:100px;"><textarea name="bc_tail" style="width:800px;height:100px;"><?=$data[bc_tail]?></textarea></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판하단이미지& lt;/td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><?if($data[bc_tail_file]){?><?=$data[bc_tail_file]?>&nbsp;<input type="checkbox" name="bc_tail_file_del" value="1"> 삭제<br><?}?><input type="file" name="bc_tail_file" size="80"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:120px;background-color:#CCCCCC;">권한설정< /td>
        <td align="left" valign="middle" style="width:800px;height:120px;">
        목록 레벨 : <select name="bc_list_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>" <?if($data[bc_list_level] == $i){echo "selected";}?>><?=$i?></option>
        <?}?>
        </select><br>
        읽기 레벨 : <select name="bc_read_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>" <?if($data[bc_read_level] == $i){echo "selected";}?>><?=$i?></option>
        <?}?>
        </select><br>
        쓰기 레벨 : <select name="bc_write_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>" <?if($data[bc_write_level] == $i){echo "selected";}?>><?=$i?></option>
        <?}?>
        </select><br>
        답글 레벨 : <select name="bc_reply_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>" <?if($data[bc_reply_level] == $i){echo "selected";}?>><?=$i?></option>
        <?}?>
        </select><br>
        댓글 레벨 : <select name="bc_comment_level">
        <?for($i=0;$i<=9;$i++){?>
            <option value="<?=$i?>" <?if($data[bc_comment_level] == $i){echo "selected";}?>><?=$i?></option>
        <?}?>
        </select>
        </td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">게시판 관리자ID</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="text" name="bc_admin" style="width:780px;" value="<?=$data[bc_admin]?>"></td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">파일 업로드 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_file" value="1" <?if($data[bc_use_file] == 1){echo "checked";}?>> 사용</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">비밀글 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_secret" value="1" <?if($data[bc_use_secret] == 1){echo "checked";}?>> 사용</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">답글 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_reply" value="1" <?if($data[bc_use_reply] == 1){echo "checked";}?>> 사용</td>
    </tr>
    <tr>
        <td align="center" valign="middle" style="width:200px;height:30px;background-color:#CCCCCC;">댓글 사용</td>
        <td align="left" valign="middle" style="width:800px;height:30px;"><input type="checkbox" name="bc_use_comment" value="1" <?if($data[bc_use_comment] == 1){echo "checked";}?>> 사용</td>
    </tr>
    <!-- 4. 수정 버튼 클릭시 입력필드 검사 함수 write_save 실행 -->
    <tr>
        <td align="center" valign="middle" colspan="2"><input type="button" value=" 게시판수정 " onClick="write_save();">&nbsp;&nbsp;&nbsp;<input type="button" value=" 삭제 " onClick="location.replace('./admin_board_delete.php?bc_idx=<?=$data[bc_idx]?>')">&nbsp;&nbsp;&nbsp;<input type="button" value=" 뒤로가기 " onClick="history.back();"></td>
    </tr>
</table>
</form>
<script>
// 5.입력필드 검사함수
function write_save()
{
    // 6.form 을 f 에 지정
    var f = document.bWriteForm;

    // 7.입력폼 검사

    if(f.bc_code.value == ""){
        alert("게시판코드를 입력해 주세요.");
        return false;
    }

    if(f.bc_name.value == ""){
        alert("게시판이름을 입력해 주세요.");
        return false;
    }

    // 8.검사가 성공이면 form 을 submit 한다
    f.submit();

}
</script>
[admin_board_modify.php 소스]

게시판 수정 저장페이지
<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 게시판 존재여부 검사
$sql = "select * from bd__board_config where bc_idx = '".$_POST[bc_idx]."'";
$data = sql_fetch($sql);
if(!$data[bc_idx]){
    alert("없는 게시판입니다.");
}

// 3. 넘어온 변수 검사
if(trim($_POST[bc_code]) == ""){
    alert("게시판코드를 입력해 주세요.");
}

$sql = "select * from bd__board_config where bc_code = '".trim($_POST[bc_code])."' and bc_idx != '".$_POST[bc_idx]."'";
$data1 = sql_fetch($sql);
if($data1[bc_idx]){
    alert("이미 존재하는 게시판입니다.");
}

if(trim($_POST[bc_name]) == ""){
    alert("게시판이름을 입력해 주세요.");
}

$bc_idx = $_POST[bc_idx];

$dir = "./data/board_config";
$head_file = $dir."/".$bc_idx."_head";
$tail_file = $dir."/".$bc_idx."_tail";

$bc_head_file = $data[bc_head_file];
$bc_tail_file = $data[bc_tail_file];

// 4. 파일 삭제 체크시 삭제
if($_POST[bc_head_file_del]){
    @unlink($head_file);
    $bc_head_file = "";
}
if($_POST[bc_tail_file_del]){
    @unlink($tail_file);
    $bc_tail_file = "";
}

// 5. 파일이 jpg나 gif 인지 검사
if($_FILES[bc_head_file][tmp_name]){
    if($_FILES[bc_head_file][type] == "image/gif" || $_FILES[bc_head_file][type] == "image/jpeg"){
        $bc_head_file = $_FILES[bc_head_file][name];
    }else{
        $bc_head_file = "";
    }
}
if($_FILES[bc_tail_file][tmp_name]){
    if($_FILES[bc_tail_file][type] == "image/gif" || $_FILES[bc_tail_file][type] == "image/jpeg"){
        $bc_tail_file = $_FILES[bc_tail_file][name];
    }else{
        $bc_tail_file = "";
    }
}


// 7. 게시판 저장
$sql = "update bd__board_config set
        bc_code = '".trim($_POST[bc_code])."',
        bc_name = '".trim($_POST[bc_name])."',
        bc_head_file = '".$bc_head_file."',
        bc_head = '".$_POST[b_title]."',
        bc_tail_file = '".$bc_tail_file."',
        bc_tail = '".$_POST[bc_tail]."',
        bc_list_level = '".$_POST[bc_list_level]."',
        bc_read_level = '".$_POST[bc_read_level]."',
        bc_write_level = '".$_POST[bc_write_level]."',
        bc_reply_level = '".$_POST[bc_reply_level]."',
        bc_comment_level = '".$_POST[bc_comment_level]."',
        bc_admin = '".$_POST[bc_admin]."',
        bc_use_file = '".$_POST[bc_use_file]."',
        bc_use_secret = '".$_POST[bc_use_secret]."',
        bc_use_reply = '".$_POST[bc_use_reply]."',
        bc_use_comment = '".$_POST[bc_use_comment]."'
        where bc_idx = '".$bc_idx."'
        ";
sql_query($sql);


// 7. 파일저장
if($_FILES[bc_head_file][tmp_name] && $bc_head_file){
    if(file_exists($head_file)){
        @unlink($head_file);
    }
    move_uploaded_file($_FILES[bc_head_file][tmp_name], $head_file);
    chmod($head_file, 0666);

}
if($_FILES[bc_tail_file][tmp_name] && $bc_tail_file){
    if(file_exists($tail_file)){
        @unlink($tail_file);
    }
    move_uploaded_file($_FILES[bc_tail_file][tmp_name], $tail_file);
    chmod($tail_file, 0666);

}


// 8. 코드가 바귀었으면 게시판 글의 코드 수정
if($data[bc_code] != trim($_POST[bc_code])){
    $sql = "update bd__board set bc_code ='".trim($_POST[bc_code])."' where bc_code = '".$data[bc_code]."'";
    sql_query($sql);
}

// 9. 게시판목록 페이지로 보내기
alert("게시판이 수정 되었습니다.", "./admin_board_list.php");
?>
[admin_board_modify_save.php 소스]

8번에서 게시판 코드가 바뀌었으면 글들의 게시판 코드도 바꿔주는 부분입니다.

게시판 삭제 페이지
<?
// 1. 공통 인클루드 파일
include "./admin_head.php";

// 2. 게시판 존재여부 검사
$sql = "select * from bd__board_config where bc_idx = '".$_GET[bc_idx]."'";
$data = sql_fetch($sql);
if(!$data[bc_idx]){
    alert("없는 게시판입니다.");
}

$bc_idx = $_GET[bc_idx];

$dir = "./data/board_config";
$head_file = $dir."/".$bc_idx."_head";
$tail_file = $dir."/".$bc_idx."_tail";

// 3. 파일 삭제
@unlink($head_file);
@unlink($tail_file);

// 4. 게시판 삭제
$sql = "delete from bd__board_config where bc_idx = '".$bc_idx."'";
sql_query($sql);

// 5. 코멘트 및 파일 삭제를 위한 게시글 목록 구하기
$sql = "select * from bd__board where bc_code = '".$data[bc_code]."'";
$data1 = sql_list($sql);

// 6. 게시글 삭제
$sql = "delete from bd__board where bc_code = '".$data[bc_code]."'";
sql_query($sql);

// 7. 코멘트 및 게시물 파일 삭제
for($i=0;$i<count($data1);$i++){
    $sql = "delete from bd__comment where b_idx = '".$data1[b_idx]."'";
    sql_query($sql);

    $b_file = "./data/".$data1[b_idx];
    @unlink($b_file);
}

// 8. 게시판목록 페이지로 보내기
alert("게 시판이 삭제 되었습니다.", "./admin_board_list.php");
?>
[admin_board_delete.php 소스]

6번은 게시물들을 삭제하는것입니다.
7번은 6번 게시물들에 달린 댓글들을 삭제하고 또 글들의 파일들을 삭제 하는 내용입니다.

다음시간에는 어드민페이지에서 회원들을 관리하는 부분을 배워보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:24
지난시간에 설치 부분을 먼저 만들어 봤습니다.

이번시간에는 모든 페이지에 공통으로 include 되어서 사용되어질 라이브러리 파일을 만들어 보겠습니다.

일반적으로 라이브러리 파일에는 사용하는 함수들을 넣어 놓습니다.

즉 오늘 이 강좌도 공통으로 사용할 함수들을 만들어 놓는 셈인거죠.

그러면 inc/lib.php 에 들어가는 함수들을 하나하나 알아보도록 하겠습니다.

우선 lib.php 전체 소스를 보시고 난 후 함수별로 하나씩 설명해 드리겠습니다.

<?
//######################################
//
//  사용자정의함수파일 : inc/lib.php
//
//######################################

//DB 접속 및 데이터 베이스 선택 사용자 함수
function sql_connect($db_host, $db_user, $db_pass, $db_name)
{
    $result = mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
    mysql_select_db($db_name) or die(mysql_error());
    return $result;
}

// 쿼리 함수
function sql_query($sql)
{
    global $connect;
    $result = @mysql_query($sql, $connect) or die("<p>$sql<p>" . mysql_errno() . " : " .  mysql_error() . "<p>error file : $_SERVER[PHP_SELF]");
    return $result;
}

// 갯수 구하는 함수
function sql_total($sql)
{
    global $connect;
    $result_total = sql_query($sql, $connect);
    $data_total = mysql_fetch_array($result_total);
    $total_count = $data_total[cnt];
    return $total_count;
}

// 쿼리를 실행한 후 결과값에서 한행을 구하는 함수
function sql_fetch($sql, $error=TRUE)
{
    $result = sql_query($sql, $error);
    $row = mysql_fetch_array($result);
    return $row;
}

// 쿼리를 실행 한 후 결과값의 목록을 배열로 구하는 함수
function sql_list($sql)
{
    $sql_q = sql_query($sql);
    $sql_list = array();
    while($sql_r = mysql_fetch_array($sql_q)){
        $sql_list[]= $sql_r;
    }

    return $sql_list;
}


// 회원정보 구하는 함수
function get_member($uer_id)
{
    global $_cfg;
    $member = sql_fetch("select * from ".$_cfg[member_table]." where m_id = '".$uer_id."'");
    return $member;
}


// 경고창 띄우고 이동시키는 함수
function alert($msg='', $url
='')
{
    if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.';
    echo "<script language='javascript'>alert('$msg');";
    echo "</script>";
    if($url){
        goto_url($url);
    }else{
        echo "<script language='javascript'>history.back();";
        echo "</script>";
    }
    exit;
}


// 페이지 이동시키는 함수
function goto_url($url)
{
    echo "<script language='JavaScript'> location.replace('$url'); </script>";
    exit;
}

// 파일 읽어서 변수로 내용 저장하기
function file_read($file)
{
    $handle = fopen($file, "r");
    $contents = fread($handle, filesize($file));
    fclose($handle);
    return $contents;
}

// 접근 권한 체크하는 함수 $this_level = 허용레벨
function check_level($this_level)
{
    if($_SERVER[user_level] >= $this_level){
        $result = true;
    }else{
        $result = false;
    }
    return $result;
}

// 페이징 사용자 함수
function paging($page, $page_row, $page_scale, $total_count, $ext = '')
{
    // 1. 전체 페이지 계산
    $total_page  = ceil($total_count / $page_row);

    // 2. 페이징을 출력할 변수 초기화
    $paging_str = "";

    // 3. 처음 페이지 링크 만들기
    if ($page > 1) {
        $paging_str .= "<a href='".$_SERVER[PHP_SELF]."?page=1&'".$ext.">처음</a>";
    }

    // 4. 페이징에 표시될 시작 페이지 구하기
    $start_page = ( (ceil( $page / $page_scale ) - 1) * $page_scale ) + 1;

    // 5. 페이징에 표시될 마지막 페이지 구하기
    $end_page = $start_page + $page_scale - 1;
    if ($end_page >= $total_page) $end_page = $total_page;

    // 6. 이전 페이징 영역으로 가는 링크 만들기
    if ($start_page > 1){
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".($start_page - 1)."&'".$ext.">이전</a>";
    }

    // 7. 페이지들 출력 부분 링크 만들기
    if ($total_page > 1) {
        for ($i=$start_page;$i<=$end_page;$i++) {
            // 현재 페이지가 아니면 링크 걸기
            if ($page != $i){
                $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".$i."&'".$ext."><span>$i</span></a>";
            // 현재페이지면 굵게 표시하기
            }else{
                $paging_str .= " &nbsp;<b>$i</b> ";
            }
        }
    }

    // 8. 다음 페이징 영역으로 가는 링크 만들기
    if ($total_page > $end_page){
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".($end_page + 1)."&'".$ext.">다음</a>";
    }

    // 9. 마지막 페이지 링크 만들기
    if ($page < $total_page) {
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".$total_page."&'".$ext.">맨끝& lt;/a>";
    }

    return $paging_str;
}
?>
[inc/lib.php 소스]

1. DB 접속 및 데이터 베이스 선택 사용자 함수
function sql_connect($db_host, $db_user, $db_pass, $db_name)
{
    $result = mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
    mysql_select_db($db_name) or die(mysql_error());
    return $result;
}

DB에 접속하기 위한 함수입니다.
디비서버명, 디비아이디 , 디비비밀번호,디비명 을 인자로 받아서 디비연결과, 디비 선택을 한수 연결값을 리턴하는 함수입니다.

2. 쿼리 함수
function sql_query($sql)
{
    global $connect;
    $result = @mysql_query($sql, $connect) or die("<p>$sql<p>" . mysql_errno() . " : " .  mysql_error() . "<p>error file : $_SERVER[PHP_SELF]");
    return $result;
}

쿼리문을 인자로 받아서 mysql_query 문을 실행하고 에러나면 쿼리문과 에러가 난 파일을 보여주게 합니다.
성공하면 결과를 리턴합니다.

3. 갯수 구하는 함수
function sql_total($sql)
{
    global $connect;
    $result_total = sql_query($sql, $connect);
    $data_total = mysql_fetch_array($result_total);
    $total_count = $data_total[cnt];
    return $total_count;
}

갯수를 구하는 쿼리문을 받아서 갯수를 구해 리턴하는 함수입니다.
쿼리문은 "select count(*) as cnt from 테이블명 where 조건" 의 형식이여야 합니다.

4. 쿼리를 실행한 후 결과값에서 한행을 구하는 함수
function sql_fetch($sql, $error=TRUE)
{
    $result = sql_query($sql, $error);
    $row = mysql_fetch_array($result);
    return $row;
}

쿼리문을 실행해서 결과를 받은 후 한행을 구해 리턴하는 함수입니다.

5. 쿼리를 실행 한 후 결과값의 목록을 배열로 구하는 함수
function sql_list($sql)
{
    $sql_q = sql_query($sql);
    $sql_list = array();
    while($sql_r = mysql_fetch_array($sql_q)){
        $sql_list[]= $sql_r;
    }

    return $sql_list;
}


쿼리문을 실행해서 목록을 배열로 저장해서 리턴하는 함수
리턴되는 변수의 1차 배열에는 한줄의 데이터가 배열로 저장이 되어 있어 2차 배열로 리턴됩니다.

6. 회원정보 구하는 함수
function get_member($uer_id)
{
    global $_cfg;
    $member = sql_fetch("select * from ".$_cfg[member_table]." where m_id = '".$uer_id."'");
    return $member;
}


회원 아이디를 인자로 받아 회원디비에서 회원정보를 구해 배열의 형태로 리턴합니다.
$_cfg 는 config 파일에서 설정을 정의할때 사용할 변수입니다.
이 변수를 global  즉 전역 변수로 받아서 처리합니다.

7. 자바스크립트 경고창 띄우고 이동시키는 함수
function alert($msg='', $url='')
{
    if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.';
    echo "<script language='javascript'>alert('$msg');";
    echo "</script>";
    if($url){
        goto_url($url);
    }else{
        echo "<script language='javascript'>history.back();";
        echo "</script>";
    }
    exit;
}


메세지를 인자로 받아 자바스크립트의 alert() 함수를 실행해 주는 함수입니다.
$url인자로 받은 경로가 있으면 경로로 이동을 없으면 바로전으로 이동시킵니다.

8. 페이지이동함수
function goto_url($url)
{
    echo "<script language='JavaScript'> location.replace('$url'); </script>";
    exit;
}

이동할 주소를 인자로 받아 페이지를 이동하는 자바스크립트의 location.replace() 함수를 실행해주는 함수입니다.

8. 파일 읽어서 변수로 내용 저장 함수
function file_read($file)
{
    $handle = fopen($file, "r");
    $contents = fread($handle, filesize($file));
    fclose($handle);
    return $contents;
}

파일을 인자로 받아서 해당 파일을 읽어 내용을 리턴하는 함수입니다.
fread() 함수는 두번째 인자가 byte 수인데요. 이 byte 만큼 읽어줍니다.

9. 접근권한 체크하는 함수
function check_level($this_level)
{
    if($_SERVER[user_level] >= $this_level){
        $result = true;
    }else{
        $result = false;
    }
    return $result;
}

접근허용 레벨을 인자로 받아 세션에 기록된 사용자 레벨과 비교해서 권한이 있으면 true , 없으면 false 를 리턴합니다.

10. 페이징 함수
function paging($page, $page_row, $page_scale, $total_count, $ext = '')
{
    // 1. 전체 페이지 계산
    $total_page  = ceil($total_count / $page_row);

    // 2. 페이징을 출력할 변수 초기화
    $paging_str = "";

    // 3. 처음 페이지 링크 만들기
    if ($page > 1) {
        $paging_str .= "<a href='".$_SERVER[PHP_SELF]."?page=1&'".$ext.">처음</a>";
    }

    // 4. 페이징에 표시될 시작 페이지 구하기
    $start_page = ( (ceil( $page / $page_scale ) - 1) * $page_scale ) + 1;

    // 5. 페이징에 표시될 마지막 페이지 구하기
    $end_page = $start_page + $page_scale - 1;
    if ($end_page >= $total_page) $end_page = $total_page;

    // 6. 이전 페이징 영역으로 가는 링크 만들기
    if ($start_page > 1){
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".($start_page - 1)."&'".$ext.">이전</a>";
    }

    // 7. 페이지들 출력 부분 링크 만들기
    if ($total_page > 1) {
        for ($i=$start_page;$i<=$end_page;$i++) {
            // 현재 페이지가 아니면 링크 걸기
            if ($page != $i){
                $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".$i."&'".$ext."><span>$i</span></a>";
            // 현재페이지면 굵게 표시하기
            }else{
                $paging_str .= " &nbsp;<b>$i</b> ";
            }
        }
    }

    // 8. 다음 페이징 영역으로 가는 링크 만들기
    if ($total_page > $end_page){
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".($end_page + 1)."&'".$ext.">다음</a>";
    }

    // 9. 마지막 페이지 링크 만들기
    if ($page < $total_page) {
        $paging_str .= " &nbsp;<a href='".$_SERVER[PHP_SELF]."?page=".$total_page."&'".$ext.">맨끝& lt;/a>";
    }

    return $paging_str;
}

현재페이지, 한페이지에 표시될 글 수, 페이지표시부분에 표시될 페이지의 갯수, 전체글수, 추가로 붙는 get 부분을 인자로 받아서 페이징 부분을 만들어 리턴해주는 함수입니다.

여기까지 게시판에서 주로 사용될 사용자 함수들을 만들어봤습니다.

이제 중요한 설정들을 미리 해 놓고 모든 파일에서 include 하는 inc/config.php 페이지를 만들어 보겠습니다.

<?
//######################################
//
//  설정파일 : inc/config.php
//
//######################################

// db.php 파일의 존재유무로 설치 했는지 확인 (존재하면 설치한것임)
if(!file_exists("./db.php")){
    ?>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <script>
    alert("설치가 되지 않았습니다.");
    location.replace("./install/index.php");
    </script>
    <?
    exit;
}

// 설정변수 초기화
$_cfg = array();

// DB 테이블 정의
$_cfg['member_table'] = "bd__member";
$_cfg['config_table'] = "bd__board_config";
$_cfg['board_table'] = "bd__board";
$_cfg['comment_table'] = "bd__comment";
$_cfg['history_table'] = "bd__view_history";

// db.php 파일 인클루드
include ("./db.php");
// 사용자 정의 함수 인클루드
include ("./inc/lib.php");

// 세션사용은 위한 초기화
session_start();

// DB 연결
$connect = sql_connect($mysql_host, $mysql_user, $mysql_password, $mysql_db);
?>

[inc/config.php 소스]

이 부분은 특별히 설명할 부분은 없습니다.

그러면 다음시간에는 어드민페이지 로그인과 게시판들을 생성하고 설정하는 페이지를 만들어 보겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix
Programming/PHP2010/02/11 16:23
지난시간에 DB를 설계해 봤습니다.

이번시간에는 디렉토리 구조와 설치하는 부분을 만들어 보겠습니다.

우선 디렉토리는 설치 전에는 아래 그림과 같은 구조를 가집니다.

[설치전 디렉토리]


설치 후에는 이미지를 저장할 data 디렉토리가 추가됩니다.

[설치 후 디렉토리]


그리고 파일은 우선 우리가 전체를 만들기 전이기 때문에 최상단의 index.php 파일과 모든파일이 공통으로 인클루드 하는 설정파일 inc/config.php 파일 그리고 install 디렉토리의 설치 파일을 만들어 보도록 하겠습니다.

우선 index.php 파일과 inc/config.php 파일은 설치전이므로 설치여부만 확인하도록 하겠습니다.

<?
include "./inc/config.php";
?>
[index.php 소스]

<?
//######################################
//
//  설정파일 : inc/config.php
//
//######################################

// db.php 파일의 존재유무로 설치 했는지 확인 (존재하면 설치한것임)
if(!file_exists("./db.php")){
    ?>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <script>
    alert("설치가 되지 않았습니다.");
    location.replace("./install/index.php");
    </script>
    <?
    exit;
}

[inc/config.php 소스]

db.php에 db 설정을 설치시 적어주게 됩니다.

이 db.php  파일의 존재 여부에 따라서 존재하지 않으면 설치가 되지 않은 상태, 존재하면 설치가 완료된 상태를 의미합니다.

file_exists() 함수로 파일 존재여부를 가려낸 후 존재하지 않으면 설치 디렉토리의 정보입력 페이지로 보냅니다.


이제 본격적으로 설치 파일들을 만들어 보겠습니다.

먼저 install/index.php 파일입니다.

이 파일은 설치 관련된 정보를 입력받아 설치를 진행하는 파일로 넘겨주는 역할을 합니다.

<?
//######################################
//
//  설치데이터 입력파일 : install/index.php
//
//######################################
// 1. db.php 파일의 존재유무로 설치 했는지 확인 (존재하면 설치한것임)
if(file_exists("../db.php")){
    ?>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <script>
    alert("이미 설치가 되어 있습니다.");
    location.replace("../index.php");
    </script>
    <?
    exit;
}

// 2. 게시판의 최상단 디렉토리가 쓰기가능인지 검사
if (!is_writeable(".."))
{
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <title></title>
    </head>
    <script>
        alert("최상위 디렉토리의 퍼미션을 707 이나 777 로 변경하여 주세요.");
    </script>
    <body>
    최상위 디렉토리의 퍼미션을 707 이나 777 로 변경하여 주세요.
    </body>
    </html>
    <?
    exit;
}

// 3. 정보를 받는 HTML 만들기
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title> 게시판 설치</title>
</head>
<body>
<form name="iForm" method="post" action="install.php">
<table width="500">
    <tr>
        <td colspan="2" align="center"><b>MySql 정보</b></td>
    </tr>
    <tr>
        <td width="200">호스트명</td>
        <td width="300"><input type="text" name="host"></td>
    </tr>
    <tr>
        <td width="200">사용자 ID</td>
        <td width="300"><input type="text" name="user"></td>
    </tr>
    <tr>
        <td width="200">비밀번호</td>
        <td width="300"><input type="text" name="pass"></td>
    </tr>
    <tr>
        <td width="200">DB명</td>
        <td width="300"><input type="text" name="db_name"></td>
    </tr>
</table>
<br>
<table width="500">
    <tr>
        <td colspan="2" align="center"><b>관리자 정보</b></td>
    </tr>
    <tr>
        <td width="200">아이디</td>
        <td width="300"><input type="text" name="admin_id"></td>
    </tr>
    <tr>
        <td width="200">이름</td>
        <td width="300"><input type="text" name="admin_name"></td>
    </tr>
    <tr>
        <td width="200">비밀번호</td>
        <td width="300"><input type="text" name="admin_pass"></td>
    </tr>
</table>
<br>
<table width="500">
    <tr>
        <td colspan="2" align="center"><a href="javascript:install();">설치하기</a></td>
    </tr>
</table>
</form>
<script>
// 4. 정보입력을 검사하는 함수
function install()
{
    var f = document.iForm;

    if(!f.host.value){
        alert("MySql 호스트명를 적어주세요.");
        return;
    }

    if(!f.user.value){
        alert("MySql 사용자 ID를 적어주세요.");
        return;
    }

    if(!f.db_name.value){
        alert("MySql 비밀번호를 적어주세요.");
        return;
    }
   
    if(!f.host.value){
        alert("MySql DB명을 적어주세요.");
        return;
    }

    if(!f.admin_id.value){
        alert("관리자 아이디를 적어주세요.");
        return;
    }

    if(!f.admin_name.value){
        alert("관리자 이름을 적어주세요.");
        return;
    }

    if(!f.admin_pass.value){
        alert("관리자 비밀번호를 적어주세요.");
        return;
    }

    f.submit();
}
</script>
</body>
</html>
[install/index.php 소스]

1번에서 db.php 의 존재여부를 따져 존재하면 설치가 된 경우므로 상위디렉토리의 초기화면으로 보냅니다.

2번은 설치가 안되었을 경우 is_writable() 함수로 상위 디렉토리가 쓰기 가능인지를 확인합니다.

쓰기가 가능하지 않으면 db.php 파일과 이미지 저장 디렉토리인 data 디렉토리를 생성하지 못하므로 설치를 진행하지 못합니다.

3번부터는 입력받는 부분이므로 설명은 생략합니다.

입력이 완료되면 install/install.php 파일로 입력받은 정보를 보냅니다.

<?
//######################################
//
//  설치실행파일 : install/install.php
//
//######################################
// 1. db.php 파일의 존재유무로 설치 했는지 확인 (존재하면 설치한것임)
if(file_exists("../db.php")){
    ?>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <script>
    alert("이미 설치가 되어 있습니다.");
    location.replace("../index.php");
    </script>
    <?
    exit;
}

// 2. 게시판의 최상단 디렉토리가 쓰기가능인지 검사
if (!is_writeable(".."))
{
    ?>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
    <title></title>
    </head>
    <script>
        alert("최상위 디렉토리의 퍼미션을 707 이나 777 로 변경하여 주세요.");
    </script>
    <body>
    최상위 디렉토리의 퍼미션을 707 이나 777 로 변경하여 주세요.
    </body>
    </html>
    <?
    exit;
}

// 3. 변수정리
$host = trim($_POST[host]);
$user = trim($_POST[user]);
$pass = trim($_POST[pass]);
$db_name = trim($_POST[db_name]);

$admin_id = trim($_POST[admin_id]);
$admin_name = trim($_POST[admin_name]);
$admin_pass = trim($_POST[admin_pass]);

// 4. 에러시 메세지 내보낼 함수
function echo_message($msg)
{
    echo '<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">';
    echo '<script>';
    echo 'alert("'.$msg.'");';
    echo 'history.back();';
    echo '</script>';
}

// 5. DB 접속
$connect = @mysql_connect($host, $user, $pass);
if(!$connect){
    echo_message("MySql 호스트명, 사용자ID, 비밀번호를 확인해 주십시오.");
    exit;
}

$select_db = @mysql_select_db($db_name, $connect);
if(!$connect){
    echo_message("MySql DB명을 확인해 주십시오.");
    exit;
}

// 6. 테이블 만들기

// 회원 테이블 만들기
$sql = "
DROP TABLE IF EXISTS `bd__member`;
";
mysql_query($sql);
$sql = "
CREATE TABLE `bd__member` (
  `m_idx` int(11) NOT NULL auto_increment,
  `m_id` varchar(12) NOT NULL,
  `m_name` varchar(10) NOT NULL,
  `m_pass` varchar(100) NOT NULL,
  `m_level` tinyint(2) NOT NULL default '1',
  PRIMARY KEY  (`m_idx`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr AUTO_INCREMENT=1 ;
";
$result1 = mysql_query($sql, $connect);

// 게시판 설정 테이블 만들기
$sql = "
DROP TABLE IF EXISTS `bd__board_config`;
";
mysql_query($sql);
$sql = "
CREATE TABLE `bd__board_config` (
  `bc_idx` int(11) NOT NULL auto_increment,
  `bc_code` varchar(50) NOT NULL,
  `bc_name` varchar(50) NOT NULL,
  `bc_head_file` varchar(255) NOT NULL,
  `bc_head` text NOT NULL,
  `bc_tail_file` varchar(255) NOT NULL,
  `bc_tail` text NOT NULL,
  `bc_list_level` tinyint(2) NOT NULL default '0',
  `bc_read_level` tinyint(2) NOT NULL default '0',
  `bc_write_level` tinyint(2) NOT NULL default '0',
  `bc_reply_level` tinyint(2) NOT NULL default '0',
  `bc_comment_level` tinyint(2) NOT NULL default '0',
  `bc_admin` text NOT NULL,
  `bc_use_file` tinyint(2) NOT NULL default '0',
  `bc_use_secret` tinyint(2) NOT NULL default '0',
  `bc_use_reply` tinyint(2) NOT NULL default '0',
  `bc_use_comment` tinyint(2) NOT NULL default '0',
  PRIMARY KEY  (`bc_idx`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr AUTO_INCREMENT=1 ;
";
$result2 = mysql_query($sql, $connect);

// 게시판 글 테이블 만들기
$sql = "
DROP TABLE IF EXISTS `bd__board`;
";
mysql_query($sql);
$sql =
"CREATE TABLE `bd__board` (
  `b_idx` int(11) NOT NULL auto_increment,
  `bc_code` varchar(50) NOT NULL,
  `b_num` int(11) NOT NULL,
  `b_reply` varchar(3) NOT NULL,
  `m_id` varchar(12) NOT NULL,
  `m_name` varchar(10) NOT NULL,
  `b_pass` varchar(255) NOT NULL,
  `b_title` varchar(255) NOT NULL,
  `b_contents` text NOT NULL,
  `b_is_secret` tinyint(2) NOT NULL default '0',
  `b_filename` varchar(255) NOT NULL,
  `b_filesize` int(11) NOT NULL default '0',
  `b_cnt` int(11) NOT NULL default '0',
  `b_regdate` datetime NOT NULL,
  PRIMARY KEY  (`b_idx`),
  KEY `board_order` (`b_num`,`b_reply`),
  KEY `bc_code` (`bc_code`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr AUTO_INCREMENT=1 ;
";
$result3 = mysql_query($sql, $connect);

// 댓글 테이블 만들기
$sql = "
DROP TABLE IF EXISTS `bd__comment`;
";
mysql_query($sql);
$sql = "
CREATE TABLE `bd__comment` (
  `co_idx` int(11) NOT NULL auto_increment,
  `b_idx` int(11) NOT NULL,
  `m_id` varchar(12) NOT NULL,
  `m_name` varchar(10) NOT NULL,
  `co_pass` varchar(255) NOT NULL,
  `co_contents` text NOT NULL,
  `co_regdate` datetime NOT NULL,
  PRIMARY KEY  (`co_idx`),
  KEY `b_idx` (`b_idx`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr AUTO_INCREMENT=1 ;
";
$result4 = mysql_query($sql, $connect);

// 조회수용 글 읽기 히스토리 테이블 만들기
$sql = "
DROP TABLE IF EXISTS `bd__view_history`;
";
mysql_query($sql);
$sql = "
CREATE TABLE `bd__view_history` (
  `vh_idx` int(11) NOT NULL auto_increment,
  `b_idx` int(11) NOT NULL,
  `m_id` varchar(12) NOT NULL,
  `m_ip` varchar(15) NOT NULL,
  PRIMARY KEY  (`vh_idx`)
) ENGINE=MyISAM DEFAULT CHARSET=euckr AUTO_INCREMENT=1 ;
";
$result5 = mysql_query($sql, $connect);

// 7. 테이블이 다 만들어졌는지 검사
if(!$result1 || !$result2 || !$result3 || !$result4 || !$result5){
    echo_message("테이블 생성에 실패하였습니다.");
    exit;
}


// 8. 운영자 회원테이블에 적기
$sql = "insert into bd__member set m_id = '".$admin_id."', m_name = '".$admin_name."', m_pass = '".$admin_pass."', m_level = '9' ";
$result6 = mysql_query($sql, $connect);

// 9. 운영자 정보가 회원테이블에 적혔는지 검사
if(!$result6){
    echo_message("운영자 정보를 적는데 실패하였습니다.");
    exit;
}

// 10. DB 설정 파일 생성
$file = "../db.php";
$fp = @fopen($file, "w");

fwrite($fp, "<?\n");
fwrite($fp, "\$mysql_host = '$host';\n");
fwrite($fp, "\$mysql_user = '$user';\n");
fwrite($fp, "\$mysql_password = '$pass';\n");
fwrite($fp, "\$mysql_db = '$db_name';\n");
fwrite($fp, "?>");

fclose($fp);
@chmod($file, 0606);

// 11. 첨부파일 저장할 디렉토리 생성
@mkdir("../data", 0707);
@chmod("../data", 0707);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title> 게시판 설치</title>
</head>
<body>
설치가 완료 되었습니다.
<a href="../index.php">첫화면으로 가기</a>
</body>
</html>
[install/install.php 소스]

1.2 번은 install/index.php 에서 설명드린 내용입니다.

3번은 넘어온 변수들을 trim() 함수를 이용하여 앞뒤 공백을 제거하고 정리해 줍니다.

4번은 설치하면서 문제가 발생할경우 에러메세지를 보낼 함수입니다.

5번은 DB 접속 부분입니다.

앞페이지에서 넘어온 MySql 관련 변수들로 MySql 에 접속합니다.

접속시 에러가 나면 넘어온 정보가 부정확한 것이므로 4번의 함수로 에러메세지를 출력하고 되돌려보냅니다.

접속이 성공하면 이제 테이블들을 만들어 줍니다.

DROP TABLE IF EXISTS 테이블명

이 sql 문은 테이블이 존재할경우 테이블을 지운다는 문장입니다.

테이블을 생성하기 전에 이미 존재하는 같은 이름의 테이블을 제거하는 일을 합니다.

CREATE TABLE 테이블명 ( 필드명 데이타형(길이) 필드속성, ...... , PRIMARY KEY (프라이머리필드명) )  ENGINE=MyISAM DEFAULT CHARSET=euckr AUTO_INCREMENT=1

이 sql 문은 테이블을 만들때 사용하는 create 문입니다.

CREATE TABLE 테이블명 - 테이블을 만든다는 부분
( 필드명 데이타형(길이) 필드속성, ...... ,  - 테이블의 필드들의 이름과 데이타형, 길이 그외 속성 들을 적습니다.
PRIMARY KEY (프라이머리필드명) )  - PRIMARY KEY 나 INDEX 들을 적어줍니다.
ENGINE=MyISAM   - MySql 의 DB엔진입니다. 여러가지가 있지만 보편적으로는 MyISAM 을 사용합니다.
DEFAULT CHARSET=euckr  - 기본 캐릭터셋을 적어줍니다.
AUTO_INCREMENT=1  - auto increment 가 있다면 시작하는 번호를 적어줍니다.

phpmyadmin 에서 쉽게 만들던게 복잡해 보일겁니다.

쉽게 알아보시려면 phpmyadmin 의 내보내기 메뉴에서 내보내기를 해보면 저 문장을 쉽게 얻으실수 있습니다.

전시간에 설계한 테이블들을 위의 구문대로 만들어 갑니다.

7번에서 테이블들이 다 만들어 졌는지 검사를 합니다.

8. 넘어온 운영자 정보를 회원테이블에 적어 넣습니다. 이 부분은 예전에 설명 드린 내용입니다.

9 운영자 정보가 적혔는지 검사합니다.

10. 이제 db.php 파일을 만듭니다.

전시간에는 우리가 파일을 직접 만들어서 적어준 내용인데 이번에는 설치이므로 넘어온 데이터들을 이용해 파일을 만듭니다.
fopen() 으로 w 모드로 열면 파일이 생성된다는건 기억하시죠?

chmod(파일 , 퍼미션) 은 파일이나 디렉토리의 퍼미션을 변경할때 사용합니다.

11. 첨부 파일을 저장할 디렉토리인 data 디렉토리를 mkdir()함수로 만들어 줍니다.

퍼미션은 707 즉 누구라고 쓰기가 가능하다는 이야기 입니다.

여기까지 하고나면 설치가 완료된것입니다.

이제 다음시간에는 설정파일 inc/config.php 과 게시판에서 사용할 함수들을 담고 있는 inc/lib.php 파일을 만들어 보도록 하겠습니다.
저작자 표시 비영리 변경 금지
Posted by Mizix