简易封装PDO的操作类

<?php
ini_set(‘display_errors‘, true);

final class DB {
    private static $db;
    public static function getInstance(): PDO {
        if(!self::$db instanceof PDO) {
            new self();
        }
        return self::$db;
    }
    private function __clone() {}
    private function __construct() {
        $config = parse_ini_file(‘./db.ini‘);
        $dsn = sprintf(‘mysql:localhost=%s;dbname=%s;port=%d;charset=%s‘, $config[‘host‘], $config[‘dbname‘], $config[‘port‘], $config[‘charset‘]);
        try{
            self::$db = new PDO($dsn, $config[‘user‘], $config[‘password‘]);
        }catch(PDOException $e) {
            exit($e->getMessage());
        }
    }
}

class Statement {
    private static $statement;
    private $state;
    private function __construct(PDO $db, string $sql) {
        $this->state = $db->prepare($sql);
    }
    public static function getInstance(PDO $db, string $sql) {
        if(!self::$statement instanceof Statement) {
            self::$statement = new self($db, $sql);
        }
        return self::$statement;
    }
    public function bindValue($key, $val) {
        return $this->state->bindValue($key, $val);
    }
    public function bindParam($key, $val) {
        return $this->state->bindParam($key, $val);
    }
    public function execute() {
        return $this->state->execute();
    }
    public function fetchOne() {
        return $this->state->fetch(PDO::FETCH_ASSOC);
    }
    public function fetchAll() {
        return $this->state->fetchAll(PDO::FETCH_ASSOC);
    }
    public function fetchColumn(int $index = null) {
        return $this->state->fetchColumn($index);
    }
    public function resetQuery() {
        return $this->state->closeCursor();
    }
    public function effectRow() {
        return $this->state->rowCount();
    }
    public function errorReason() {
        return $this->state->errorInfo()[2];
    }
}

class Query {
    private $db;
    private $statement;
    public function __construct(string $sql) {
        $this->db = DB::getInstance();
        $this->statement = Statement::getInstance($this->db, $sql);
    }
    private function exec() {
        return $this->statement->execute() ? true: $this->statement->errorReason() ?? ‘SQL语句有误‘;
    }
    private function queryRes(bool $is_all = false) {
        $res = $this->exec();
        if($res) {
            $data = $is_all? $this->statement->fetchAll(): $this->statement->fetchOne();
            return $data === false? []: $data;
        }
        return $res;
    }
    public function bindValue($key = null, $val = null) {
        if(func_num_args() === 0 || (!is_array($key) && !$val)) {
            return $this;
        } else if(is_array($key)) {
            foreach($key as $k => $v) {
                $this->statement->bindValue($k, $v);
            }
        } else {
            $this->statement->bindValue($key, $val);
        }
        return $this;
    }
    public function bindParam($key = null, $val = null) {
        if(func_num_args() === 0 || (!is_array($key) && !$val)) {
            return $this;
        } else if(is_array($key)) {
            foreach($key as $k => $v) {
                $this->statement->bindParam($k, $v);
            }
        } else {
            $this->statement->bindParam($key, $val);
        }
        return $this;
    }
    public function one() {
        return $this->queryRes(false);
    }
    public function all() {
        return $this->queryRes(true);
    }
    public function fetchColumn($index = 0) {
        $res = $this->exec();
        if($res) {
            $data = $this->statement->fetchColumn($index);
            return $data === false? ‘‘: $data;
        }
        return $res;
    }
    public function __destruct() {
        $this->statement->resetQuery();
    }
}
$res = (new Query(‘SELECT * FROM `user` WHERE `id` > :id ‘))->bindValue(‘:id‘,2)->all();
var_dump($res);
?>

原文地址:https://www.cnblogs.com/rickyctbu/p/11074821.html

时间: 2024-11-06 07:35:07

简易封装PDO的操作类的相关文章

PDO数据库操作类

