1. 程式人生 > >常用的pdo操作類,支援mysql、sqlserver、oracle,有例項

常用的pdo操作類,支援mysql、sqlserver、oracle,有例項

工作中需要操作sqlserver、oracle都是使用的這個類,當時是在別人的基礎上改進了,現在分享下

<?php
class Pdodb{ 
	protected $pdo; 
	protected $res; 
	protected $config; 
	/*建構函式*/ 
	function __construct($config){ 
		$this->Config = $config; 
		$this->connect(); 
	} 
	 
	/*資料庫連線*/ 
	public function connect(){ 
		try {
			 $this->pdo= new PDO($this->Config['dsn'], $this->Config['username'], $this->Config['password']);//$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
			 $this->pdo->query("set names utf8"); 
		}catch(Exception $e){
			echo '資料庫連線失敗,詳情: ' . $e->getMessage () . ' 請在配置檔案中資料庫連線資訊';
            exit ();
		}
		/*
		if($this->Config['type']=='oracle'){
			$this->pdo->query("set names {$this->Config['charset']};"); 
		}else{
			$this->pdo->query("set names {$this->Config['charset']};"); 
		}
		*/
		//把結果序列化成stdClass 
		//$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 
		//自己寫程式碼捕獲Exception 
		//$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
		$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);//屬性名 屬性值 陣列以關聯陣列返回
	} 

	/*資料庫關閉*/ 
	public function close(){ 
		$this->pdo = null; 
	} 
	//用於有記錄結果返回的操作,特別是SELECT操作
	public function query($sql,$return=false){ 
		$res = $this->pdo->query($sql); 
		if($res){ 
			$this->res = $res; // 未返回 return $this->res;
		}
		if($return){
			return $res;
		}
	}
	//主要是針對沒有結果集合返回的操作,比如INSERT、UPDATE、DELETE等操作
	public function exec($sql,$return=false){ 
		$res = $this->pdo->exec($sql);
		if($res){ 
			$this->res = $res; 
		}
		if($return){//返回操作是否成功 成功返回1 失敗0
			return $res;
		}
	}
	//將$this->res以陣列返回(全部返回)
	public function fetchAll(){ 
		return $this->res->fetchAll(); 
	}
	//將$this->res以陣列返回(一條記錄)
	public function fetch(){ 
		return $this->res->fetch(); 
	}
	//返回所有欄位
	public function fetchColumn(){ 
		return $this->res->fetchColumn(); 
	}
	//返回最後插入的id
	public function lastInsertId(){ 
		return $this->res->lastInsertId(); 
	} 
	//返回最後插入的id
	public function lastInsertId2(){ 
		return $this->pdo->lastInsertId(); 
	} 
	/** 
	* 引數說明 
	* string/array $table 資料庫表,兩種傳值模式 
	* 普通模式: 
	* 'tb_member, tb_money' 
	* 陣列模式: 
	* array('tb_member', 'tb_money') 
	* string/array $fields 需要查詢的資料庫欄位,允許為空,預設為查詢全部,兩種傳值模式 
	* 普通模式: 
	* 'username, password' 
	* 陣列模式: 
	* array('username', 'password') 
	* string/array $sqlwhere 查詢條件,允許為空,兩種傳值模式 
	* 普通模式(必須加上and,$sqlwhere為空 1=1 正常查詢): 
	* 'and type = 1 and username like "%os%"' 
	* 陣列模式: 
	* array('type = 1', 'username like "%os%"') 
	* string $orderby 排序,預設為id倒序
	*int $debug 是否開啟除錯,開啟則輸出sql語句 
	* 0 不開啟 
	* 1 開啟 
	* 2 開啟並終止程式 
	* int $mode 返回型別 
	* 0 返回多條記錄 
	* 1 返回單條記錄 
	* 2 返回行數 
	*/ 
	public function select($table, $fields="*", $sqlwhere="", $orderby="", $debug=0, $mode=0){ 
		//引數處理 
		if(is_array($table)){ 
			$table = implode(', ', $table); 
		} 
		if(is_array($fields)){ 
			$fields = implode(',',$fields); 
			/*
			if($this->Config['type']=='oracle'){
				//$fields = implode(',',$fields);//CUSTOMER_ID,FIRST_NAME,LAST_NAME,EMAIL
				//$fields = implode(",'UTF8','ZHS16GBK') ,convert(",$fields); 
				//$fields="convert(".$fields.",'UTF8','ZHS16GBK')";
			}else{
				$fields = implode(',',$fields);  
			}
			*/

		} 
		if(is_array($sqlwhere)){ 
			$sqlwhere = ' and '.implode(' and ', $sqlwhere); 
		} 

		//資料庫操作 
		if($debug === 0){ 
			if($mode === 2){ //統計
				$this->query("select count(*) from $table where 1=1 $sqlwhere"); 
				$return = $this->fetchColumn(); 
			}else if($mode === 1){ //返回一條
				$this->query("select $fields from $table where 1=1 $sqlwhere $orderby"); 
				$return = $this->fetch(); 
			}else{ 
				$this->query("select $fields from $table where 1=1 $sqlwhere $orderby"); 
				$return = $this->fetchAll();//如果 $this->res為空即sql語句錯誤 會提示Call to a member function fetchAll() on a non-object
			} 
			return  $return; 
		}else{ 
				if($mode === 2){ 
					echo "select count(*) from $table where 1=1 $sqlwhere"; 
				}else if($mode === 1){ 
					echo "select $fields from $table where 1=1 $sqlwhere $orderby"; 
				}else{ 
					echo "select $fields from $table where 1=1 $sqlwhere $orderby"; 
				} 
				if($debug === 2){ 
					exit; 
				} 
		} 
	} 
	
	/** 
	* 引數說明 
	* string/array $table 資料庫表,兩種傳值模式 
	* 普通模式: 
	* 'tb_member, tb_money' 
	* 陣列模式: 
	* array('tb_member', 'tb_money') 
	* string/array $set 需要插入的欄位及內容,兩種傳值模式 
	* 普通模式: 
	* 'username = "test", type = 1, dt = now()' 
	* 陣列模式: 
	* array('username = "test"', 'type = 1', 'dt = now()')
	* int $debug 是否開啟除錯,開啟則輸出sql語句 
	* 0 不開啟 
	* 1 開啟 
	* 2 開啟並終止程式 
	* int $mode 返回型別 
	* 0 無返回資訊 
	* 1 返回執行條目數 
	* 2 返回最後一次插入記錄的id 
	*/ 
	public function oic_insert($table, $set, $debug=0, $mode=0){ 
		//引數處理 
		if(is_array($table)){ 
			$table = implode(', ', $table); 
		} 
		if(is_array($set)){
			$s='';$i=0;
			foreach($set as $k=>$v){
				$i++;
				$s[$i]=$k;//,連線
				$val[$i]=$v;
			}
			$sarr=implode(",",$s);//去掉最後一個,
			//array_pop($sarr);
			$set=implode("','",$val);////15221579236','張三','','2001','8','4','女','是
			
			//$set = implode(', ', $set); 
		} 

		//資料庫操作 
		if($debug === 0){ 
			if($mode === 2){ 
				$this->query("insert into $table ($sarr) values('".$set."')"); 
				//$return = $this->lastInsertId(); 
				
			}else if($mode === 1){ 
				$this->exec("insert into $table ($sarr) values('".$set."')"); 
				$return = $this->res; 
			}else{ 
				$this->query("insert into $table ($sarr) values('".$set."')"); 
				$return = NULL; 
			} 
			return $return; 
		}else{ 
			echo "insert into $table ($sarr) values('".$set."')"; 
			if($debug === 2){ 
				exit; 
			} 
		} 
	} 
	
	public function insert($table, $set, $debug=0, $mode=0){ 
		//引數處理 
		if(is_array($table)){ 
			$table = implode(', ', $table); 
		} 
		if(is_array($set)){
			$s='';
			foreach($set as $k=>$v){
				$s.=$k."='".$v."',";//,連線
			}
			$sarr=explode(',',$s);//去掉最後一個,
			array_pop($sarr);
			$set=implode(',',$sarr);

			//$set = implode(', ', $set); 
		} 
		
		//資料庫操作 
		if($debug === 0){ 
			if($mode === 2){ 
				$this->query("insert into $table set $set"); 
				$return = $this->pdo->lastInsertId(); 
			}else if($mode === 1){ 
				$this->exec("insert into $table set $set"); 
				$return = $this->res; 
			}else{ 
				$this->query("insert into $table set $set"); 
				$return = NULL; 
			} 

			return $return; 
		}else{ 
			echo "insert into $table set $set"; 
			if($debug === 2){ 
				exit; 
			} 
		} 
	} 

	/** 
	* 引數說明 
	* string $table 資料庫表,兩種傳值模式 
	* 普通模式: 
	* 'tb_member, tb_money' 
	* 陣列模式: 
	* array('tb_member', 'tb_money') 
	* string/array $set 需要更新的欄位及內容,兩種傳值模式 
	* 普通模式: 
	* 'username = "test", type = 1, dt = now()' 
	* 陣列模式: 
	* array('username = "test"', 'type = 1', 'dt = now()') 
	* string/array $sqlwhere 修改條件,允許為空,兩種傳值模式 
	* 普通模式: 
	* 'and type = 1 and username like "%os%"' 
	* 陣列模式: 
	* array('type = 1', 'username like "%os%"')
	* int $debug 是否開啟除錯,開啟則輸出sql語句 
	* 0 不開啟 
	* 1 開啟 
	* 2 開啟並終止程式 
	* int $mode 返回型別 
	* 0 無返回資訊 
	* 1 返回執行條目數 
	*/ 
	public function update($table, $set, $sqlwhere="", $debug=0, $mode=0){ 
		//引數處理 
		if(is_array($table)){ 
			$table = implode(', ', $table); 
		} 
		if(is_array($set)){ 
			$s='';
			
			foreach($set as $k=>$v){
				$s.=$k."='".$v."',";
			}
			$sarr=explode(',',$s);//去掉最後一個,
			array_pop($sarr);
			$set=implode(',',$sarr);
			//$set = implode(', ', $set); 
		} 
		if(is_array($sqlwhere)){ 
			$sqlwhere = ' and '.implode(' and ', $sqlwhere); 
		} 
		//資料庫操作 
		if($debug === 0){ 
			if($mode === 1){ 
				$this->exec("update $table set $set where 1=1 $sqlwhere"); 
				$return = $this->res; 
			}else{ 
				$this->query("update $table set $set where 1=1 $sqlwhere"); 
				$return = true; 
			} 
			return $return; 
		}else{ 
			echo "update $table set $set where 1=1 $sqlwhere"; 
			if($debug === 2){ 
				exit; 
			} 
		} 
	} 

	/** 
	* 引數說明 
	* string $table 資料庫表 
	* string/array $sqlwhere 刪除條件,允許為空,兩種傳值模式 
	* 普通模式: 
	* 'and type = 1 and username like "%os%"' 
	* 陣列模式: 
	* array('type = 1', 'username like "%os%"') 
	* int $debug 是否開啟除錯,開啟則輸出sql語句 
	* 0 不開啟 
	* 1 開啟 
	* 2 開啟並終止程式 
	* int $mode 返回型別 
	* 0 無返回資訊 
	* 1 返回執行條目數 
	*/ 
	public function delete($table, $sqlwhere="", $debug=0, $mode=0){ 
		//引數處理 
		if(is_array($sqlwhere)){ 
			$sqlwhere = ' and '.implode(' and ', $sqlwhere); //是字串需自己加上and
		} 
		//資料庫操作 
		if($debug === 0){ 
			if($mode === 1){ 
				$this->exec("delete from $table where 1=1 $sqlwhere"); 
				$return = $this->res; 
			}else{ 
				$this->query("delete from $table where 1=1 $sqlwhere"); 
				$return = NULL; 
			} 
			return $return; 
		}else{ 
			echo "delete from $table where 1=1 $sqlwhere"; 
			if($debug === 2){ 
				exit; 
			} 
		} 
	} 
} 
/*
sqlserver 配置 extension=php_pdo_mssql.dll和extension=php_pdo_sqlsrv.dll 安裝對應的 ntwdblib.dll 
http://msdn.microsoft.com/en-us/library/cc296170.aspx 下載php版本對應的sqlsrv擴充套件 
sqlserver 配置 odbc連線需開啟extension=php_pdo_odbc.dll
*/
$mssql2008_config=array(
    'dsn'=>'odbc:Driver={SQL Server};Server=192.168.1.60;Database=his',//資料庫伺服器地址
	'username'=>'sa',
	'password'=>'xxxxx',
);
$mssql=new Pdodb($mssql2008_config);
$sql="select * from 
(
	select row_number()over(order by tempcolumn)temprownumber,*
		from (
			select top 10 tempcolumn=0,a.*
			from DA_GR_HBFS a 
			where 1=1
		) t
) tt
where temprownumber>0"; 
$mssql->query($sql);
while($res=$mssql->fetch()){
	$data[]=$res;
}
print_r($data);exit;

