前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP PDO操作MYSQL封装类

PHP PDO操作MYSQL封装类

原创
作者头像
用户7108768
修改2021-09-24 10:33:22
3.3K0
修改2021-09-24 10:33:22
举报
代码语言: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*(INSERT\s+INTO|REPLACE\s+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> 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档