1 <?php 2 include 'common_config.php'; 3 4 /** 5 * Class Mysql 6 * PDO数据库操作类 7 */ 8 class Mysql { 9 protected static $_dbh = null; //静态属性,所有数据库实例共用,避免重复连接数据库 10 protected $_dbType = DB_TYPE; 11 protected $_pconnect = false; //是否使用长连接 12 protected $_h

php 封装mysql 数据库操作类

<?phpheader('content-type:text/html;charset=utf-8');//封装mysql   连接数据库php_mysql//封装mysql   连接数据库php_mysqli//封装mysql   连接数据库php_pdoclass db{    //三私一共    //私有的静态属性    private static $dbcon = false; //存储数据库连接对象    //私有的构造方法    private function __constru

使用单例模式设计PDO数据操作类

<?php /** * MyPDO * @author LHL <[email protected]> * @date 2016.04.20 */ class MyPDO{ protected static $_instance = null; protected $dbName = ''; protected $dsn; protected $dbh; /** * 构造函数 */ private function __construct($dbhost,$dbname,$dbUser,

应用程序框架实战十二:公共操作类开发技巧(初学者必读)

本文专门为初学者而写,因为很多初学者可能还不了解公共操作类的作用和封装技巧,大部分有经验的程序员都会把自己所碰到的技术问题整理封装成类,这就是公共操作类.公共操作类往往具有一些通用性,也可能专门解决某些棘手问题.公共操作类是应用程序框架的核心,主要目标是解决大部分技术问题.我将在本文介绍封装公共操作类的要点,供初学者参考. 开发公共操作类的原因 很多初学者会奇怪,.Net Framework提供的API相当易用,为何还要多此一举,进行一层封装呢.下面列举封装公共操作类的一些动机. .Net Fr

我的DbHelper数据操作类(转)

其实,微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要"评估"...一评就是几个月...而且,一些公司有的根本就是裸ado.net开发,或者自己封装的数据库操作类非常别扭,很不好用.      这里我给大家共享一个我参照企业库中的数据操作组件编码风格写的数据库操作类,对使用它的程序员来说,编码是很舒服滴(起码我觉得很好撒).以下是代码,很简单的,

20150113--PDO增删改查+封装PDO类

回顾 方法重写:是因为对象的访问会先去子类的类空间找,从而形成了对父类的覆盖. 继承链:类只能单继承,但是可以通过继承链来实现多继承 特殊类:final类和抽象类 接口:interface PHP重载:当访问一个权限不够或者不存在的属性或者方法的时候,会自动触发的魔术方法. 属性重载和方法重载 对象的保存和还原:serialize和unserialize(对应的类已经在内存:如果有资源属性必须进行重新加载资源),魔术方法(__sleep和__wakeup) 对象遍历:默认只能遍历public属性

c# 封装的文件夹操作类之复制文件夹

c#  封装的文件夹操作类之复制文件夹 一.复制文件夹原理: 1.递归遍历文件夹 2.复制文件 二.FolderHelper.cs 1 /// <summary> 2 /// 文件夹操作类 3 /// </summary> 4 public static class FolderHelper 5 { 6 /// <summary> 7 /// 复制文件夹 8 /// </summary> 9 /// <param name="sourceFo

操作类封装

/*操作类封装 */ /*调用方法 如下: * var str= new IStrManipulation();//实例化字符串处理接口 * console.log(str.StrManipulation('StrManipulation',"111sss23123").getLength()); * var convert =new IConvert();//实例化类型转换接口 * console.log(convert.Convert('Convert',"1112312

Android适配器之DataModifyHelper数据操作类的封装

编写适配器代码时常常被以下几个问题所困扰: 1.业务层和适配器中对同一组数据进行维护,难以管理 2.在业务层针对数据进行修改后必须通知适配器更新,否则提示The content of the adapter has changed but ListView did not receive anotification 3.业务层修改数据时充斥大量的非空&数据标准化等冗余代码 针对前两个问题,可以将数据交由适配器去管理,业务层对数据的增删改查均通过适配器进行处理,这样仅需要维护好adapter中的数