테스트 사이트 - 개발 중인 베타 버전입니다

그누보드 최신버전 (5.0.36) 살펴보기 - common.php (4)

· 10년 전 · 2239 · 12

그누보드 최신버전 (5.0.36) 살펴보기 - common.php (4)

 

 

 

common.php 그누보드에서 가장 기본이 되는 파일이라고 볼수 있습니다.

 

모든 파일에 기본적으로 인클루드 되어서 사용됩니다.

 

에러출력 설정, 보안적인 처리, 기본적인 경로 설정, 디비연결, 세션 설정및 시작, 공용변수의 초기화 및 재설정, 기타 확장 등의 내용으로 이루어져 있습니다.

 

 

 

 $dbconfig_file = G5_DATA_PATH.'/'.G5_DBCONFIG_FILE;

 

 include 된 config.php 에서 설정한 대로 데이타 디렉토리 경로("G5_DATA_PATH")와 디비 환경설정 파일명("G5_DBCONFIG_FILE")을 합쳐서 디비환경설정파일의 전체경로를 생성합니다.

 

 

 

if (file_exists($dbconfig_file)) {

    include_once($dbconfig_file);

    include_once(G5_LIB_PATH.'/common.lib.php');    // 공통 라이브러리

 

    $connect_db = sql_connect(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD) or die('MySQL Connect Error!!!');

    $select_db  = sql_select_db(G5_MYSQL_DB, $connect_db) or die('MySQL DB Error!!!');

 

    // mysql connect resource $g5 배열에 저장 - 명랑폐인님 제안

    $g5['connect_db'] = $connect_db;

 

    sql_query(" set names utf8 ");

    if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''");

    if (defined(G5_TIMEZONE)) sql_query(" set time_zone = '".G5_TIMEZONE."'");

}

 

 

if (file_exists($dbconfig_file)) { 

 

해당 디비 환경설정 파일("$dbconfig_file")이 존재한다면 어떻게 하겠다는 조건절입니다.

 

"file_exists" 는 넘어온 경로가 파일 이든 디렉토리 이든 구분하지 않고 존재 여부만 판단합니다.

 

"is_file" 은 "file_exists" 의 개념과 넘어온 경로가 파일인지 여부를 같이 체크합니다.

 

여기 같은 경우는 "is_file" 을 쓰는것이 더 합당하다고 보여집니다.

 

http://php.net/manual/kr/function.file-exists.php

http://php.net/manual/kr/function.is-file.php

 

 

include_once($dbconfig_file);

include_once(G5_LIB_PATH.'/common.lib.php');    // 공통 라이브러리

 

기본 디비 환경 설정 파일과 기본 라이브러리를 인클루드 합니다.

 

 

"include" 와 "require" 는 기본적으로 같은 동작을 합니다.

 

차이가 있다면, "require" 는 "require" 된 파일이 존재하지 않거나 권한이 없는 에러가 발생하면 스크립트가 바로 중지 되지만

 

"include" 는 스크립트가 중지 되지 않습니다.

 

따라서 핵심 라이브러리나 환경설정과 관계된 파일은 "include" 보다는 "require" 가 더 적당하다고 보여집니다.

 

http://php.net/manual/kr/function.include.php

http://php.net/manual/kr/function.require.php

 

 

$connect_db = sql_connect(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD) or die('MySQL Connect Error!!!');

$select_db  = sql_select_db(G5_MYSQL_DB, $connect_db) or die('MySQL DB Error!!!');

 

디비서버에 연결하고, 사용할 디비를 선택하는 부분입니다.

 

 

$g5['connect_db'] = $connect_db;

 

$g5 는 그누보드 함수 내에서는 전역변수로 선언되어 쓰여지는 경우가 많으므로

 

$connect_db 를 $g5['connect_db'] 에 저장하는 이유는 어떤 상황에서 디비 연결을 끄거나 쿼리를 전송할때 따로 변수를 인자로 넘기지 않더라도 쓸수 있도록 하기 위함입니다.

 

 

sql_query(" set names utf8 ");

 

"set names 문자셋(캐릭터셋,차셋)" 은 클라이언트 즉, 여기서는 php 에서 디비서버로 연결할 때나 데이타를 주고 받을 때 지정받은 문자셋을 사용하겠다는 명령입니다.

 

" set names utf8 " 로 디비서버에 명령을 줌으로 해서, 현재 연결과 주고 받는 데이타는 모두 utf-8로 처리 할수 있도록 하는 것입니다.

 

다음 세개의 명령을 동시에 내리는 것과 같습니다.

 

SET character_set_client = 문자셋;

SET character_set_results = 문자셋;

SET character_set_connection = 문자셋;

 

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01_1&m_no=22792&cat1=1070&cat2=1074&cat3=0&lang=k

 

 

if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE)

 

