0

0

PHP PDO操作MYSQL封装类

PHP中文网

PHP中文网

发布时间:2016-05-23 16:41:13

|

4695人浏览过

|

来源于php中文网

原创

php代码

LANUX蓝脑商务网站系统
LANUX蓝脑商务网站系统

LANUX V1.0 蓝脑商务网站系统 适用于网店、公司宣传自己的品牌和产品。 系统在代码、页面方面设计简约,浏览和后台管理操作效率高。 此版本带可见即可得的html编辑器, 方便直观添加和编辑要发布的内容。 安装: 1.解压后,更换logo、分类名称、幻灯片的图片及名称和链接、联系我们等等页面。 2.将dbconfig.php里面的数据库配置更改为你的mysql数据库配置 3.将整个文件夹上传至

下载
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;
        }
    }
}
?>
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

1

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

10

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

1

2026.02.12

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

7

2026.02.12

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

195

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

640

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

94

2026.02.11

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

7

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php初学者入门课程
php初学者入门课程

共10课时 | 0.7万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 1.4万人学习

极客学院mysql视频教程
极客学院mysql视频教程

共56课时 | 18.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号