본문 바로가기
Programming

[PHP 강좌] 39. 설치형 게시판 만들기 2 - 디렉토리 구조 및 설치만들기

by Mizix 2010. 2. 11.
반응형
지난시간에 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 파일을 만들어 보도록 하겠습니다.
반응형