-
/**
- * auther soulence
- * 呼叫資料類別檔案
- * modify 2015/06/12
- */
- class DBConnect
- {
- private $dbname = null;
- private $dodbdo = null;
- private $persistent = false;
- private $statement = null;
- private $lastInsID = null;
- private static $_instance = [];
- private static $_instance = [];
- {
- $this->dbname = $dbname;
- $this->persistent = $attr;
- }
-
- 公共靜態函數db ($flag='r',$persistent=false)
- {
- if(!isset($flag)){
- $flag = 'r';
- }
-
- if (!class_exists('PDO'))
- {
- throw new Exception('找不到PDO');
- return false;
- }
- $mysql_server = Yaf_Registry::get('mysql');
- if(!isset($mysql_server[$flag])){
- return false;
- }
-
- $options_arr = array(PDO::MYSQL_ATTR_INIT_COMMAND => '設定名稱'.$mysql_server[$flag]['charset'],PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC); if(Ypersed $ === true){
- $options_arr[PDO::ATTR_PERSISTENT] = true;
- }
-
- 嘗試{
- $pdo = new PDO($mysql_server[$flag][ '🎜> $pdo = new PDO($mysql_server_server '],$mysql_server[$flag]['使用者名稱'],$mysql_server[$flag]['password'],$options_arr);
- } catch (PDOException $e) {
- 引發新例外( $e->getMessage());
- //exit('連線失敗:'.$e->getMessage());
- 回傳 false;
- }
-
- if(!$pdo) {
- throw new Exception('PDO CONNECT ERROR');
- 回傳 false;
- }
-
- return $pdo;
- }
-
- /**
- * 得到操作資料庫物件
- * @param string $dbname 對應的資料庫是誰
- * @param bool $attr 是否長連接
- * return false說明給定的資料庫不存在
- */
- public static function getgetstance($dbname = ' r',$attr = false)
- {
- $mysql_server = Yaf_Registry::get('mysql');
- if(!isset($mysql_server[$dbname])){
- return false ;
- }
- $key = md5(md5($dbname.$attr,true));
- if (!isset(self::$_instance[$key]) || !is_object(self: :$_instance[$key] ]))
- self::$_instance[$key] = new self($dbname,$attr);
- return self::$_instance[$key];
- }
-
- 私有函數getConnect(){
- $this->pdo = self::db($this->dbname,$this->persistent);
- }
-
- /**
- * 查詢操作
- * @param string $sql 執行查詢的sql語句
- * @param array $data 查詢的條件格式為[':id'=>$id,':name'=> $name](推薦)或為[1=>$id,2=>$name]
- * @param bool $one 是否回傳一條內容預設為否
- */
- 公用函數查詢($sql, $data = [], $one = false)
- {
- if (!is_array($data) ||empty($sql ) || ! is_string($sql))
- 回傳false;
-
- $this->free();
-
- return $this->queryCommon($data,$sql,$ one) ;
- }
-
- /**
- * 內部查詢的共用方法
- */
- 乾燥函數queryCommon($data,$sql,$one)
- {
- $this->pdoExec( $ data,$sql);
-
- if ($one){
- return $this->statement->fetch(PDO::FETCH_ASSOC);
- }else{
- return $this ->statement->fetchAll(PDO::FETCH_ASSOC);
- }
- }
-
- /**
- * 多條SQL語句的查詢操作
- * @param array $arr_sql 執行查詢的sql語句數組格式為[$sql1,$sql2]
- * @param array $arr_data 查詢與$arr_sql對應的條件格式為[[':id'=>$id,':name'=>$name],[':id'=>$id,':name'=>$name]](推薦)或為[ [1=>$id,2=>$name],[1=>$id,2=>$name]]
- * @param bool $one 是否回傳一條內容預設為否這裡如果設定為true那麼每一條sql都只回傳一條資料
- */
- 公用函數查詢($arr_sql, $arr_data = [] , $one = false)
- {
- if(!is_array($arr_sql) ||空($arr_sql) || !is_array($arr_data))
- return false;
-
- $this->free();
-
- $res = [];$i = 0;
- foreach ( $ arr_sql as $val) {
- if(!isset($arr_data[$i]))
- $arr_data[$i] = [];
- elseif(!is_array($arr_data[$i]) ))
- throw new Exception('查詢sql時發生錯誤:'.$val.' where:'.$arr_data[$i]);
-
- $res[] = $this->queryCommon ( $arr_data[$i],$val,$one);
- $i ;
- }
- return $res;
- }
-
- /**
- * 分頁封裝
- *
- * @param string $sql
- * @param int $page 表示從第幾頁開始取
- * @param int $pageSize 表示每頁多少條
- * @param array $data 查詢的條件
- */
- public function limitQuery($sql, $page=0, $pageSize=20, $data = [])
- {
- $page = intval($page);
- if ($page return [];
- }
- $pageSize = intval($pageSize);
- if ($pageSize > 0) { // pageSize 為0時表示取得所有資料
- $sql .= ' LIMIT ' . $pageSize;
- if ($page > 0) {
- $start_limit = ($page - 1) * $pageSize;
- $sql .= ' OFFSET ' 。 > }
- return $this->query($sql, $data);
- }
-
- /**
- * 這個是用來進行新增刪除修改操作使用事務操作
- * @param string $sql 執行查詢的sql語句
- * @param array $data 查詢的條件格式為[':id'= >$id,':name'=>$name](推薦)或為[1=>$id,2=>$name]
- * @param bool $Transaction 是否交易操作預設為否
- */
- public functionexecuteDDL($sql, $data = [ ],$Transaction = false){
- if (!is_array($data) || !is_string($sql))
- return false;
-
- $this->free();
-
- if($Transaction)
- $this->pdo->beginTransaction();//開啟交易
- try{
- $ this->execRes($data,$sql);
- if($Transaction)
- $this->pdo->commit();//提交交易
- return $this->; lastInsID;
- } catch (Exception $e) {
- if($Transaction)
- $this->pdo->rollBack();//交易回滾
- throw new Exception('錯誤 DDLExecute '.$e->getMessage());
- return false;
- }
- }
-
- /**
- * 這個是用來進行新增刪除修改操作使用事務操作
- * 它是執行多條的
- * @param array $arr_sql 需要執行操作的SQL語句數組
- * @param array $ arr_data 與陣列對應SQL語句的條件
- * @param bool $Transaction 是否事務操作預設為否
- * /
- public functionexecuteDDLes($arr_sql, $arr_data = [],$Transaction = false){
-
- if(!is_array($arr_sql) || 空($arr_sql) || !is_array($ arr_data))
- return false;
-
- $res = [];
-
- $this->free();
-
- if($Transaction)
- $this->pdo-> beginTransaction();//開啟事務
- try{
- $i = 0;
- foreach($arr_sql as $val){
- if(!isset( $arr_data[$i]))
- $arr_data[$i] = [];
- elseif(!is_array($arr_data[$i])){
- if($Transaction)
- $ this->pdo->rollBack() ;// 交易回溯
- throw new Exception('Error where DDLExecutees sql:'.$val.' where:'.$arr_data[$i]);
- }
-
- $this- >execRes($arr_data[$i],$val);
- $res[] = $this->lastInsID;
- $i ;
- }
-
- if($Transaction)
- $this->pdo->commit();// 交易提交
-
- return $res;
- } catch (Exception $ e) {
- if($Transaction)
- $ this->pdo->rollBack();//交易回滾
- throw new Exception('Error DDLExecutees array_sql:'.json_encode($arr_sql) ).' '.$e->getMessage());
- 回傳 false;
- }
- 回傳 $res;
- }
-
- /**
- * 此方法是用來計算查詢傳回的條數注意它只支援SELECT COUNT(*) FROM TABLE...或SELECT COUNT(0) FROM TABLE...方式
- * @param string $sql查詢的sql語句
- * @param array $data SQL語句的條件
- */
- public function countRows($sql,$data = []){
- if (!is_array($data) ||空($sql) || !is_string($sql))
- return false;
- $this->free();
-
- $res = $this->pdoExec($data,$sql);
-
- if($res == false)
- return false;
-
- return $this->statement->fetchColumn();
- }
-
- /**
- * 此方法是用來計算查詢傳回的條數 它是執行多條SQL
- * @param string $sql 查詢的sql語句
- * @param array $data SQL語句的條件
- */
- public function countRowses($arr_sql,$arr_data = []){
-
- if(!is_array($arr_sql) || empempty($ arr_sql) || !is_array($arr_data))
- 回傳false;
-
- $res = [];
-
- $this->free();
- $i = 000 ;
- foreach ($arr_sql as $val) {
- if(!isset($arr_data[$i]))
- $arr_data[$i] = [];
- elseif(!is_array ( $arr_data[$i]))
- throw new Exception('Error where CountRowses sql:'.$val.' where:'.$arr_data[$i]);
-
- $res1 = $ this ->pdoExec($arr_data[$i],$val);
-
- if($res1 == false)
- $res[] = false;
- else
- $res [] = $this->statement->fetchColumn();
- }
-
- return $res;
- }
-
- /**
- * 這裡再提供一個方法 由於專案中會有很多需要提供開啟事務 然後再進行操作 最後提交
- * @param bool $Transaction 是否事務操作 預設為否
- */
- public function getDB ($Transaction=false)
- {
- $this->Transaction = $Transaction;
- $this->getConnect();
- if($Transaction === true )
- $this ->pdo->beginTransaction();//開啟事務
- return $this;
- }
-
- /**
- * 此方法可以執行多次它是執行DDL語句的
- * 注意它是需要配合getDB和sQCommit一起使用不能單獨使用哦
- * 如果沒有開啟事務sQCommit方法可以不調用
- * @param string $sql 查詢的sql語句
- * @param array $data SQL語句的條件
- */
- public function execSq($sql,$data = [])
- {
- if($this->checkParams($sql,$data) === false)
- return false;
-
- 嘗試{
- $this- >execRes($data,$sql);
- return $this->lastInsID;
- } catch (Exception $e) {
- if(isset($ this->Transaction) && $this->Transaction === true)
- $this->pdo->rollBack();//交易回滾
- throw new Exception('Error execSq'.$e->getMessage());
- return false;
- } 最後 {
- if (!empty($this->statement))
- {
- $this->statement->closeCursor();
- unset($this->statement);
- }
- }
- }
-
- /* *
- * 執行查詢的方法它需要傳遞一個連接資料庫物件
- * @param string $sql 執行查詢的sql語句
- * @param array $data 查詢的條件格式為[':id'=> $id,':name'=>$name](推薦)或為[1=>$id,2=>$name]
- * @param bool $one 是否回傳一條內容預設為否
- */
- public function querySq($sql,$data = [],$one = false)
- {
- if($this->checkParams($sql,$data) = == false)
- return false;
-
- return $this->pdoExecSq($sql,$data,[1,$one]);
- }
-
- /* *
- * 分頁封裝
- *
- * @param string $sql
- * @param int $page 表示從第幾頁開始取
- * @param int $pageSize 表示每頁多少條
- * @param array $data 查詢的條件
- */
- public function limitQuerySq($sql, $page=0, $pageSize=20, $data = [])
- {
- $page = intval($page);
- if ($page return [];
- }
- $pageSize = intval($pageSize);
- if ($pageSize > 0) { // pageSize 為0時表示取得所有資料
- $ sql .= '限制' 。 ;
- }
- }
- return $this->querySq($sql, $data);
- }
-
- /**
- * 此方法是用來計算查詢傳回的條數注意它只支援SELECT COUNT(*) FROM TABLE...或SELECT COUNT(0) FROM TABLE...方式
- * @param string $sql查詢的sql語句
- * @param array $data SQL語句的條件
- */
- 公共函數countRowsSq ($sql,$data = []){
- if($this->checkParams($sql,$data) === false)
- return false;
- return $this->pdoExecSq($ sql,$data,[2]);
- }
-
- /**
- * 또 다른 메소드는 다음과 같습니다. 트랜잭션이 시작되지 않은 경우 마지막에 이 메소드를 호출할 필요가 없습니다.*/
- 공개 함수 sQCommit()
- {
- if(empty($this->pdo) || !is_object($this-> pdo))
- return false;
- if(isset($this->Transaction) && $this->Transaction === true)
- $this->pdo->commit() ;//提交事务
- unset($this->pdo);
- }
-
- /**
- * 내부 호출 방법
- */
- 공용 함수 checkParams($sql,$data)
- {
- if (empty($this->pdo) || !is_object($this->pdo) || !is_array($data) || 비어 있음($sql) || !is_string($ sql))
- false 반환;
-
- true 반환;
- }
-
- /**
- * 내부 호출 방법
- */
- 개인 함수 pdoExecSq($sql,$data,$ select = []){
- 시도{
- $res = $this->pdoExec($data,$sql);
- if(empty($select))
- return $res;
- else{
- if($select[0] === 1){
- if($select[1] === true)
- return $this->statement->fetch( PDO::FETCH_ASSOC);
- else
- return $this->statement->fetchAll(PDO::FETCH_ASSOC);
- }elseif($select[0] === 2)
- return $this->statement->fetchColumn();
- else
- return false;
- }
- } catch(Exception $e) {
- throw new Exception($e-> ;getMessage());
- return false;
- } 마침내 {
- if (!empty($this->statement))
- {
- $this->statement-> closeCursor();
- unset($this->statement);
- }
- }
- }
-
- /**
- * 내부 호출 방법
- */
- 비공개 함수 execRes( $data,$sql){
-
- $res = $this->pdoExec($data,$sql);
-
- $in_id = $this->pdo->lastInsertId( );
-
- if (preg_match("/^s*(INSERTs INTO|REPLACEs INTO)s /i", $sql) && !empty($in_id))
- $this->lastInsID = $in_id;
- else
- $this->lastInsID = $res;
- }
-
- /**
- * SQL 문을 직접 실행하기 위해 사용하는 내부 호출 방식
- */
- 개인 함수 pdoExec($data,$sql ){
- $this->statement = $this->pdo->prepare($sql);
- if (false === $this->statement)
- return false;
- if (!empty($data))
- {
- foreach ($data를 $k => $v)
- {
- $this->statement->bindValue($k, $v);
- }
- }
- $res = $this->statement-> ;execute();
- if (!$res)
- {
- throw new Exception('sql:'.$sql.'<====>where:'.json_encode($data ).'<====>error:'.json_encode($this->statement->errorInfo()));
- }else{
- return $res;
- }
- }
-
- /**
- * 해제에 사용된 내부 호출 방법
- */
- 개인 함수 free()
- {
- if (is_null($this->pdo))
- $this- >getConnect();
-
- if (!empty($this->statement))
- {
- $this->statement->closeCursor();
- $this ->문 = null;
- }
- }
- }
- ?>
复代码
|