mysql 数据库访问层_MYSQL数据库访问层
/**
*?數據訪問層,僅處理MYSQL
*?包括
*?by:李勇
*?at:2009-01-19
*/final?classDalSplite{
public?function__construct(PDO?$pdo){
}
}/**
*?指定庫中的指定表的訪問類
*
*/final?classDalTable{
private$pdo;
private$tableName;
private$meta;
private$primaryKey;/**
*?構造方法
*
*?@param?PDO?$pdo
*?@param?string?$tableName
*/public?function__construct(PDO?$pdo,$tableName){
if(!is_string($tableName))?returnnull;$this->pdo=$pdo;$this->tableName=$tableName;$this->meta=false;$this->primaryKey=false;
return$this;
}/**
*?獲取本表的表結構(元數據),失敗時返回0
*
*?@return?0/array:=>array(列信息)
*/private?functiongetMeta(){
if($this->meta!==false)return$this->meta;$sql="DESCRIBE?".$this->tableName;$table=$this->query($sql);
if(!$tableor?!count($table)){$this->meta=0;
}else{$meta=array();
foreach?($tableas$col)?{$meta[$col['Field']]=$col;
}$this->meta=$meta;
}
return$this->meta;
}/**
*?獲取本表的主鍵字段,無主鍵或組合主鍵時返回0
*
*?@return?0/主鍵字段名
*/private?functiongetPrimaryKey(){
if($this->primaryKey!==false)return$this->primaryKey;$sql="SHOW?INDEX?FROM?".$this->tableName;$table=$this->query($sql);
if(!$tableor?!count($table)){$this->primaryKey=0;
}else{$pkvs=array();
foreach?($tableas$row)?{
if($row['Key_name']=='PRIMARY')$pkvs[]=$row['Column_name'];
}
if(count($pkvs)!=1){$this->primaryKey=0;
}else{$this->primaryKey=$pkvs[0];
}
}
return$this->primaryKey;
}/**
*?Enter?description?here...
*
*?@param?bool?$distinct????是否消重
*?@param?mixed?$fields?????請參考createFields
*?@param?mixed?$where??????請參考createWhere
*?@param?mixed?$groupby????請參考createGroupby
*?@param?mixed?$having?????請參考createHaving
*?@param?mixed?$orderby????請參考createOrderby
*?@param?mixed?$limit??????請參考createLimit
*?@return?mixed????單值/一維無鍵數組/一維有鍵數組/二維數組(一維無鍵,二維有鍵)
*/private?function_select($distinct,$fields=null,$where=null,$groupby=null,$having=null,$orderby=null,$limit=null){
if(is_object($fields))$fields=get_object_vars($fields);
if(!$whereand?!$groupbyand?!$havingand?!$orderbyand?!$limitandis_array($fields)?and?isset($fields['fields'])){
if(isset($fields['where']))$where=$fields['where'];
if(isset($fields['groupby']))$groupby=$fields['groupby'];
if(isset($fields['having']))$having=$fields['having'];
if(isset($fields['orderby']))$orderby=$fields['orderby'];
if(isset($fields['limit']))$limit=$fields['limit'];$fields=$fields['fields'];
return$this->_select($distinct,$fields,$where,$groupby,$having,$orderby,$limit);
}$fields=$this->createFields($fields);$where=$this->createWhere($where);$groupby=$this->createGroupby($groupby);$having=$this->createHaving($having);$orderby=$this->createOrderby($orderby);$limit=$this->createLimit($limit);$sql='SELECT?';
if($distinct)$sql.='DISTINCT?';$sql.=$fields;$sql.="?FROM?".$this->tableName."?";$sql.=$where.$groupby.$having.$orderby.$limit;$set=$this->query($sql);$rows=count($set);
if($rows)$cols=count($set[0]);
else$cols=0;
if($rows==1and$cols==1){$col=array();
foreach?($set[0]?as$cell)?{$col[]=$cell;
}
return$col[0];
}
if($rows==1){
return$set[0];
}
if($cols==1){$col=array();
foreach?($setas$row)?{$col[]=$row[0];
}
return$col;
}
return$set;
}/**
*?返回查詢結果
*??????請參考_select
*/public?functionselect($fields=null,$where=null,$groupby=null,$having=null,$orderby=null,$limit=null){
return$this->_select(false,$fields,$where,$groupby,$having,$orderby,$limit);
}/**
*?返回消重后的查詢結果
*??????請參考_select
*/public?functiondistinct($fields=null,$where=null,$groupby=null,$having=null,$orderby=null,$limit=null){
return$this->_select(true,$fields,$where,$groupby,$having,$orderby,$limit);
}/**
*?插入一條數據
*
*?@param?array[1]?$row
*??????=>
*?@return?int
*/public?functioninsert($row){
if(!$row)returnfalse;
if(is_object($row))$row=get_object_vars($row);
if(!is_array($row))returnfalse;$meta=$this->getMeta();$fields='';$values='';
foreach?($rowas$name=>$value){
if(!is_string($name))continue;
if(!isset($meta[$name]))continue;
if($fields)$fields.='?,?';$fields.=$name;
if($values)$value.='?,?';$values.="'".mysql_escape_string($value)."'";
}
if(!$fieldsor?!$values)returnfalse;$sql="INSERT?INTO?".$this->tableName.'('.$fields.')?VALUES('.$values.')';$count=$this->execute($sql);
if(!$count)returnfalse;
return$this->pdo->lastInsertId();
}/**
*?刪除表中的部分數據
*
*?@param?mixed?$where
*??????請參考createWhere
*?@return?int
*/public?functiondelete($where){$where=trim($this->createWhere($where));
if(!$where)returnfalse;$sql="DELETE?FROM?".$this->tableName."?".$where;
return$this->execute($sql);
}/**
*?刪除表中全部數據
*
*?@return?int
*/public?functiondeleteAll(){$sql="DELETE?FROM?".$this->tableName;
return$this->execute($sql);
}/**
*?修改表中的部分數據
*
*?@param?array[1]?$row
*??????=>
*?@param?mixed?$where
*??????請參考createWhere
*?@return?int
*/public?functionupdate($row,$where){
if(!$row)returnfalse;
if(is_object($row))$row=get_object_vars($row);
if(!is_array($row))returnfalse;$meta=$this->getMeta();$set='';
foreach?($rowas$name=>$value){
if(!is_string($name))continue;
if(!isset($meta[$name]))continue;
if($set)$set.='?,?';$set=$name."='".mysql_escape_string($value)."'?";
}
if(!$set)returnfalse;$where=$this->createWhere($where);
if(!$where)returnfalse;$sql="UPDATE?".$this->tableName."?SET?".$set."?".$where;
return$this->execute($sql);
}/**
*?生成字段列表
*
*?@param?mixed?$fields
*??????null/''/0???所有字段
*??????string??????直接使用
*??????object/array
*
*??????????=>
*?@return?string
*/private?functioncreateFields($fields=null){
if(!$fields)return'*';
if(is_string($fields))?returntrim($fields);
if(is_object($fields))$fields=get_object_vars($fields);
if(!is_array($fields))?return'*';$ret='';
foreach($fieldsas$key=>$value){
if(is_int($key)){
if(!is_string($value))continue;
if($ret)$ret.='?,?';$ret.=$value;
continue;
}
if(!is_string($value))continue;
if($ret)$ret.='?,?';$ret.=$key.'?AS?'.$value;
}
return$ret;
}/**
*?生成WHERE子句
*
*?@param?mixed?$where
*??????參考createCondition
*?@return?string
*/private?functioncreateWhere($where){$condition=$this->createCondition($where);
if(!$condition)return'';$condition=trim($condition);
if(strpos(strtoupper($condition),'WHERE')===0)return$condition;
return'WHERE?'.$condition;
}/**
*?生成HAVING子句
*
*?@param?mixed?$having
*??????參考createCondition
*?@return?string
*/private?functioncreateHaving($having){$condition=$this->createCondition($having);
if(!$condition)return'';$condition=trim($condition);
if(strpos(strtoupper($condition),'HAVING')===0)return$condition;
return'HAVING?'.$condition;
}/**
*?生成?GROUP?BY?子句
*
*?@param?mixed?$groupby
*??????參考createSort
*?@return?string
*/private?functioncreateGroupby($groupby){$sort=$this->createSort($groupby);
if(!$sort)return'';$sort=trim($sort);
if(strpos(strtoupper($sort),'GROUP')===0)return$sort;
return'GROUP?BY?'.$sort;
}/**
*?生成?ORDER?BY?子句
*
*?@param?mixed?$orderby
*??????參考createSort
*?@return?string
*/private?functioncreateOrderby($orderby=null){$sort=$this->createSort($orderby);
if(!$sort)return'';$sort=trim($sort);
if(strpos(strtoupper($sort),'ORDER')===0)?return$sort;
return'ORDER?BY?'.$sort;
}/**
*?生成列排序子句,用于Order?By與Group?By中
*
*?@param?mixed?$sort
*??????string??直接使用
*??????object/arrray
*???????????ASC|asc|DESC|desc
*??????????[|=>,...]
*?@return?string
*/private?functioncreateSort($sort=null){
if(!$sort)return'';
if(is_string($sort))?returntrim($sort);
if(is_object($sort))$sort=get_object_vars($sort);
if(!is_array($sort))?return'';
if(count($sort)==2and?(strtoupper($sort[1])=='ASC'orstrtoupper($sort[1])=='DESC'))?return$sort[0].'?'.strtoupper($sort[1]);$meta=$this->getMeta();$ret='';
foreach?($sortas$key=>$value)?{
if(is_int($key)){
if(!isset($meta[$value]))continue;
if($ret)$ret.='?,?';$ret.=$value;
continue;
}
if(strtoupper($value)=='ASC'orstrtoupper($value)=='DESC'){
if(!isset($meta[$key]))continue;
if($ret)$ret.='?,?';$ret.=$key.'?'.strtoupper($value);
continue;
}
continue;
}
return$ret;
}/**
*?生成分頁子句
*
*?@param?mixed?$limit
*??????string??直接使用,其中可包含LIMIT
*??????int?????只限制行數,不限制偏移
*??????object/array
*??????????[limit/LIMIT/Limit=>,Offset/offset/OFFSET=>]
*??????????[,]
*??????????[]
*?@return?string
*/private?functioncreateLimit($limit=null){
if(!$limit)return'';
if(is_string($limit)){$limit=trim($limit);
if(strpos(strtoupper($limit),'LIMIT')===0)?returnstrtoupper($limit);
return'LIMIT?'.$limit;
}
if(is_int($limit))?return'LIMIT?'.$limit;
if(is_object($limit))$limit=get_object_vars($limit);
if(!is_array($limit))return'';$l=null;$o=null;
if(isset($limit['Limit']))$l=$limit['Limit'];
if(isset($limit['limit']))$l=$limit['limit'];
if(isset($limit['LIMIT']))$l=$limit['LIMIT'];
if(isset($limit['Offset']))$o=$limit['Offset'];
if(isset($limit['offset']))$o=$limit['offset'];
if(isset($limit['OFFSET']))$o=$limit['OFFSET'];
if($l){
if($o){
return'LIMIT?'.$l.'?OFFSET?'.$o;
}
return'LIMIT?'.$l;
}
if(count($limit)==2){$l=$limit[1];$o=$limit[0];
return'LIMIT?'.$l.'?OFFSET?'.$o;
}
if(count($limit)==1)?return'LIMIT?'.$limit[0];
return'';
}/**
*?生成條件表達式,用于Where,Having子句中
*
*?@param?mixed?$condition
*??????string??直接使用
*??????int?????主鍵值
*??????object/array?and組合
*??????????PrimaryKey=>主鍵值
*??????????列名=>列值(string/int)
*?@return?string
*/private?functioncreateCondition($condition=null){
if(is_null($condition))?return'';
if(is_string($condition))?returntrim($condition);
if(is_int($condition)){
if($this->getPrimaryKey())
return$this->getPrimaryKey()."='".$condition."'?";
return'';
}
if(is_object($condition))$condition=get_object_vars($condition);
if(!is_array($condition))return'';
if(isset($condition['PrimaryKey'])){
if($this->getPrimaryKey())
return$this->getPrimaryKey()."='".mysql_escape_string($condition['PrimaryKey'])."'";
return'';
}$meta=$this->getMeta();$ret='';
foreach?($conditionas$key=>$value)?{
if(!is_int($key)){
if(!isset($meta[$key]))continue;
if(!is_int($value)&&!is_string($value))continue;
if(is_string($value))$value=trim($value);
if($ret)$ret.='?and?';$ret.='?'.$key."='".mysql_escape_string($value)."'?";
continue;
}
}
return$ret;
}/**
*?執行SQL語句,并返回影響的行數
*
*?@param?string?$sql
*?@return?int
*/public?functionexecute($sql){
if(!is_string($sql))?returnfalse;
return$this->pdo->exec(trim($sql));
}/**
*?查詢并返回結果集
*
*?@param?string?$sql
*?@return?array[2]
*/public?functionquery($sql){
if(!is_string($sql))?returnfalse;
return$this->pdo->query(trim($sql));
}
}/**
*?本程序包的異常類
*
*/classDalExceptionextendsException{//所有異常情況constDE_PARAMETER_TYPE=1001;
constDE_UNKNOWN=2000;//所有異常情況的文字表達static?private$msgs=array(self::DE_PARAMETER_TYPE=>'參數類型錯誤:類:的方法:的第個參數的類型應該是類型,但現在是類型,值為:',self::DE_UNKNOWN=>'未知錯誤');
public?function__construct($code=0,$msg=null)?{
if(isset(self::$msgs[$code])){
if(is_string($msg)){$message=$msg;
}else?if(is_array($msg)){$message=vsprintf(self::$msgs[$code],$msg);
}else{$message=self::$msgs[$code];
}
}else{$code=self::DE_UNKNOWN;
if(is_string($msg)){$message=$msg;
}else{$message='錯誤代碼:'.$code;
}
}parent::__construct($message,$code);
}
}
總結
以上是生活随笔為你收集整理的mysql 数据库访问层_MYSQL数据库访问层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 回滚段_MySQL和Post
- 下一篇: hive 行转列和列转行的方法_面试常考