본문 바로가기
Programming

[PHP 강좌] 45. 설치형 게시판 만들기 8 - 게시판 목록보기, 글쓰기

by Mizix 2010. 2. 11.
반응형
오늘 이 시간에는 게시판 목록보기와 게시판에 글쓰는 부분을 만들어 보도록 하겠습니다.

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

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

<?
// 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번에서 글번호를 저장합니다.

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

그럼 다음시간에는 글보기 부분(직접보기와 비밀글을 입력후 보기)과 첨부파일 다운로드를 배워보도록 하겠습니다.
반응형