"G5_MYSQL_SET_MODE" 는 그누보드를 설치 시 생성되는  디비 환경 설정파일("dbconfig.php") 에 상수로 정의 되었습니다.

 

"G5_MYSQL_SET_MODE" 는 true 나 fasle 로 설정되어질수 있는데, 

 

그것은 install/install_db.php 54~59 라인을 통해 기본 설정 됩니다.

 

$mysql_set_mode = 'false';

@mysql_query('set names utf8');

if(version_compare(mysql_get_server_info(), '5.6.6', '>=')  == 1) {

    @mysql_query("SET SESSION sql_mode = ''");

    $mysql_set_mode = 'true';

}

 

이부분인데,

 

요약하자면, mysql 버전을 비교하여 5.6.6 이상이면 $mysql_set_mode 를 true 로 설정하고 그 값을 "G5_MYSQL_SET_MODE" 라는 상수에 다시 저장합니다.

 

이렇게 하는 이유는 mysql 5.6.6 버전 이상부터 sql_mode 가 기본값으로 설정되어 설치 되는 이유 인듯 합니다.

 

그러나 

 

http://sir.co.kr/cm_free/1112683?sfl=mb_id%2C1&stx=dbckdghk (port443, 넓은마인드, 뽁스, 라엘, ibin 님이 좋은 조언을 해주셨습니다.)

 

의 ibin 님 말씀데로 sql_mode 는 mysql 5.0.2 부터 지원가능한 설정이므로,

 

기존 설정값이 먼저 존재하는지 뽑아본다음 존재한다면 ,

 

$mysql_set_mode = 'true'; 와 같이 처리 하는것이 더 올바른 방법이 아닐가 생각됩니다.

 

$mysql_set_mode = 'false';

@mysql_query('set names utf8');

if(@mysql_result(@mysql_query("select @@session.sql_mode"), 0, 0) != "") {

 

    @mysql_query("SET SESSION sql_mode = ''");

    $mysql_set_mode = 'true';

}

 

이런식으로 제안 될수 있을 것 같습니다.

 

sql_mode 는 

 

SET GLOBAL sql_mode = 'modes';

SET SESSION sql_mode = 'modes';

 

와 같은 방법으로 설정할수 있습니다.

 

위에것은 범용 설정 명령이고, 아래것은 현재 접속에서만 쓰여지는 설정 명령 입니다.

 

즉, 위에것은 ("SET GLOBAL sql_mode = 'modes';") 접속하는 사용자의 권한이 SUPER 일때만 가능합니다.

 

따라서 일반적으로 사용 할수 있는 "SET SESSION sql_mode = 'modes';" 사용합니다.

 

사용할수 있는 sql_mode 에는 

 

ANSI, STRICT_TRANS_TABLES, TRADITIONAL, ALLOW_INVALID_DATES, ANSI_QUOTES, ERROR_FOR_DIVISION_BY_ZERO, HIGH_NOT_PRECEDENCE, IGNORE_SPACE, NO_AUTO_CREATE_USER, NO_AUTO_VALUE_ON_ZERO, NO_BACKSLASH_ESCAPES, NO_DIR_IN_CREATE, NO_ENGINE_SUBSTITUTION, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_UNSIGNED_SUBTRACTION, NO_ZERO_DATE, NO_ZERO_IN_DATE, ONLY_FULL_GROUP_BY, PIPES_AS_CONCAT, REAL_AS_FLOAT, STRICT_ALL_TABLES, STRICT_TRANS_TABLES

 

등이 있습니다.

 

