人亦已歌 发表于 2022-10-26 15:36:35

PDO专题(七)-单例模式封装MyPDO类

步骤1、实现单例模式2、初始化参数3、连接数据库4、执行增删改5、执行查询        a)返回二维数组        b)返回一维数组        c)返回一行一列代码实现<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

</head>
<body>
<?php
class MyPDO{
    private $type;      //数据库类别
    private $host;      //主机地址
    private $port;      //端口号
    private $dbname;    //数据库名
    private $charset;   //字符集
    private $user;      //用户名
    private $pwd;       //密码
    private $pdo;       //保存PDO对象
    private static $instance;
    private function __construct($param) {
      $this->initParam($param);
      $this->initPDO();
      $this->initException();
    }
    private function __clone() {
    }
    public static function getInstance($param=array()){
      if(!self::$instance instanceof self)
            self::$instance=new self($param);
      return self::$instance;
    }
    //初始化参数
    private function initParam($param){
      $this->type=$param['type']??'mysql';
      $this->host=$param['host']??'127.0.0.1';
      $this->port=$param['port']??'3306';
      $this->dbname=$param['dbname']??'data';
      $this->charset=$param['charset']??'utf8';
      $this->user=$param['user']??'root';
      $this->pwd=$param['pwd']??'root';
    }
    //初始化PDO
    private function initPDO(){
      try{
            $dsn="{$this->type}:host={$this->host};port={$this->port};dbname={$this->dbname};charset={$this->charset}";
            $this->pdo=new PDO($dsn, $this->user, $this->pwd);
      } catch (PDOException $ex) {
            $this->showException($ex);
            exit;
      }
    }
   
    //显示异常
    private function showException($ex,$sql=''){
      if($sql!=''){
            echo 'SQL语句执行失败<br>';
            echo '错误的SQL语句是:'.$sql,'<br>';
      }
      echo '错误编号:'.$ex->getCode(),'<br>';
      echo '错误行号:'.$ex->getLine(),'<br>';
      echo '错误文件:'.$ex->getFile(),'<br>';
      echo '错误信息:'.$ex->getMessage(),'<br>';
    }
    //设置异常模式
    private function initException(){
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }

    //执行增、删、改操作
    public function exec($sql){
      try{
            return $this->pdo->exec($sql);
      } catch (PDOException $ex) {
            $this->showException($ex, $sql);
            exit;
      }
    }
    //获取自动增长的编号
    public function lastInsertId(){
      return $this->pdo->lastInsertId();
    }
   
    //判断匹配的类型
    private function fetchType($type){
      switch ($type){
            case 'num':
                return PDO::FETCH_NUM;
            case 'both':
                return PDO::FETCH_BOTH;
            case 'obj':
                return PDO::FETCH_OBJ;
            default:
               return PDO::FETCH_ASSOC;
      }
    }
    //获取所有数据 ,返回二维数组
    public function fetchAll($sql,$type='assoc'){
      try{
            $stmt=$this->pdo->query($sql);//获取PDOStatement对象
            $type= $this->fetchType($type); //获取匹配方法
            return $stmt->fetchAll($type);
      } catch (Exception $ex) {
            $this->showException($ex, $sql);
      }
    }
    //获取一维数组
    public function fetchRow($sql,$type='assoc'){
      try{
            $stmt=$this->pdo->query($sql);//获取PDOStatement对象
            $type= $this->fetchType($type); //获取匹配方法
            return $stmt->fetch($type);
      } catch (Exception $ex) {
            $this->showException($ex, $sql);
            exit;
      }
    }
    //返回一行一列
    public function fetchColumn($sql){
      try{
             $stmt=$this->pdo->query($sql);
            return $stmt->fetchColumn();
      } catch (Exception $ex) {
            $this->showException($ex, $sql);
            exit;
      }
      
    }
   
}
//测试
$param=array(
   
);
$mypdo= MyPDO::getInstance($param);
//echo $mypdo->exec('delete from news where id=6');
/*
if($mypdo->exec("insert into news values (null,'11','1111',unix_timestamp())"))
    echo '自动增长的编号是:'.$mypdo->lastInsertId ();
*/

//$list=$mypdo->fetchAll('select * from news');
//$list=$mypdo->fetchRow('select * from news where id=1');
$list=$mypdo->fetchColumn('select count(*) from news');
echo '<pre>';
var_dump($list);
?>
</body>
</html>

handsomewill 发表于 2023-2-15 19:49:45

你的这编文章让我体味到做程序员的艰难历程

欺骗的怎可厮守 发表于 2023-2-17 04:09:14

就像楼上说的那样,我也不知道自己是第几个回帖的,但是看了这篇文章后我没有办法不让自己回,是啊,我今年大2了,很多同学说编程难,都去学网页什么的了,而我却一早把自己出卖给了编程,我学的是C/C++,真的很难,不过我仍然在坚持,我也不知道前途会怎样,我只知道做自己最想做的事,就好了,很开心认识大家!!

alw_ddd 发表于 2023-2-19 08:30:52

不错不错。说出了我在大学的困惑和努力的方向。。谢谢!!

yydf1234 发表于 2023-2-20 17:44:09

学海无崖,回头是岸...

0o续集o0 发表于 2023-2-21 22:58:30

很好啊

姚姚的梦 发表于 2023-2-22 15:04:18

我真的很受启发!

aimeimeng 发表于 2023-2-24 00:20:23

学海无崖苦做舟,努力,努力,再努力!

行舟如叶 发表于 2023-2-25 03:27:39

啊,真的很受用我也打算学习编程,看了这篇文章,我也跟作者有一些相同的看法。

hw2007name 发表于 2023-2-26 10:42:43

就像楼上说的那样,我也不知道自己是第几个回帖的,但是看了这篇文章后我没有办法不让自己回,是啊,我今年大2了,很多同学说编程难,都去学网页什么的了,而我却一早把自己出卖给了编程,我学的是C/C++,真的很难,不过我仍然在坚持,我也不知道前途会怎样,我只知道做自己最想做的事,就好了,很开心认识大家!!
页: [1] 2 3 4
查看完整版本: PDO专题(七)-单例模式封装MyPDO类