- /**
- * 著者 soulence
- * データクラスファイルを呼び出す
- * 2015/06/12 を修正
- */
- class DBConnect
- {
- private $dbname = null;
- private $pdo = null;
- private $persistent = false;
- private $statement = null;
- private $lastInsID = null;
- private static $_instance = [];
-
- private function __construct($dbname,$attr)
- {
- $this->dbname = $dbname;
- $this->persistent = $ attr;
- }
-
- public static function db($flag='r',$persistent=false)
- {
- if(!isset($flag)){
- $flag = 'r';
- }
-
- if ( !class_exists('PDO'))
- {
- throw new Exception('not found PDO');
- return false;
- }
- $mysql_server = Yaf_Registry::get('mysql');
- if(!isset($mysql_server[$flag])){
- return false;
- }
-
- $options_arr = array(PDO::MYSQL_ATTR_INIT_COMMAND => ; 'SET NAMES '.$mysql_server[$flag]['charset'],PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC);
- if($persistent === true){
- $options_arr[PDO::ATTR_PERSISTENT ] = true;
- }
-
- try {
- $pdo = new PDO($mysql_server[$flag]['connectionString'],$mysql_server[$flag]['username'],$mysql_server[$flag]['password '],$options_arr);
- } catch (PDOException $e) {
- throw new Exception($e->getMessage());
- //exit('连接失败:'.$e->getMessage());
- false を返します。
- }
-
- if(!$pdo) {
- throw new Exception('PDO CONNECT ERROR');
- false を返します。
- }
-
- return $pdo;
- }
-
- /**
- * 操作データベースオブジェクトを取得します
- * @param string $dbname 対応するデータベースは誰ですか?
- * @param bool $attr 接続が長いかどうか
- * false を返すと、指定されたデータベースが存在しないことを示します
- */
- public static function getInstance($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] = 新しい 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 コンテンツの一部を返すかどうか、デフォルトは no です
- */
- public function query($sql, $data = [], $one = false)
- {
- if (!is_array($data) || empty($sql) || !is_string( $sql))
- return 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 コンテンツを返すかどうか。デフォルトは no です。 true に設定すると、各 SQL は 1 つのデータのみを返します
- */
- パブリック関数クエリ($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. ' ここで:'.$arr_data[$i]);
-
- $res[] = $this->queryCommon($arr_data[$i],$val,$one);
- $i++;
- }
- return $レス;
- }
-
- /**
- * ページングのカプセル化
- *
- * @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 ' 。 $start_limit;
- }
- }
- return $this->query($sql, $data);
- }
-
- /**
- * トランザクション操作による操作の追加、削除、変更に使用されます
- * @param string $sql クエリを実行するSQL文
- * @param array $data クエリの条件付き形式は [':id'=>] ;$id,' :name'=>$name] (推奨) または [1=>$id,2=>$name]
- * @param bool $Transaction トランザクション操作のデフォルトが No かどうか
- */
- public functionexecuteDDL($sql, $data = [],$ Transaction = false){
- if (!is_array($data) || !is_string($sql))
- return false;
-
- $this->free();
-
- if($Transaction)
- $this-> ;pdo->beginTransaction();//开启事务
- try{
- $this->gt;execRes($data,$sql);
- if($Transaction)
- $this->gt;pdo->commit() ;//事务提交
- return $this->lastInsID;
- } catch (Exception $e) {
- if($Transaction)
- $this->pdo->rollBack();//事务回滚
- throw new Exception('Error DDLExecute <=====>'.$e->getMessage());
- return false;
- }
- }
-
- /**
- * トランザクション操作を使用して追加、削除、変更操作を実行するために使用されます
- * 複数の項目を実行します
- * @param array $arr_sql 実行する必要がある SQL ステートメントの配列
- * @param array $arr_data配列に対応する SQL 文
- * @param bool $Transaction トランザクション操作のデフォルトが No かどうか
- */
- public functionexecuteDDLes( $arr_sql, $arr_data = [],$Transaction = false){
-
- if(!is_array($arr_sql) || empty($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('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());
- return false;
- }
- return $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();
- }
-
- /**
- * このメソッドは、クエリによって返される項目の数を計算するために使用されます。
- * @param string $sql クエリの SQL ステートメント
- * @param array $data の条件。 SQL ステートメント
- */
- public function countRowses($arr_sql,$arr_data = []){
-
- if(!is_array($arr_sql) || empty($arr_sql) || !is_array($arr_data) )
- return false;
-
- $res = [];
-
- $this->free();
- $i = 0;
- 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 トランザクション操作を実行するかどうか、デフォルトは no です
- */
- 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 query SQL文
- * @param array $data SQL文の条件
- */
- public function execSq($sql,$data = [])
- {
- if($this->checkParams($sql,$data) === false)
- return false;
-
- try{
- $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;
- }finally {
- 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 .= ' LIMIT ' . $pageSize;
- if ($page > 0) {
- $start_limit = ($page - 1) * $pageSize;
- $sql .= ' OFFSET ' 。 $start_limit;
- }
- }
- return $this->querySq($sql, $data);
- }
-
- /**
- * このメソッドは、クエリによって返される項目の数を計算するために使用されます。 SELECT COUNT(*) FROM TABLE... または SELECT COUNT(0) FROM TABLE... のみをサポートしていることに注意してください。
- * @param string $sqlクエリのSQL文
- * @param array $data SQL文の条件
- */
- public function countRowsSq($sql,$data = []){
- if($this->checkParams($sql,$data) === false)
- return false;
- return $this->pdoExecSq($sql,$data,[2]);
- }
-
- /**
- * これは最後のコミット操作です。トランザクションが開始されていない場合、このメソッドを最後に呼び出す必要はありません。*/
- public function sQCommit()
- {
- if(empty($this->pdo) || !is_object($this->pdo))
- return false;
- if( isset($this->Transaction) && $this->Transaction === true)
- $this->pdo->commit();//提交事务
- unset($this->pdo);
- }
-
- /**
- * 内部呼び出しメソッド
- */
- public function checkParams($sql,$data)
- {
- if (empty($this->pdo) || !is_object($this->pdo) | | !is_array($data) || empty($sql) || !is_string($sql))
- return false;
-
- return true;
- }
-
- /**
- * 内部呼び出しメソッド
- */
- プライベート関数 pdoExecSq($ sql,$data,$select = []){
- try{
- $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;
- }finally {
- 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 as $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;
- }
- }
-
- /**
- * 解放に使用される内部呼び出しメソッド
- */
- private function free()
- {
- if ( is_null($this->pdo))
- $this->getConnect();
-
- if (!empty($this->statement))
- {
- $this->statement->closeCursor() ;
- $this->statement = null;
- }
- }
- }
- ?>
-
复制代
|