이 코드는 직접 사용하기 위한 것이 아니라 단지 아이디어를 제공하기 위한 것입니다. 트리 하위 쿼리, 준비된 문 및 일괄 삽입을 포함하되 이에 국한되지 않는 PG의 다양한 기능에 대한 다양한 지원:
코드는 오랫동안 지속적으로 수정되어 확정된 사항이며 앞으로도 오랫동안 수정되지 않을 예정입니다.
- /**
- * 일반 DB 접근 클래스, 모든 DB 접근 항목
- * PG만 지원 -- 201210
- *
- * @author Anthony
- * 2010-2012 Reserved
- */
- class DB {
- // 쿼리 유형
- const SELECT = 1;
- const INSERT = 2;
- const UPDATE = 3;
- const DELETE = 4;
- / **
- * 진정한 가치
- */
- const T = 't';
- /**
- * 잘못된 값
- */
- const F = 'f';
- /**
- * Null 값
- */
- const N = '해당 없음'; //NULL 값
- /**
- * 값 지정;
- * 'f'는 False, 't'는 TRUE, 'N/A'는 NULL 값
- *
- * @param String $s, Orignal Value
- *
- * @return 문자열, 특정 값
- */
- public static function SpecializeValue($s){
- if($s === self::N){
- NULL 반환;
- }
- if($s === self::T){
- return True;
- }
- if($s == = self::F){
- return False;
- }
- return $s;
- }
- /**
- * 테이블에 일괄 삽입
- * @param String $table_name 테이블 이름
- * @param Array $cols 테이블 열
- * @param Array $values, 값 데이터 배열
- * @ param String/Array $return_cols 반환 열(들), 기본적으로 'id'가 반환됨, 다중 열의 경우 배열
- * @param String $db DB 연결 인스턴스 이름
- *
- * @return Resultset return return_cols의 결과 세트
- */
- 공개 정적 함수 insert_batch($table_name,$cols,$values,$return_cols='id',$db='default'){
- $_sql = ''.self::quote_table($table_name,$에 삽입) db).'('.self::quote_column($cols,$db).') 값 ';
- $_vsql = array();
- foreach ($values as $value){
- $ _vsql[] = '('.self::quote($value).')';
- }
- $_sql .= implode(',',$_vsql);
- $_sql .= ' return '.self::quote_column($return_cols);
- return self::query(self::SELECT,$_sql)->execute($db)->as_array ();
- }
-
- /**
- * Array Data에서 테이블에 삽입하고 컬럼[들]을 반환하면 기본적으로 ID가 반환됩니다.
- *
- * @param String $table_name Table Name
- * @param Array $data Array Data Of 키 값 쌍.
- * @param String/Array $return_cols 컬럼[들]을 반환, 기본적으로 'id'가 반환됨, 다중 Column의 경우 Array
- * @param String $db DB Connection 인스턴스 이름
- *
- * @return Boolean/Resultset 반환 열 없이 성공하면 True, 실패하면 False, return_cols가 있으면 열 값입니다.
- */
- 공개 정적 함수 insert_table($table_name,$data,$return_cols='id',$db='default'){
- if (!is_array($data)){
- return false;
- }
-
- if (is_null($return_cols)){
- $_sql = ''.self에 삽입 ::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') 값 ('.
- self::quote(array_values($data), $db).')';
- return self::query(self::INSERT,$_sql)->execute($db);
- }
-
- //특수 값
- $data = array_map('self::specializeValue',$data);
-
- if (is_string($return_cols)){
- $_sql = ''.self::quote_table($table_name)에 삽입 ,$db).'('.self::quote_column(array_keys($data),$db).') 값 ('.
- self::quote(array_values($data),$db).') '." 반환 ".$return_cols;
-
- $id = self::query(self::SELECT,$_sql)->execute($db)->get($return_cols);
- return $id;
- }else{
- if (is_array($return_cols)){
- $ids = implode(',',$return_cols);
- $_sql = 'insert into '. self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') 값 ('.
- self::quote(array_values($data) ,$db).')'." 반환 ".$ids;
- $r_ids = self::query(self::SELECT,$_sql)->execute($db)->current();
- $r_ids 반환;
- }
- }
-
- false 반환;
- }
-
-
- /**
- * 테이블 데이터 업데이트 및 참조 데이터와 비교
- *
- * @param String $table_name 테이블 이름
- * @param Integer $id 데이터 ID
- * @param Array $data Array 키값 쌍의 데이터입니다.
- * @param Array $refdata 참조 데이터
- * @param String $id_name ID의 컬럼 이름
- * @param String $db DB Connection의 인스턴스 이름
- *
- * @return 정수 영향을 받는 행, 실패하면 거짓!
- */
- 공개 정적 function update_data($table_name,$id,$data,$refdata,$id_name='id',$db='default'){
- if (!is_array($data)){
- 새로운 예외 발생( '데이터는 col=>val 쌍 배열이어야 합니다.');
- }
- foreach($data as $k => $v){
- if(is_array($refdata)){
- if(isset($refdata[$k])){
- if($v == $refdata[$k]){
- unset($data[$k]);
- }
- }
- }elseif(is_object($refdata)){
- if(isset($refdata->$k)){
- if($v == $refdata->$k){
- unset($data[$k]);
- }
- }
- }else{
- 새로 던지기 예외('refdata 유형 오류');
- }
- }
-
- //값 특수화
- $data = array_map('self::specializeValue',$data);
-
- if(count($data)>0){
- return self::update_table($table_name,$id,$data,'id',$db);
- }else{
- return 0;
- }
- }
-
- / **
- * 참조된 데이터를 확인하지 않고 데이터로 테이블 업데이트
- *
- * @param String $table_name 테이블 이름
- * @param Integer $id 데이터 ID
- * @param Array $data Array 키 값 쌍의 데이터입니다.
- * @param String $id_name ID의 열 이름
- * @param String $db DB Connection의 인스턴스 이름
- *
- * @return Integer 영향을 받는 행, 실패하면 False !
- */
- 공개 정적 함수 update_table($table_name,$id,$data,$id_name='id',$db='default'){
- if (!is_array($data) ){
- return false;
- }
-
- $_sql = 'update '.self::quote_table($table_name,$db).' '.self::quote_assoicate($data,'=',',',$db)'를 설정합니다. where '.
- self::quote_column($id_name,$db).'='.self::quote($id,$db);
- return self::query(self::UPDATE,$_sql )->execute($db);
- }
-
- /**
- * col =>의 키 값 쌍을 인용하세요. 값
- *
- * @param 배열 $data, col=>값 쌍
- * @param String $concat, 기본값 '='
- * @param 문자열 구분 기호, 기본값 ','
- * @param String 데이터베이스 인스턴스
- *
- * @return String
- */
- 공개 정적 함수 quote_assoicate($data,$concat='=',$delimiter=' ,',$db='default'){
- $_sql = '';
- $_sqlArray = array();
- foreach ($data as $k => $v){
- $_sqlArray[] = self::quote_column($k,$db).$concat.self::quote($v,$db);
- }
-
- $_sql = implode($delimiter, $_sqlArray);
- return $_sql;
- }
-
- /**
- * 인용 열
- *
- * @param String $value, 열 이름
- * @param String $db, 데이터베이스 인스턴스 이름
- */
- 공개 정적 함수 quote_column($value,$db='default'){
- if(!is_array($value)){
- return self::quote_identifier($value,$db);
- }else{ //quote_column 배열 및 파열
- $_qs = array();
- foreach ($value as $ele){
- $_qs[] = self::quote_column($ele,$db);
- }
-
- $_quote_column_String = implode(',', $_qs);
- return $_quote_column_String;
- }
- }
- /**
- * 이스케이프할 값을 인용하세요
- *
- * @param Scalar/Array $value
- *
- * @return 인용 문자열 또는 배열
- */
- 공개 정적 함수 quote($value,$db='default'){
- if(!is_array($value)){
- return Database::instance($db)->quote($value);
- }else{ //인용 배열 및 파열
- $_qs = array();
- foreach ($value as $ele){
- $_qs[] = self::quote($ele,$db);
- }
-
- $_quoteString = implode(',',$_qs);
- return $_quoteString;
- }
- }
-
- /**
- * DB의 이스케이프 문자열
- *
- * @param string $s 테이블 이름
- * @param String $db 데이터베이스 인스턴스 이름
- *
- * @return String
- */
- 공개 정적 함수 escape($s, $db='default'){
- return Database::instance($db)->escape($s);
- }
-
- /**
- * Quote 테이블 이름
- *
- * @param string $s 테이블 이름
- * @param String $db 데이터베이스 인스턴스 이름
- *
- * @return String
- */
- 공용 정적 함수 quote_table($s,$db='default'){
- return Database::instance($db)->quote_table($s);
- }
-
- /**
- * 열 이름과 같은 데이터베이스 식별자를 인용하세요.
- *
- * $column = DB::quote_identifier($column,'default');
- *
- * 식별자 내에서 SQL 메서드를 사용할 수도 있습니다.
- *
- * / / "column"의 값이 인용됩니다
- * $column = DB::quote_identifier('COUNT("column")');
- *
- * 이 함수에 전달된 개체는 문자열로 변환됩니다. .
- * [Database_Query] 개체가 컴파일되어 하위 쿼리로 변환됩니다.
- * 다른 모든 개체는 '__toString' 메서드를 사용하여 변환됩니다.
- *
- * @param mix $value 모든 식별자
- * @param String $db, 데이터베이스 인스턴스
- * @return string
- */
- 공개 정적 함수 quote_identifier($value,$db='default'){
- return Database::instance($db)->quote_identifier($value);
- }
-
- /**
- * 데이터베이스 인스턴스에 대한 연결 가져오기
- *
- * @param String $db 데이터베이스 인스턴스 이름
- *
- * @return 데이터베이스 인스턴스 연결
- */
- 공개 정적 함수 getConnection($db = 'default'){
- return Database::instance($db)->getConnection();
- }
-
- /**
- * 현재 레코드의 하위 항목 가져오기
- *
- * @param String $table 테이블 이름
- * @param Bollean $returnSql
- * @param Integer $pid 테이블 레코드의 상위 ID
- * @param String $idname ID 열 이름
- * @param String $pidname 상위 ID 열 이름
- * @param String $db 데이터베이스 인스턴스 이름
- *
- * @return 하위 레코드
- */
-
- 공개 정적 함수 getChildren($table,$returnSql = false ,$pid= '0',$idname='id',$pidname= 'pid' ,$db='default'){
- $_sql = ''.self::quote_table($table,$db)에서 *를 선택합니다.' 여기서 '.$pidname.'='.self::quote($pid,$db).
- " 및 $idname <>".self::quote($pid,$db);
- if($returnSql){
- return $_sql;
- }
-
- $_res = self::query(self::SELECT,$_sql,true)->execute($ db)->as_array();
- if($_res){
- return $_res;
- }else{
- return false;
- }
- }
-
- /**
- * 연결을 위한 트리 쿼리, Data의 모든 하위 레코드 순회
- *
- * @param String $tableName Tablename
- * @param Boolean $returnSql Return SQL String if TURE
- * @ param String $startWith 트래버스 시작 값
- * @param String $idCol ID 열 이름
- * @param String $pidCol 상위 ID 열 이름
- * @param String $orderCol 순서 열
- * @param Integer $maxDepth 트래버스 깊이,
- * @param 정수 $level 시작 레벨
- * @param String $delimiter 분기 구분 기호
- * @param String $db 데이터베이스 구성 인스턴스
- *
- * @ 레코드/문자열 반환 레코드 배열 또는 SQL 문자열 반환
- */
- 공개 정적 함수 getTree($tableName,$returnSql=false,$startWith='0',$idCol='id',$pidCol='pid', $orderCol=' id', $maxDepth=0,$level = 0,$delimiter = ';',$db='default'){
- $_funcParas = array();
- $_funcParas[] = self::quote ($테이블이름,$db); //테이블|뷰
- $_funcParas[] = self::quote($idCol,$db); //ID 열
- $_funcParas[] = self::quote($pidCol,$db); //상위 ID 열
- $_funcParas[] = self::quote($orderCol,$db); //ASC에 의한 기본 순서
- $_funcParas[] = self::quote($startWith,$db); //ID 시작
- $_funcParas[] = self::quote($maxDepth,$db); //횡단 깊이
- $_funcParas[] = self::quote($delimiter,$db); //분기 구분자, 기본값 ';'
-
- $_sql = 'select * from connectby('
- .implode(',',$_funcParas).')'
- .' as t(id int, pid int, level int, Branch text, pos int)';
- if($level > 0){
- $_sql .= ' where level >='.self:: quote($level,$db);
- }
-
- if($returnSql) return $_sql;
- $_res = self::query(self::SELECT,$_sql,true)- >execute($db)->as_array();
- if($_res){
- return $_res;
- }else{
- return false;
- }
- }
-
- /**
- * 트랜잭션 시작
- *
- * @param String $db DB의 인스턴스 이름
- *
- * @return 결과 집합
- */
- 공개 정적 함수 시작($db='default'){
- return DB::query(self::UPDATE, "BEGIN")-> ;execute($db);
- }
-
- /**
- * 저장점 정의
- *
- * @param String $savepoint
- *
- * @param String $db
- */
- public static function savepoint($savepoint, $db='default'){
- return DB: :query(self::UPDATE, "SAVEPOINT ".$savepoint)->execute($db);
- }
-
- /**
- * 저장 지점으로 롤백
- *
- * @param String $savepoint
- *
- * @param String $db 데이터베이스 인스턴스 이름
- */
-
- 공개 정적 함수 롤포인트($savepoint, $db='default'){
- return DB::query(self::UPDATE, "ROLLBACK TO ".$savepoint)->execute($db);
- }
-
- /**
- * 트랜잭션 커밋
- * @param String DB 연결
- */
-
- 공개 정적 함수 commit($db='default'){
- return DB::query(self::UPDATE, "COMMIT") ->execute($db);
- }
-
- 공개 정적 함수 롤백($db='default'){
- return DB::query(self::UPDATE, "ROLLBACK") ->실행($db);
- }
-
-
- /**
- * 해당 유형의 새로운 [Database_Query]를 생성합니다.
- *
- * // 새로운 SELECT 쿼리 생성
- * $query = DB::query(self::SELECT, 'SELECT * FROM users');
- *
- * // 새로운 DELETE 쿼리 생성
- * $query = DB::query(self::DELETE, 'DELETE FROM users WHERE id = 5');
- *
- * 유형을 지정하면 반환되는 결과가 변경됩니다.
- * self::SELECT를 사용하면 [Database_Query_Result]가 반환됩니다.
- * self::INSERT 쿼리는 삽입 ID와 행 수를 반환합니다.
- * 기타 모든 쿼리의 경우에는 영향을 받은 행이 반환됩니다.
- *
- * @param 정수 유형: self::SELECT, self::UPDATE 등
- * @param string SQL 문
- * @param Boolean $as_object 반환 결과 집합 as Object true인 경우 기본값은 FALSE
- * @param Array $params SQL의 쿼리 매개변수, 기본 array()
- * @param String $stmt_name 쿼리는 True인 경우 준비된 문,
- * 다음 경우에 준비된 명령문을 실행합니다. $param은 NULL이 아닙니다
- * $param이 NULL일 때 문 준비
- *
- * @return Database_Query
- */
- 공개 정적 함수 쿼리($type, $sql = NULL ,$as_object = false,$params = array(),$stmt_name = NULL)
- {
- return new Database_Query($type, $sql,$as_object,$params,$stmt_name);
- }
-
-
- /**
- * Orignal SQL에서 페이지가 매겨진 페이지 가져오기
- *
- * @param String $sql SQL 쿼리
- * @param UTL Object &$page tempalte의 UTL 객체
- * @param String $orderBy Order 열 기준, 기본값 'updated desc'
- * @param String $dataPro 데이터 속성 이름, 기본값 'data'
- * @param String $pagePro Pagnation Frament 속성 이름, 기본값 'pagination'
- * @param Array $config 페이지 매김 구성 배열 overider
- * @param String $db 데이터베이스 인스턴스 이름, 기본값 'default'
- * @param Boolean $as_object TRUE인 경우 데이터를 객체로 채우기, 기본값 TRUE
- * @param String $_paginClass 페이지네이션 클래스 이름
- * @return 성공하면 True
- */
- 공개 정적 함수 getPage($_sql,&$page,$orderBy ='업데이트된 설명', $dataPro='data',$pagePro = '페이지 매김',
- $config = NULL,$db = '기본값', $as_object= true,$_paginClass='페이지 매김'){
-
- $_csql = '('.$_sql.') st에서 c로 count(1)을 선택합니다.';
- $_c = DB::query(self::SELECT,$_csql)->execute($db)->get('c');
-
- if($config){
- $config['total_items'] = $_c;
- $_pagination = new $_paginClass($config);
- }else{
- $config = array();
- $config[' total_items'] = $_c;
- $_pagination = new $_paginClass($config);
- }
-
- $_sql .= ' order by '.$orderBy;
-
- if ($_pagination->offset){
- $_sql .= ' offset '.$_pagination->offset;
- }
- $_sql .= 'limit '.$_pagination->items_per_page;
-
- $_data = DB::query(self::SELECT,$_sql,$as_object)->execute($db)->as_array();
- if(!$_data){
- $page->{$dataPro} = false;
- $page->{$pagePro} = false;
- false를 반환합니다.
- }
-
- $page->{$dataPro} = $_data;
- $page->{$pagePro} = $_pagination;
- return true;
- }
-
- /**
- * 하위 역할 모두 가져오기
- *
- * @param Integer $role_id 정수 사용자 역할 ID
- * @param Boolean $quote ture인 경우 SQL 인용, false인 경우 원본 SQL 반환
- * @param String $role_table 역할 계층 테이블
- * @param Integer $level 트리 탐색 시작 수준
- * @param String $db 데이터베이스 인스턴스 이름
- * @return SQL String
- */
-
- 공개 정적 함수 getRoleTreeSql($role_id,$quote = false,$role_table,$level=0,$db='default'){
- $_sql = '('.self::getTree($role_table,true,$role_id,'id','pid','id',
- 0, //Maxlength
- $level에서 ID 선택, //레벨
- ';',$db).') utree';
- if(!$quote) return $_sql;
- else return '('.$_sql.')';
- }
-
- /**
- * 하위 개체 및 소유 개체의 개체를 쿼리하기 위한 SQL 문자열 가져오기
- * 하위 사용자 역할 트리[CURT]
- *
- * @param 정수 $role_id 사용자의 역할 ID
- * @param 정수 $user_id 사용자 ID
- * @param String $role_table 역할 테이블
- * @param Boolean $quote ture인 경우 SQL 인용, false인 경우 원래 SQL 반환
- * @param String $roleCol 역할 ID 열 이름
- * @param String $ownerCol 소유자 ID 열 이름
- * @param String $db 데이터베이스 인스턴스 이름
- * @return SQL 문자열
- */
- 공개 정적 함수 getCURTreeSql($role_id,$user_id,$role_table,$quote = true,
- $roleCol='role_id',$ownerCol = 'owner_id' ,$db='default'){
- $_sql = ' '.$roleCol.' in '.self::getRoleTreeSql($role_id,true,$role_table,
- 1, //레벨은 1로 시작
- $db). ' 또는 '.$ownerCol.'='.self::quote($user_id,$db);
- if(!$quote) return $_sql;
- else return '('.$_sql.') ';
- }
-
-
- /**
- * 트리 쿼리에서 트리로의 배열
- *
- * @param Array $eles , self::getTree
- 에서 설정된 레코드 * @param String $elename, 노드 요소 이름
- * @param String $cldname, 하위 노드 이름
- * @param String $delimiter, 분기 구분 기호
- *
- * @return Object , 데이터의 Tree 개체
- */
- 공개 정적 함수 array2tree($eles,$elename,$cldname,$delimiter=';'){
- if($elename = = $cldname){
- throw new Exception('Ele 이름은 cldname과 같습니다!');
- }
- $rtree = array();
- foreach ($eles를 $ele로){
- $_branch = $ele->branch;
- //Log::debug('branch='.$_branch);
- //배열의 깊이
- $_깊이 = 폭발($delimiter, $_branch);
- if(count($_lengths == 1)){
- $_root = $_lengths[0];
- }
- $_cur = &$rtree;
- foreach( $_깊이를 $깊이로){
- //노드 생성
- if(!isset($_cur[$cldname])){
- $_cur[$cldname] = array();
- }
-
- if(!isset($_cur[$cldname][$length])){
- $_cur[$cldname][$length] = array();
- $_cur = &$_cur [$cldname][$깊이];
- }else{
- $_cur = &$_cur[$cldname][$깊이];
- }
- }
- $_cur[$elename] = $ele;
- }
- return $rtree[$cldname][$_root];
- }
-
- }
-
复system代码
|