Postgresql DB的訪問PHP類
/**
- The generic DB access Class, Entry of all DB Access
- Only PG is supported -- 201210 *
- @author Anthony
- 2010-2012 reserved */ class DB { // Query types const SELECT = 1; const INSERT = 2; const UPDATE = 3; const DELETE = 4; /**
- True Value */ const T = 't'; /**
- False Value */ const F = 'f'; /**
- Null Value */ const N = 'N/A'; //NULL Value /**
- Specilize the value;
- 'f' as False, 't' as TRUE, 'N/A' as NULL value *
- @param String $s, Orignal Value *
- @return String, specilized value */ public static function specializeValue($s){ if($s === self::N){ return NULL; } if($s === self::T){ return True; } if($s === self::F){ return False; } return $s; } /**
- Batch insert into table
- @param String $table_name Table Name
- @param Array $cols columns of table
- @param Array $values, values array of data
- @param String/Array $return_cols Return column[s], 'id' is return by default,Array for multi Column
- @param String $db Instance name of DB Connection *
- @return Resultset return result set of return_cols */ public static function insert_batch($table_name,$cols,$values,$return_cols='id',$db='default'){ $_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column($cols,$db).') values '; $_vsql = array(); foreach ($values as $value){ $_vsql[] = '('.self::quote($value).')'; } $_sql .= implode(',',$_vsql); $_sql .= ' returning '.self::quote_column($return_cols); return self::query(self::SELECT,$_sql)->execute($db)->as_array(); } /**
- Insert into table from Array Data, and return column[s], ID is return by default *
- @param String $table_name Table Name
- @param Array $data Array Data Of key value pairs.
- @param String/Array $return_cols Return column[s], 'id' is return by default,Array for multi Column
- @param String $db Instance name of DB Connection *
- @return Boolean/Resultset True if success without return column, False if failed, value of column[s] if return_cols presented. */ public static function insert_table($table_name,$data,$return_cols='id',$db='default'){ if (!is_array($data)){ return false; } if (is_null($return_cols)){ $_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') values ('. self::quote(array_values($data),$db).')'; return self::query(self::INSERT,$_sql)->execute($db); } //Specialize value $data = array_map('self::specializeValue',$data); if (is_string($return_cols)){ $_sql = 'insert into '.self::quote_table($table_name,$db).'('.self::quote_column(array_keys($data),$db).') values ('. self::quote(array_values($data),$db).')'." returning ".$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).') values ('. self::quote(array_values($data),$db).')'." returning ".$ids; $r_ids = self::query(self::SELECT,$_sql)->execute($db)->current(); return $r_ids; } } return false; } /**
- Update Table data, and compare with reference data *
- @param String $table_name Table Name
- @param Integer $id ID of data
- @param Array $data Array Data Of key value pairs.
- @param Array $refdata Reference data
- @param String $id_name Column name of ID
- @param String $db Instance name of DB Connection *
- @return Integer Affected Rows,False if failed! */ public static function update_data($table_name,$id,$data,$refdata,$id_name='id',$db='default'){ if (!is_array($data)){ throw new exception('Data should be col=>val pairs array'); } 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{ throw new exception('refdata type error'); } } //Specialize value $data = array_map('self::specializeValue',$data); if(count($data)>0){ return self::update_table($table_name,$id,$data,'id',$db); }else{ return 0; } } /**
- Update table with data without checking the referenced Data *
- @param String $table_name Table Name
- @param Integer $id ID of data
- @param Array $data Array Data Of key value pairs.
- @param String $id_name Column name of ID
- @param String $db Instance name of DB Connection *
- @return Integer Affected Rows,False if failed! */ public static function 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).' set '.self::quote_assoicate($data,'=',',',$db).' where '. self::quote_column($id_name,$db).'='.self::quote($id,$db); return self::query(self::UPDATE,$_sql)->execute($db); } /**
- quote key value pair of col => values *
- @param Array $data, col=>value pairs
- @param String $concat, default '='
- @param String Delimiter, default ','
- @param String Database instance *
- @return String */ public static function 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; } /**
- Quote cols *
- @param String $value, The column[s] name
- @param String $db, Database Instance Name */ public static function quote_column($value,$db='default'){ if(!is_array($value)){ return self::quote_identifier($value,$db); }else{ //quote_column array and implode $_qs = array(); foreach ($value as $ele){ $_qs[] = self::quote_column($ele,$db); } $_quote_column_String = implode(',',$_qs); return $_quote_column_String; } } /**
- Quote the values to escape *
- @param Scalar/Array $value *
- @return quote string or array */ public static function quote($value,$db='default'){ if(!is_array($value)){ return Database::instance($db)->quote($value); }else{ //Quote array and implode $_qs = array(); foreach ($value as $ele){ $_qs[] = self::quote($ele,$db); } $_quoteString = implode(',',$_qs); return $_quoteString; } } /**
- Escape string of DB *
- @param string $s table name
- @param String $db Database instance name *
- @return String */ public static function escape($s,$db='default'){ return Database::instance($db)->escape($s); } /**
- Quote Table name *
- @param string $s table name
- @param String $db Database instance name *
- @return String */ public static function quote_table($s,$db='default'){ return Database::instance($db)->quote_table($s); } /**
- Quote a database identifier, such as a column name. *
- $column = DB::quote_identifier($column,'default'); *
- You can also use SQL methods within identifiers. *
- // The value of "column" will be quoted
- $column = DB::quote_identifier('COUNT("column")'); *
- Objects passed to this function will be converted to strings.
- [Database_Query] objects will be compiled and converted to a sub-query.
- All other objects will be converted using the '__toString' method. *
- @param mixed $value any identifier
- @param String $db, Database instance
- @return string */ public static function quote_identifier($value,$db='default'){ return Database::instance($db)->quote_identifier($value); } /**
- Get Connection for Database instance *
- @param String $db Database Instance name *
- @return Connection of Databse */ public static function getConnection($db = 'default'){ return Database::instance($db)->getConnection(); } /**
- Get Children of current record *
- @param String $table Table name
- @param Bollean $returnSql
- @param Integer $pid Parent Id of table record
- @param String $idname ID column name
- @param String $pidname Parent ID column name
- @param String $db Database Instance name *
- @return Records of Children / public static function getChildren($table,$returnSql = false ,$pid= '0',$idname='id',$pidname='pid' ,$db='default'){ $_sql = 'select from '.self::quote_table($table,$db).' where '.$pidname.'='.self::quote($pid,$db). " and $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; } } /**
- Tree query for connect by,traverse all the child records of Data *
- @param String $tableName Tablename
- @param Boolean $returnSql Return SQL String if TURE
- @param String $startWith Begin valueof traverse
- @param String $idCol ID Column name
- @param String $pidCol Parent ID Column name
- @param String $orderCol Order Column
- @param Integer $maxDepth Depth of traverse,
- @param Integer $level Start Level
- @param String $delimiter Delimiter of branch
- @param String $db Database configuration instance *
- @return Record/String Return Record array or String of SQL / public static function getTree($tableName,$returnSql=false,$startWith='0',$idCol='id',$pidCol='pid', $orderCol='id', $maxDepth=0,$level = 0,$delimiter = ';',$db='default'){ $_funcParas = array(); $_funcParas[] = self::quote($tableName,$db); //Table|View $_funcParas[] = self::quote($idCol,$db); //ID column $_funcParas[] = self::quote($pidCol,$db); //Parent ID Column $_funcParas[] = self::quote($orderCol,$db); //Default Order by ASC $_funcParas[] = self::quote($startWith,$db); //Begin ID $_funcParas[] = self::quote($maxDepth,$db); //Depth of traverse $_funcParas[] = self::quote($delimiter,$db); //Delimitor of Branch,default ';' $_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; } } /**
- Start transaction *
- @param String $db Instance name of DB *
- @return Result set */ public static function begin($db='default'){ return DB::query(self::UPDATE, "BEGIN")->execute($db); } /**
- Define Savepoint *
- @param String $savepoint *
- @param String $db */ public static function savepoint($savepoint, $db='default'){ return DB::query(self::UPDATE, "SAVEPOINT ".$savepoint)->execute($db); } /**
- Rollback to Savepoint *
- @param String $savepoint *
- @param String $db Database Instance name */ public static function rollpoint($savepoint, $db='default'){ return DB::query(self::UPDATE, "ROLLBACK TO ".$savepoint)->execute($db); } /**
- Commit an transaction
- @param String DB connection */ public static function commit($db='default'){ return DB::query(self::UPDATE, "COMMIT")->execute($db); } public static function rollback($db='default'){ return DB::query(self::UPDATE, "ROLLBACK")->execute($db); } /**
- Create a new [Database_Query] of the given type. *
- // Create a new SELECT query
- $query = DB::query(self::SELECT, 'SELECT FROM users');
- // Create a new DELETE query
- $query = DB::query(self::DELETE, 'DELETE FROM users WHERE id = 5'); *
- Specifying the type changes the returned result. When using
- self::SELECT, a [Database_Query_Result] will be returned.
- self::INSERT queries will return the insert id and number of rows.
- For all other queries, the number of affected rows is returned. *
- @param integer type: self::SELECT, self::UPDATE, etc
- @param string SQL statement
- @param Boolean $as_object Return Result set as Object if true, default FALSE
- @param Array $params Query parameters of SQL, default array()
- @param String $stmt_name The query is Prepared Statement if TRUE,
- Execute Prepared Statement when $param is Not NULL
- Prepare Statement when $param is NULL *
- @return Database_Query */ public static function query($type, $sql = NULL ,$as_object = false,$params = array(),$stmt_name = NULL) { return new Database_Query($type, $sql,$as_object,$params,$stmt_name); } /**
- Gettting paginated page from Orignal SQL *
- @param String $sql SQL query
- @param UTL Object &$page UTL object of tempalte
- @param String $orderBy Order by column, default 'updated desc'
- @param String $dataPro Data Property Name, default 'data'
- @param String $pagePro Pagnation Frament property Name, default 'pagination'
- @param Array $config Pagination Configuration Array overider
- @param String $db Database Instance Name, default 'default'
- @param Boolean $as_object Populate Data as Object if TRUE, default TRUE
- @param String $_paginClass Class Name of pagination
- @return True if success */ public static function getPage($_sql,&$page,$orderBy ='updated desc', $dataPro='data',$pagePro = 'pagination', $config = NULL,$db = 'default',$as_object= true,$_paginClass='Pagination'){ $_csql = 'select count(1) as c from ('.$_sql.') st'; $_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; return false; } $page->{$dataPro} = $_data; $page->{$pagePro} = $_pagination; return true; } /**
- Get All roles of subordinate *
- @param Integer $role_id Integer User Role ID
- @param Boolean $quote Quote the SQL if ture, reutrn orignal SQL if false
- @param String $role_table Table of role hierarchy
- @param Integer $level Start Level of tree traverse
- @param String $db Database Instance name
- @return SQL String */ public static function getRoleTreeSql($role_id,$quote = false,$role_table,$level=0,$db='default'){ $_sql = 'select id from ('.self::getTree($role_table,true,$role_id,'id','pid','id', 0, //Maxdepth $level, //Level ';',$db).') utree'; if(!$quote) return $_sql; else return '('.$_sql.')'; } /**
- Getting SQL String to query Objects of subordinate and owned objects
- Child User Role Tree[CURT] *
- @param integer $role_id Role ID of user
- @param integer $user_id User ID
- @param String $role_table Table of Role
- @param Boolean $quote Quote the SQL if ture, reutrn orignal SQL if false
- @param String $roleCol Role ID column name
- @param String $ownerCol Owner ID column name
- @param String $db Database instance name
- @return SQL String */ public static function 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, //Level start with 1 $db). ' or '.$ownerCol.'='.self::quote($user_id,$db); if(!$quote) return $_sql; else return '('.$_sql.')'; } /**
- Array from tree query to tree *
- @param Array $eles , the record set from self::getTree
- @param String $elename, element name of node
- @param String $cldname, Child node name
- @param String $delimiter, The delimiter of branch *
- @return Object , Tree object of data
*/
public static function array2tree($eles,$elename,$cldname,$delimiter=';'){
if($elename == $cldname){
throw new Exception('Ele name equals cldname!');
}
$rtree = array();
foreach ($eles as $ele){
$_branch = $ele->branch;
//Log::debug('branch='.$_branch);
//The depth in the array
$_depths = explode($delimiter,$_branch);
if(count($_depths == 1)){
$_root = $_depths[0];
}
$_cur = &$rtree;
foreach ($_depths as $depth){
//Create NODE
if(!isset($_cur[$cldname])){
$_cur[$cldname] = array();
}
if(!isset($_cur[$cldname][$depth])){
$_cur[$cldname][$depth] = array();
$_cur = &$_cur[$cldname][$depth];
}else{
$_cur = &$_cur[$cldname][$depth];
}
}
$_cur[$elename] = $ele;
}
return $rtree[$cldname][$_root];
}
}
</pre>
本文由用戶 php7228 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!