首頁  >  文章  >  後端開發  >  parallels desktop 9 封裝一個PDO資料庫操作類別代碼

parallels desktop 9 封裝一個PDO資料庫操作類別代碼

WBOY
WBOY原創
2016-07-29 08:40:441045瀏覽

複製程式碼 程式碼如下:


/**
 * 資料庫PDO操作
 */
class MysqlPdo {
public static $PDOStatement = null;
/**
* 資料庫的連線參數配置
* @var array
* @access public
*/
public static $config = array();
/**
* 是否使用永久連線
* @var bool
* @access public
*/
public static $pconnect = false;
/**
* 錯誤訊息
* @var string
* @access public
*/
public static $error = ' ';
/**
* 單件模式,保存Pdo類別唯一實例,資料庫的連線資源
* @var object
* @access public
*/
受保護的靜態$link;
/**
* 是否已經連接資料庫
* @var bool
* @access public
*/
public static $connected = false;
/**
* 資料庫版本
* @var string
* @access public
*/
public static $dbVersion = null;
/**
* 目前SQL語句
* @var string
* @access public
*/
public static $queryStr = '';
/**
* 最後插入記錄的ID
* @var integer
* @access public
*/
public static $lastInsertId = null;
/**
* 回傳影響記錄數
* @var integer
* @access public
*/
public static $numRows = 0;
// 事務指令數
public static $transTimes = 0
/**
* 建構函數,
* @param $dbconfig 資料庫連接相關信息,array('ServerName', 'UserName', 'Password', 'DefaultDb', 'DB_Port', 'DB_TYPE')
*/
public function __construct($dbC => DB_HOST,
'使用者名稱' => DB_USER,
'密碼' => DB_PWD, 'database' => DB_NAME,
'hostport' => DB_PORT,
'dbms' => DB_TYPE,
'DB_TYPE.":host=".DB_HOST." ;dbname=".DB_NAME
);
}
if(empty($dbConfig['hostname'])) throw_exception("沒有定義資料庫設定");
self::$config = $dbConfig;
if(empty(self:: $config['params'])) self::$config['params'] = array();
/*************************************華麗分隔線************ *******************************/
if (!isset(self::$link) ) {
$configs = self::$config;
if(self::$pconnect) {
$configs['params'][constant('PDO::ATTR_PERSISTENT')] = true;
}
嘗試{
self::$link = new PDO( $configs['dsn'], $configs['用戶名'], $configs['密碼'],$configs['params ']);
} catch (PDOException $e) {
throw_exception($e->getMessage());
//exit('連線失敗:'.$e->getMessage()) ;
}
if(!self::$link) {
throw_exception('PDO 連接錯誤');
回傳錯誤;
}
self::$link-> exec('SET NAMES '.DB_CHARSET);
self::$dbVersion = self::$link->getAttribute(constant("PDO::ATTR_SERVER_INFO"));
// 標記連線成功
self::$connected = true;
// 登出資料庫連線設定資訊
unset($configs);
}
回傳self::$link;
}
/* *
* 釋放查詢結果
* @access function
*/
靜態函數free() {
self::$PDOStatement = null;
}
/************************************************** ******** ****** ************************************ ********** ************** *****/
/* 資料庫操作*/
/************************************************** **** ****** **************************************** ****** ************** *****/
/**
* 取得所有的查詢資料
* @access function
* @return array
*/
靜態函數getAll($sql=null) {
self::query($sql);
//回傳資料集
$result = self::$PDOStatement->fetchAll(constant('PDO::FETCH_ASSOC'));
傳回$結果;
}
/**
* 取得查詢結果
* @access function
* @param string $sql SQL指令
* @param integer $seek 指標位置
* @return array
*/
靜態函數getRow($sql=null) {
self::query($sql);
// 傳回資料庫集
$result = self::$PDOStatement->fetch (constant('PDO::FETCH_ASSOC'),constant('PDO::FETCH_ORI_NEXT'));
傳回$結果;
}
/**
* 執行sql語句,自動判斷進行查詢或執行操作
* @access function
* @param string $sql SQL指令
* @return mixed
*/
靜態函數doSql ($sql='') {
if(self::isMainIps($sql)) {
回傳self: :執行($sql);
}else {
回傳self::getAll ($sql);
}
}
/**
* 根據指定ID查找表中記錄(僅用於單表操作)
* @access function
* @param integer $priId 主鍵ID
* @param string $tables 資料表名
* @param string $fields 欄位名稱
* @return ArrayObject 表記錄
*/
靜態函數findById($tabName,$priId,$fields='*'){
$sql = 'SELECT %s來自%s,其中id=%d';
回傳self::getRow(sprintf($sql, self::parseFields($fields), $tabName, $priId));
}
/**
* 尋找記錄
* @access function
* @param string $tables 資料表名
* @param mixed $where 查詢條件
* @param string $fields 欄位名稱
* @param string $order 排序
* @param string $limit 取多少條資料
* @param string $group 分組
* @param string $having
* @param boolean $lock 是否加鎖
* @return ArrayObject
*/
靜態函數find($tables,$where="",$fields='*',$order=null,$limit=null,$group=null,$ having=null) {
$sql = 'SELECT '.self::parseFields($fields)
.' FROM '.$tables
.self::parseWhere($where)
.self ::parseGroup($group)
.self::parseHaving($having)
.self::parseOrder( $order)
.self::parseLimit($limit);
$dataAll = self::getAll($sql);
if(count($dataAll)==1){$rlt=$dataAll[0];}else{$rlt=$dataAll;}
return $rlt;
}
/**
* 插入(單一)記錄
* @access function
* @param mixed $data 資料
* @param string $table 資料表名
* @return false | integer
*/
static function add($data,$table) {
//過濾提交資料
$data=self::filterPost($table ,$資料);
foreach ($data as $key=>$val){
if(is_array($val) && strtolower($val[0]) == 'exp') {
$val = $值[1]; // 使用表達式???
}elseif (is_scalar($val)){
$val = self::fieldFormat($val);
}else {
//刪除複合物件
繼續;
}
$data[$key] = $val;
}
$fields = array_keys($data);
array_walk($fields, array($this, 'addSpecialChar'));
$fieldsStr = implode(',', $fields);
$values = array_values($data);
$valuesStr =$valuesStr = implode(',', $values);
$sql = '插入'.$table.' ('.$fieldsStr.') VALUES ('.$valuesStr.')';
回傳self:: execute($sql);
}
/**
* 更新記錄
* @access function
* @param mixed $sets 資料
* @param string $table 資料表名
* @param string $where 更新條件
* @param string $limit
* @param string $order
* @return false | integer
*/
靜態函數update($sets,$table,$where,$limit=0,$order='') {
$sets = self ::filterPost($table,$sets);
$sql = '更新'.$table.' SET '.self::parseSets($sets).self::parseWhere($where ).self::parseOrder($order).self::parseLimit($limit);
回傳self::execute($sql);
}
/**
* 儲存某個欄位的值
* @access function
* @param string $field 要儲存的欄位名稱
* @param string $value 欄位值
* @param string $ table 資料表
* @param string $where 儲存條件
* @param boolean $asString 欄位值是否為字串
* @return void
*/
static function setField($field, $value, $table, $c $asString=false) {
// 如果有'(' 視為SQL 指令更新否則更新欄位內容為純字串
if( false === strpos($value,'(') || $asString) $value = '"'.$value.'"';
$sql = 'UPDATE '.$table.' SET '.$ field.'='.$value.self::parseWhere($condition);
回傳self::execute($sql); >}
/**
* 刪除記錄
* @access function
* @param mixed $where 為條件Map、Array或String
* @param string $table 資料表名
* @param string $limit
* @param string $order
* @return false | integer
*/
靜態函式刪除($where,$table,$limit='',$order='') {
$sql = 'DELETE FROM '. $table.self::parseWhere($where).self::parseOrder($order ).self::parseLimit($limit);
回傳self::execute($sql)
}
/**
+---------------------------------------------- ------------
* 修改或儲存資料(僅用於單表操作)
* 有主鍵ID則為修改,無主鍵ID則為增加
* 修改記錄:
+-------------------------------------------- --------------
* @access function
+------------------------- ---------------------------------
* @param $tabName 表名
* @param $ aPost 提交表單的$_POST
* @param $priId 主鍵ID
* @param $aNot 要排除的一個字段或數組
* @param $aCustom 自訂的數組,附加到資料庫中保存
* @param $isExits 是否已經存在存在:true, 不存在:false
+--------------------------- -------------------------------
* @return Boolean 修改或保存是否成功
+--- -------------------------------------------------- -----
*/
靜態函式saveOrUpdate($tabName, $aPostost , $priId="", $aNot="", $aCustom="", $isExits=false) {
if(空白($tabName) || !is_array($aPost) || is_int($aNot) ) 回傳false; ;
if(is_array($aNot) && is_int(key($aNot))) $aPost = array_diff_key($aPost, array_flip($aNot));
if(is_array($aCustom) && is_string(key) ($aCustom))) $aPost = array_merge($aPost,$aCustom)
if (empty($priId) && !$isExits) { // 新增
$aPost = array_filter( $aPost, array ($this, 'removeEmpty'));
回傳self::add($aPost, $tabName);
} else { //修改
return self::update($aPost , $tabName, "id=".$priId);
}
}
/**
* 取得最近一次查詢的sql語句
* @access function
* @param
* @return String 執行的SQL
*/
靜態函數getLastSql() {
$link = self::$link;
if (!$link) 回傳false;
回傳self: :$queryStr;
}
/**
* 取得最後插入的ID
* @access function
* @param
* @return integer 最後插入時的資料ID
*/
靜態函數getLastInsId(){
$link = self::$link;
if (!$link) 回傳false;
回傳self::$lastInsertId;
}
/**
* 取得DB版本
* @access function
* @param
* @return string
*/
靜態函數getDbVersion(){
$link = self::$link;
if ( !$link ) 回傳false;
回傳self::$dbVersion;
}
/**
* 取得資料庫的表格資訊
* @access function
* @return array
*/
靜態函數getTables() {
$info = array();
if(self::query("顯示表格")) {
$result = self::getAll();
foreach ($result as $key => $val) {
$info[$key] = current($val);
}
}
回傳$info;
}
/**
* 取得資料表的欄位資訊
* @access function
* @return array
*/
static function getFields($tableName) {
//取得資料庫連線
$link = self::$link;
$sql = "選擇
ORDINAL_POSITION ,COLUMN_NAME, COLUMN_TYPE, DATA_TYPE, COLUMN_DEFAULT, ,COLUMN_KEY,額外, COLUEMAMN_MENT TABLE_NAME = :tabName AND TABLE_SCHEMA='".DB_NAME."'";
self::$queryStr = sprintf($sql, $tableName);
$sth = $link->prepare($sql);
$sth ->bindParam(':tabName', $tableName);
$sth->execute();
$result = $sth->fetchAll(constant('PDO::FETCH_ASSOC'));
$info = array();
foreach ($result as $key => $val) {
$info[$val['COLUMN_NAME']] = array(
'postion' => $val ['ORDINAL_POSITION'] ,
'name' => $val['COLUMN_NAME'],
'type' => $val['COLUMN_TYPE'],
'd_type' => $val[' DATA_TYPE' ],
'length' => $val['MAXCHAR'],
'notnull' => (strtolower($val['IS_NULLABLE']) == "no"),
'預設' => $val['COLUMN_DEFAULT'],
'primary' => (strtolower($val['COLUMN_KEY']) == 'pri'),
'autoInc' => ( strtolower($ val['EXTRA']) == 'auto_increment'),
'comment' => $val['COLUMN_COMMENT']
);
}
// 有錯誤則發送異常
self::haveErrorThrowException();
回傳$訊息;
}
/**
* 關閉資料庫
* @access function
*/
靜態函式close() {
self::$link = null;
}
/**
* SQL指令安全過濾
* @access function
* @param string $str SQL指令
* @return string
*/
靜態函數escape_string($str) {
return addslashes($str);
}
/************************************************** **** **** ****************************************** ******** ****** ***** /
/* 內部操作方法*/
/************************************************** ******** ********************************************** ************ ****** *****/
/**
* 有錯誤拋出例外
* @access function
* @return
*/
靜態函數hasErrorThrowException() {
$obj = 空( self::$PDOStatement) ? self::$link : self::$PDOStatement;
$arrError = $obj->errorInfo();
if(count($arrError) > 1) { // 有錯誤訊息
//$this->rollback();
self::$error = $arrError[2]。 "

> [ SQL 語句] : ".self::$queryStr;
//拋出例外($this->error);
拋出例外(self::$ error);
傳回錯誤;
}
//主要針對execute()方法傳送例外狀況
if(self::$queryStr=='')throw_exception('查詢為空

; [ SQL 語句] :');
}
/**
* where分析
* @access function
* @param mixed $where 查詢條件
* @return string
*/
靜態函數parseWhere($where) {
$whereStr = '';
if(is_string($where) || is_null($where)) {
$whereStr = $where;
}
回空($whereStr)?'':' WHERE '.$whereStr '.$whereStr ;
}
/**
* order分析
* @access function
* @param mixed $order 排序
* @return string
*/
靜態函數parseOrder($order) {
$orderStr = '';
if(is_array($order))
$orderStr .= ' ORDER BY '.implode(',', $order);
else if(is_string($order) && !empty($order))
$orderStr .= ' ORDER BY '. $order;
回傳$orderStr;
}
/**
* 限制分析
* @access 函數
* @param string $limit
* @return string
*/
靜態函數parseLimit($limit) {
$limitStr = '';
if( is_array($limit)) {
if(count($limit)>1)
$limitStr .= ' LIMIT '.$limit[0].' , '.$limit[1].' ';
else
$limitStr .= ' LIMIT '.$limit[0].' ';
} else if(is_string($limit) && !empty($limit)) {
$limitStrStr .= ' LIMIT '.$limit.' ';
}
回傳$limitStr;
}
/**
* 分組分析
* @access 函數
* @param mix $group
* @return string
*/
靜態函數parseGroup($group) {
$groupStr = '';
if(is_array($group))
$groupStr .= ' GROUP BY '.implode(',', $group);
else if(is_string($group) && !empty($group))
$groupStr .= ' GROUP BY '.$group;
返回空($groupStr)?'':$groupStr;
}
/**
*having 分析
* @access 函數
* @param string $having
* @return string
*/
靜態函數 parseHaving($having) {
$havingStr = '';
if(is_string($having) && !empty($having))
$havingStr .= ' HAVING '.$having;
回傳$havingStr;
}
/**
* 欄位分析
* @access 函數
* @param mix $fields
* @return string
*/
靜態函數parseFields($fields) {
if(is_array($fields)) {
array_walk( $fields, array($this) , 'addSpecialChar'));
$fieldsStr = implode(',', $fields);
}else if(is_string($fields) && !empty($fields)) {
if( false === strpos($fields,'`') ) {
$fields =explode(' ,',$字段);
array_walk($fields, array($this, 'addSpecialChar'));
$fieldsStr = implode(',', $fields);
}else {
$fieldsStr = $fields;
}
} 否則 $fieldsStr = '*';
返回$fieldsStr;
}
/**
* sets分析,更新資料時呼叫
* @access function
* @param mixed $values
* @return string
*/
內部函數 parseSets($sets) {
$setsStr = '';
if(is_array($sets)){
foreach ($sets as $key=>$val){
$key = self::addSpecialChar($key);
$val = self::fieldFormat($val);
$setsStr .= "$key = ".$val.",";
}
$setsStr = substr($setsStr,0,-1);
}else if(is_string($sets)) {
$setsStr = $sets;
}
回傳 $setsStr;
}
/**
* 欄位格式化
* @access function
* @param mixed $value
* @return mixed
*/
靜態函數 fieldFormat(&$value) {
if(is_int($value)) {
$value = intval($value) ;
} else if(is_float($value)) {
$value = floatval($value);
} elseif(preg_match('/^(w*(+|-|*|/)?w*)$/i',$value)){
// 支援在欄位的值裡面直接使用其它欄位
// 例如(score+1) (name) 必須包含括號
$value = $value;
}else if(is_string($value)) {
$value = '''.self::escape_string($value).''';
}
回傳$值;
}
/**
* 欄位與表名新增` 符合
* 保證指令中使用關鍵字不出錯針對mysql
* @access function
* @param mixed $value
* @return mixed
*/
靜態函數 addSpecialChar(&$value) {
if( '*' == $value || false !== strpos($value, '(') || false !== strpos($value,'.') || false !== strpos($value,'`')) {
//如果包含*或使用了sql方法則不處理
} elseif(false === strpos($value,'`') ) {
$value = '`'.trim($value). '`';
}
回傳$value
/**
+---------------------------------------------- ------------
* 去掉空元素
+--------------------------- -------------------------------
* @access function
+-------- --------------------------------------------------
* @param mixed $value
+------------------------------------- ---------------------
* @return mixed
+------------------ ----------------------------------------
*/
靜態函數removeEmpty($value){
return !empty($value)
}
/* *
* 執行查詢 主要針對 SELECT, SHOW 等指令
* @access function
* @param string $sql sql指令
* @return mixed
*/
靜態函數query($sql='') {
//取得資料庫連線
$link = self::$link;
if; ( !$link ) return false;
self::$queryStr = $sql; //釋放前次的查詢結果
if ( !empty(self::$PDOStatement) ) self::free(); self::$PDOStatement = $link->prepare(self::$queryStr);
$bol = self::$PDOStatement->execute();
// 有錯誤則發送例外狀況
self ::haveErrorThrowException();
回傳$bol
}
/**
* 資料庫操作方法
* @access function
* @param string $sql 執行語句
* @param boolean $lock 是否鎖定(預設不鎖定)
* @return void
public function execute($sql='',$lock=false) {
if(empty($sql)) $sql = $this->queryStr;
return $this->_execute($sql) ;
}*/
/**
* 執行語句 針對 INSERT, UPDATE 以及DELETE
* @access function
* @param string $sql sql指令
* @return integer
*/
靜態函式執行($ sql='' ) {
// 取得資料庫連線
$link = self::$link;
if ( !$link ) return false
self::$queryStr = $sql
//釋放前次的查詢結果
if ( !empty(self::$PDOStatement) ) self::free();
$result = $link->exec(self::$queryStr)
//有錯誤則發送異常
self::haveErrorThrowException();
if ( false === $result) {
回傳 false;
} else {
self::$numRows = $結果;
self::$lastInsertId = $link->lastInsertId();
返回自我::$numRows;
}
}
/**
* 是否為資料庫更改操作
* @access private
* @param string $query SQL指令
* @return boolen 如果是查詢操作回傳false
*/
靜態函數isMainIps($query) {
$queryIps = 'INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|SELECT .* INTO|COPY |更改|授予|撤銷|鎖定|解鎖';
if (preg_match('/^s*"?(' . $queryIps . ')s+/i', $query)) {
回傳true;
}
回傳false;
}
/**
* 過濾POST提交資料
* @access private
* @param mixed $data POST提交資料
* @param string $table 資料表名
* @return mixed $newdata
* @return mixed $newdata
*/
靜態函數filterPost($table,$data) {
$table_column = self::getFields( $table);
$newdata=array( );
foreach ($table_column as $key=>$val){
if(array_key_exists($key,$data) && ($data[$key ])!==''){
$newdata[$key] = $data[$key];
}
}
回傳$newdata;
}
/* *
* 啟動交易
* @access function
* @return void
*/
靜態函數startTrans() {
//資料回滾支援
$link = self::$link;
if (!$link ) return false
if (self::$transTimes == 0) {
$link->beginTransaction()
}
self::$transTimes++;
return ;
/**
* 用於非自動提交狀態下面的查詢提交
* @access function
* @return boolen
* /
靜態function commit() {
$link = self::$link
if (!$link ) return false;
if (self::$transTimes > 0) {
$result; $link->commit();
self::$transTimes = 0;
if(!$result){
拋出例外(self::$error());
}
}
回傳true
}
/**
* 交易回滾
* @access function
* @return boolen
*/
public function rollback() {
$link = self::$link;
if ( !$link ) 回傳false;
if (self::$transTimes > 0) {
$result = $link->rollback();
self::$transTimes = 0;
if(!$result){
throw_exception(self::$error());
回傳錯誤;
}
}
回傳true;
}
}
}
? >

以上就介紹了parallelsdesktop 9封裝一個希望的PDO資料庫操作程式碼,包含了parallelsdesktop9的內容,對PHP教學有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn