PHP数据库单例连接封装

PHP数据库单例连接封装

<?php
/**
 * Created by PhpStorm.
 * User: ZTK
 * Date: 2020/5/22
 * Time: 15:29
 */
//单例模式数据库
class Db{

    private static $_instance;//
    private static $_dbConnect;
    private $_dbConfig = array(
        'host' => '127.0.0.1',
        'user' => 'root',
        'password' => '123456',
        'database' => 'test',
        'port' => 3306,
        'charset' => 'utf8mb4'
    );

    private function __construct()
    {
    }

    public function __clone()
    {
        //当用户clone操作时产生一个错误信息
        echo "禁止克隆".PHP_EOL;
        // 函数创建用户级别的错误消息。
        trigger_error("Can't clone object",E_USER_ERROR);
    }

    //获取单列
    public static function getInstance(){
        if(!(self::$_instance instanceof self)){  //如果当前实例不存在,创建
            echo "获取new新实例".PHP_EOL;
            self::$_instance = new self();
        }
//        var_dump(self::$_instance);
        self::$_instance->connect();
        return self::$_instance;
    }

    //连接数据库
    public function connect(){
        $host = $this->_dbConfig['host'];
        $user = $this->_dbConfig['user'];
        $pwd = $this->_dbConfig['password'];
        $dbname = $this->_dbConfig['database'];
        $port = $this->_dbConfig['port'];
        $charset = $this->_dbConfig['charset'];
        $dsn = "mysql:host=$host;dbname=$dbname;port=$port";
        $pdo = new PDO ( $dsn, $user, $pwd );
        $pdo->query("set names {$charset};");
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        self::$_dbConnect = $pdo;
        if(!self::$_dbConnect){
            throw new Exception('mysql connnect');
        }
        return self::$_dbConnect;
    }

    public function query($sql=null, $params=array() ){
        $stmt = Db::$_dbConnect->prepare($sql);
        if( is_array($params) && !empty($params) ){
            foreach($params as $k=>&$v){
                $stmt->bindParam($k, $v);
            }
        }
        if( $stmt->execute() )
            //查询多条数据
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        $err = $stmt->errorInfo();
        throw new Exception('Database SQL: "' . $sql. '". ErrorInfo: '. $err[2], 1);
    }

}
$a = Db::getInstance();//获取
$b = Db::getInstance();
try{
    $data = $a->query("select * from users");
    var_dump($data);
}catch (Exception $e){
    echo "sorry,error was happend.".$e->getMessage();
}

结果如下:

array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    int(1)
    ["username"]=>
    string(2) "nn"
    ["pass"]=>
    NULL
  }
  [1]=>
  array(3) {
    ["id"]=>
    int(2)
    ["username"]=>
    string(2) "mm"
    ["pass"]=>
    NULL
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值