//mysql 操作
$msyql_config=array(
	'dsn'=>'mysql:host=localhost;dbname=talk',
	'username'=>'root',
	'password'=>'123456'
);
$mysql=new PDO_DB($msyql_config);
$sql = 'SELECT user_id, user_name, nickname FROM et_users ';
$mysql->query($sql);
$data=$mysql->fetchAll();
print_r($data);exit;

//oracle 操作
$oci_config=array(
	'dsn'=>'oci:dbname=orcl',
	'username'=>'BAOCRM',
	'password'=>'BAOCRM'
);
$oracle=new PDO_DB($oci_config);
//print_r($oracle);exit;//PDO_DB Object ( [pdo:protected] => PDO Object ( ) [res:protected] => [config:protected] => [Config] => Array ( [dsn] => oci:dbname=orcl [name] => PWACRM [password] => PWACRM ) )
$sql="select * from CUSTOMER_LEVEL t";
$oracle->query($sql);	
$data=$oracle->fetchAll();
print_r($data);exit;
/*
Array
(
    [0] => Array
        (
            [LEVEL_ID] => 1
            [0] => 1
            [LEVEL_NAME] => 普通會員
            [1] => 普通會員
            [LEVEL_DETAIL] => 普通會員
            [2] => 普通會員
            [SORT_NUMBER] => 15
            [3] => 15
            [CREATE_TIME] => 12-7月 -12
            [4] => 12-7月 -12
            [CREATE_BY] => 1
            [5] => 1
            [UPDATE_TIME] => 12-7月 -12
            [6] => 12-7月 -12
            [UPDATE_BY] => 1
            [7] => 1
            [STATE] => 正常
            [8] => 正常
        )
 
)*/

?>