PHP PDO操作MYSQL封装类

2021-09-24 10:33:22 浏览数 (2)

代码语言:javascript复制
<?php
/**

auther soulence
调用数据类文件
modify 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()); 
     return false; 
 }

 if(!$pdo) { 
     throw new Exception('PDO CONNECT ERROR'); 
     return false; 
 } 

 return $pdo;
 
}
/**

得到操作数据库对象
@param string $dbname 对应的数据库是谁
@param bool $attr  是否长连接
return 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] = new self($dbname,$attr);
 
return self::$_instance[$key];
}
private function 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   是否返回一条内容  默认为否
*/
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);
}
/**

内部查询的共用方法
*/
private function 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都只返回一条数据
*/
public function queryes($arr_sql, $arr_data = [], $one = false)
{
 if(!is_array($arr_sql) || empty($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('Error where queryes 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 < 0) {

 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  是否事务操作  默认为否
*/
public function executeDDL($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('Error DDLExecute <=====>'.$e->getMessage());
 return false;
 
} 
}
/**

这个是用来进行添加 删除  修改操作  使用事务操作 
它是执行多条的
@param array $arr_sql  需要执行操作的SQL语句数组
@param array $arr_data  与数组对应SQL语句的条件
@param bool $Transaction  是否事务操作  默认为否
*/
public function executeDDLes($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('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());
 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) || empty($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) || 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  是否事务操作  默认为否
*/
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;

 
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 < 0) {

 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;
}
/**

内部调用方法

*/
private function 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);
 }
 
}
}
/**

内部调用方法

*/
private function 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语句的方法
*/
private function 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;
 
}
}
}
?></pre> 

0 人点赞