2010/08/31 20:51
<?
// 2010.04.21 by ohead (ohead.tistory.com)
//config.db.ini
$database['master'] = array('db_ip'=>'', 'db_name'=>'', 'db_user'=>'', 'db_passwd'=>'', 'connect'=>0);
$database['slave'][] = array('db_ip'=>'', 'db_name'=>'', 'db_user'=>'', 'db_passwd'=>'', 'connect'=>0);
?>
<?php
// 2010.04.21 by ohead
if (!defined("_MYSQL_PHP_DEFINED_"))
{
define("_MYSQL_PHP_DEFINED_", 1 );
}
else
{
print '========== _MYSQL_PHP_DEFINED_ ==========<br />';
exit;
return;
}
class mysql
{
var $server = 'master';
var $database = 0;
var $arr_randomDB = array('slave');
// 최기함수 : 기본 서버는 master로 설정
function mysql(&$database, $server = 'master')
{
$this->database = &$database;
$this->server = $server;
register_shutdown_function(array($this, '_mysql'));
}
function _mysql()
{
$this->close();
}
// 데이터베이스 연결설정
function connect()
{
//$arr_randomDB 의경우 SELECT 랜덤처리
if(in_array($this->server, $this->arr_randomDB, true))
{
foreach($this->database[$this->server] as $val)
{
//기존 $arr_randomDB 커넥션이 존재할경우 기존 커넥션을 이용한다.
if($val['connect'])
{
return $val['connect'];
}
}
$randSlaveCount = rand()%(count($this->database[$this->server]));
$current_db = &$this->database[$this->server][$randSlaveCount];
}
else
{
$current_db = &$this->database[$this->server];
}
if(true == empty($current_db['connect']))
{
if( empty($current_db['db_ip']) ||empty($current_db['db_name']) ||empty($current_db['db_user']) ||empty($current_db['db_passwd']))
{
$this->ErrMsg('데이터베이스 설정이 잘못되었습니다');
}
$current_db['connect'] = @mysql_connect( $current_db['db_ip'], $current_db['db_user'], $current_db['db_passwd'], 1) or $this->ErrMsg('데이터베이스 연결을 실패했습니다');
@mysql_query('set names euckr', $current_db['connect']);
@mysql_select_db($current_db['db_name'], $current_db['connect']);
}
return $current_db['connect'];
}
// 데이터베이스 연결 종료
function close($this_server = 0)
{
if(in_array($this_server, $this->arr_randomDB, true))
{
$arr_current_db = &$this->database[$this_server];
}
else
{
$arr_current_db = &$this->database;
}
foreach($arr_current_db as $server => $db)
{
if(in_array( $server, $this->arr_randomDB, true))
{
$this->close($server);
}
else if( 0 != $db['connect'])
{
@mysql_close($arr_current_db[$server]['connect']);
$arr_current_db[$server]['connect'] = 0;
}
}
}
// 단순 쿼리
function Query($qry, $server = 'master')
{
if(defined("_MYSQL_PHP_DEBUG_"))
{
print($server.":qry = ".$qry." \n");
}
if($this->database[$server])
{
$this->server = $server;
}
else
{
$this->ErrControl($server, $qry);
return null;
}
$qry = '/* REMOTE_ADDR : '.$_SERVER['REMOTE_ADDR'].' REQUEST_URI : '.$_SERVER['REQUEST_URI'].'*/ '.$qry;
$result = mysql_query($qry, $this->connect());
if(true == empty($result))
{
$this->ErrControl($server, $qry);
return null;
}
return $result;
}
// 쿼리 결과와 mysql_num_rows
function QueryCnt($qry, $server = 'master')
{
$result['result'] = $this->Query($qry, $server);
if(false == empty($result['result']))
{
$result['cnt'] = mysql_num_rows($result['result']);
}
else
{
$result['cnt'] = -1;
}
return $result;
}
// 쿼리 결과와 mysql_insert_id
function QueryIdx($qry, $server = 'master')
{
$result['result'] = $this->Query($qry, $server);
if(false == empty($result['result']))
{
$last_id = $this->Query("SELECT LAST_INSERT_ID()", $server);
if(false == empty($last_id))
{
$result['idx'] = mysql_result($last_id, 0, 0);
return $result;
}
//$result['idx'] = mysql_insert_id();
return $result;
}
return null;
}
function ErrControl($server, $query)
{
if(defined("_MYSQL_PHP_DEBUG_"))
{
if(false == is_null($query))
{
$message = "<b>A fatal MySQL error occured</b>.\n<br />Server: ".$server."<br />Query: ".$query."<br /><b>\nError: (".mysql_errno().")".mysql_error()."</b><br/>";
}
else
{
$message = "<b>A fatal MySQL error occured</b>.\n<br />Server: ".$server."<br /><b>\nError: (".mysql_errno().")".mysql_error()."</b><br/>";
}
print($message);
}
exit;
}
// 레코드 수를 리턴하는 함수
function Cnt($server, $table_name, $where="", $fields="")
{
$fields = $fields? 'count('.$fields.')' : 'count(*)';
$qry = 'SELECT '.$fields.' FROM '.$table_name.' '.$where;
//print $qry."<BR>";
$result = $this->Query($qry, $server);
if(false == empty($result))
{
$row = mysql_fetch_row($result);
return empty($row['0']) ? 0 : $row['0'];
}
return null;
}
// 합계함수
function sum($server, $table_name, $where="",$fields)
{
$qry = 'SELECT sum('.$fields.') FROM '.$table_name.' '.$where;
$result = $this->Query($qry, $server);
if(false == empty($result))
{
$row = mysql_fetch_row($result);
if(empty($row['0']))
{
return 0;
}
return $row['0'];
}
return null;
}
// 일반적인 Select 함수
function Select($server, $table_name, $where="", $fields="*")
{
$qry = 'SELECT '.$fields.' FROM '.$table_name.' '.$where;
return $this->Query($qry, $server);
}
// Select와 레코드수를 함께 리턴하는 함수
function selectCnt($server, $table_name, $where="", $fields="*")
{
$qry = 'SELECT '.$fields.' FROM '.$table_name.' '.$where;
return $this->QueryCnt($qry, $server);
}
// 필드하나의 값만 가지고 오는 함수
function selectOne($server, $table_name, $where="", $fields)
{
$qry = 'SELECT '.$fields.' FROM '.$table_name.' '.$where.' limit 1';;
$result = $this->Query($qry, $server);
if(false == empty($result))
{
$row = mysql_fetch_row($result);
return $row['0'];
}
return null;
}
// 레코드 하나만 쿼리하는 함수
function Row($server, $table_name, $where="", $fields="*", $chk=0)
{
$qry = 'SELECT '.$fields.' FROM '.$table_name.' '.$where.' limit 1';
$result = $this->Query($qry, $server);
if(false == empty($result))
{
if(0 == $chk)
{
return mysql_fetch_assoc($result);
}
return mysql_fetch_row($result);
}
return null;
}
// 레코드를 삭제하는 함수
function Del($server, $table_name, $where="")
{
if(in_array($server, $this->arr_randomDB))
{
print 'arr_randomDB 로 유입된 delete 쿼리 ';
exit;
}
$qry = 'DELETE FROM '.$table_name.' '.$where;
return $this->Query($qry, $server);
}
// Set 방식의 삽입 함수
function insertSet($server, $table_name, $val)
{
if(in_array($server, $this->arr_randomDB))
{
print 'arr_randomDB 로 유입된 insert 쿼리 ';
exit;
}
$qry='INSERT INTO '.$table_name.' SET '.$val;
return $this->Query($qry, $server);
}
// Set 방식의 삽입함수 : mysql_insert_id() 리턴
function insertSetIdx($server, $table_name, $val)
{
if(in_array($server, $this->arr_randomDB))
{
print 'arr_randomDB 로 유입된 insert 쿼리 ';
exit;
}
$qry='INSERT INTO '.$table_name.' SET '.$val;
return $this->QueryIdx($qry, $server);
}
// 레코드 정보 업데이트 함수
function update($server, $table_name, $where='', $fields='')
{
if(in_array($server, $this->arr_randomDB))
{
print 'arr_randomDB 로 유입된 update 쿼리 ';
exit;
}
$qry='UPDATE '.$table_name.' SET '.$fields.' '.$where;
return $this->Query($qry, $server);
}
#롤백관련
function rollback($server, $val=0)
{
if(0 == $val)
{
$qry='SET autocommit=0';
}
else if(1 == $val)
{
$qry='commit';
$this->rollback($server, 3);
}
else if(2 == $val)
{
$qry='rollback';
}
else if(3 == $val)
{
$qry='SET autocommit=1';
}
return $this->Query($qry, $server);
}
#롤백관련
function is_rollback($arr, $debug=false)
{
if(true == $debug)
{
print_r($arr);
}
$cnt = count($arr);
foreach($arr as $val)
{
if($val)
{
$cnt--;
}
}
return ($cnt == 0) ? 1 : 0;
}
function ErrMsg($msg,$exit = false)
{
if($msg)
{
print "<Script language='JavaScript'>";
print "alert(\"".$msg."\");";
//print "history.back();";
print "</Script>";
if($exit)exit;
}
}
#테이블존재여부
function is_table($server, $table)
{
if(in_array($this->server, $this->arr_randomDB, true))
{
return;
}
$qry = 'SHOW TABLES LIKE \''.$table.'\'';
$result = $this->Query($qry, $server);
$row = mysql_fetch_assoc($result);
return $row? true : false;
}
#테이블 삭제후 생성
function truncate($server, $table)
{
$qry = 'TRUNCATE '.$table;
return $this->Query($qry, $server);
}
#최적 컬럼 타입 가져오기
function analyse($server, $table, $fields="*")
{
$qry = 'SELECT '.$fields.' FROM '.$table.' PROCEDURE ANALYSE()';
$result = $this->Query($qry, $server);
return $result;
}
// 기본 레코드 삽입 함수
function Insert($server, $table_name, $val)
{
if(in_array($server, $this->arr_randomDB))
{
print 'arr_randomDB 로 유입된 insert 쿼리 ';
exit;
}
$qry='INSERT INTO '.$table_name.' VALUES ('.$val.')';
return $this->Query($qry, $server);
}
}
?>
