zoukankan      html  css  js  c++  java
  • PHP PDO的简单封装(使用命名空间方式)

    DAO:数据库访问对象(Database Access Object)

    直接上代码:要点都在注释中了

    namespace core;
    //引入全局空间类:PDO相关的3个类
    use PDO,PDOStatement,PDOException;
    
    class Dao{
        private $pdo;
        private $fetch_mode;    //获取结果集的模式
        /**
         *@desc 构造方法,获取pdo对象,设置字符集
         *@param1 array $info,数据库基本信息
         *@param2 array $info,数据库驱动配置
         */
        public function __construct($info = array(), $drivers = array()){
            $dbtype = $info['dbtype'] ?? 'mysql';
            $host = $info['host'] ?? 'localhost';
            $port = $info['port'] ?? '3306';
            $user = $info['user'] ?? 'root';
            $password = $info['password'] ?? '***';
            $dbname = $info['dbname'] ?? 'demo';
            $charset = $info['charset'] ?? 'utf8';
            $this->fetch_mode = $info['fetch_mode'] ?? PDO::FETCH_ASSOC;
    
            $drivers[PDO::ATTR_ERRMODE] = $drivers[PDO::ATTR_ERRMODE] ?? PDO::ERRMODE_EXCEPTION;
    
            $dsn = "{$dbtype}:host={$host};port={$port};dbname={$dbname}";
            try{
                $this->pdo = new PDO($dsn, $user, $password, $drivers);
            }catch(PDOException $e){
                die("数据库连接失败:{$e->getMessage()} in line {$e->getLine()}");
            }
            try{
                $this->pdo->exec("set names {$charset}");
            }catch(PDOException $e){
                die("字符集设置失败:{$e->getMessage()} in line {$e->getLine()}");
            }
        }
        /**
         * @desc 合并PDO::exec和PDO::query为同一个方法,类似mysqli的query函数
         * @param1 string $sql,SQL语句
         * @param2 bool $all,是否获取所有查询结果
         */
        public function query($sql,$all = true){
            $sql = trim($sql);
            $str1 = substr($sql,0,7);
            $str2 = substr($sql,0,5);
    
            if($str1 === 'select ' || $str2 === 'desc ' || $str2 === 'show '){
                //检查到是查询语句,使用PDO::query函数
                try{
                    $stmt = $this->pdo->query($sql);
                    if($all){
                        return $stmt->fetchAll($this->fetch_mode);
                    }else{
                        return $stmt->fetch($this->fetch_mode);
                    }
                }catch(PDOException $e){
                    die("数据库查询失败{$e->getMessage()} in line {$e->getLine()}");
                }
            } else {
                //否则使用PDO::exec函数
                try{
                    $row_num = $this->pdo->exec($sql);
                    $last_id = $this->pdo->lastInsertId();
                    //返回影响行数和lastInsertId,不是插入操作时lastInsertId为0
                    return array(
                        'row_num' => $row_num,
                        'last_id' => $last_id
                    );
                }catch(PDOException $e){
                    die("数据库操作失败{$e->getMessage()} in line {$e->getLine()}");
                }
            }
        }
    }
    //测试 $spdo = new Dao(); echo '<pre>'; var_dump($spdo); 
    print_r($spdo->query("select * from students")); 
    print_r($spdo->query("insert into students values(null,'sdff',22)")); 
    print_r($spdo->query("set names utf8"));
  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/chuanzi/p/10400615.html
Copyright © 2011-2022 走看看