주로 SQL 구문의 문법체크를 얼마나 엄격 하게 할것인가, 질의시 에러가 났을경우 어떻게 반응 할것인가, 또는 특정 기능 사용시 어느 범주에서 사용 할것인가 등의 설정들을 할수 있는 것 같습니다.

 

http://www.mysqlkorea.com/sub.html?mcode=develop&scode=01&lang=k&m_no=21330&cat1=5&cat2=120&cat3=138

https://dev.mysql.com/doc/refman/5.0/en/sql-mode.html#sqlmode_strict_trans_tables

 

제가 디비 전문가가 아니라 거기에 대한 상세한 설명은 생략합니다.

 

 

그누보드에서는 sql_query("SET SESSION sql_mode = ''"); 와 같이 sql_mode 를 사용하지 않겠다고 설정합니다.

 

이유는 기본적으로 STRICT_ 가 포함된 sql_mode 가 설정 되어 있을시에 SQL 구문 검사가 엄격하게 이루어 지기 때문에, 기존 소스나 스킨에서 많은 에러를 발생하게 되기 때문입니다.

 

 

if (defined(G5_TIMEZONE))

 

"G5_TIMEZONE" 가 설정되어 있다면 어떤 행위를 하겟다는 조건절입니다.

 

그러나 현재 그누보드에선 기본적으로 "G5_TIMEZONE" 가 셋팅되어있지는 않습니다.

 

만약 mysql 서버의 기본 타임존이 Asia/Seoul 로 설정되어 있지 않다면,

 

config.php 에 define('G5_TIMEZONE', 'Asia/Seoul'); 과 같이 설정을 추가하여

 

sql_query(" set time_zone = '".G5_TIMEZONE."'"); 가 실행 될수 있도록 하면 됩니다.

 

"set time_zone" 역시 "set names" 나 "SET SESSION sql_mode = 'modes'" 와 같이 현재 세션에서만 mysql 서버의 타임존을 지정한 시간대로 설정하겠다는 명령입니다.

 

 

 

else {

?>

 

<!doctype html>

<html lang="ko">

<head>

<meta charset="utf-8">

<title>오류! <?php echo G5_VERSION ?> 설치하기</title>

<link rel="stylesheet" href="install/install.css">

</head>

<body>

 

<div id="ins_bar">

    <span id="bar_img">GNUBOARD5</span>

    <span id="bar_txt">Message</span>

</div>

<h1>그누보드5를 먼저 설치해주십시오.</h1>

<div class="ins_inner">

    <p>다음 파일을 찾을 수 없습니다.</p>

    <ul>

        <li><strong><?php echo G5_DATA_DIR.'/'.G5_DBCONFIG_FILE ?></strong></li>

    </ul>

    <p>그누보드 설치 후 다시 실행하시기 바랍니다.</p>

    <div class="inner_btn">

        <a href="<?php echo G5_URL; ?>/install/"><?php echo G5_VERSION ?> 설치하기</a>

    </div>

</div>

<div id="ins_ft">

    <strong>GNUBOARD5</strong>

    <p>GPL! OPEN SOURCE GNUBOARD</p>

</div>

 

</body>

</html>

 

<?php

    exit;

}

 

이 부분은 지정된 디비 환경 설정파일이 존재하지 않을시 그누보드 설치 화면으로 보내기 위한 부분입니다. 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 12개

열심히 보고 있습니다...^^
네 감사합니다.

게시글 목록

번호 제목
20318
20317
20316
20315
20314
20313
20312
20311
20310
20309
20308
20307
20306
20303
20302
20301
20300
20299
20298
20297
20296
20295
20294
20293
20292
8222
20291
20290
20289
20288
20287
20286
20285
20284
20283
20282
20281
20280
20276
20275
20274
20273
8216
20272
20271
20270
20269
20268
20267
20265
20264
20263
20262
20261
20259
20258
20257
20256
20255
20254
20253
20252
20251
20250
20249
31028
20248
20247
20246
8215
20245
20244
20243
20242
20241
20240
20239
20238
20237
20236
20235
20234
20233
8197
20232
20231
20230
20229
20228
20227
20225
20224
20223
20222
20221
20220
20219
20218
20217
20216