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

[复制链接]
查看: 1839|回复: 31
发表于 2022-10-26 15:36:35 | 显示全部楼层 | 阅读模式
步骤
1、实现单例模式
2、初始化参数
3、连接数据库
4、执行增删改
5、执行查询
        a)返回二维数组
        b)返回一维数组
        c)返回一行一列
代码实现
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>Document</title>

  8. </head>
  9. <body>
  10. <?php
  11. class MyPDO{
  12.     private $type;      //数据库类别
  13.     private $host;      //主机地址
  14.     private $port;      //端口号
  15.     private $dbname;    //数据库名
  16.     private $charset;   //字符集
  17.     private $user;      //用户名
  18.     private $pwd;       //密码
  19.     private $pdo;       //保存PDO对象
  20.     private static $instance;
  21.     private function __construct($param) {
  22.         $this->initParam($param);
  23.         $this->initPDO();
  24.         $this->initException();
  25.     }
  26.     private function __clone() {
  27.     }
  28.     public static function getInstance($param=array()){
  29.         if(!self::$instance instanceof self)
  30.             self::$instance=new self($param);
  31.         return self::$instance;
  32.     }
  33.     //初始化参数
  34.     private function initParam($param){
  35.         $this->type=$param['type']??'mysql';
  36.         $this->host=$param['host']??'127.0.0.1';
  37.         $this->port=$param['port']??'3306';
  38.         $this->dbname=$param['dbname']??'data';
  39.         $this->charset=$param['charset']??'utf8';
  40.         $this->user=$param['user']??'root';
  41.         $this->pwd=$param['pwd']??'root';
  42.     }
  43.     //初始化PDO
  44.     private function initPDO(){
  45.         try{
  46.             $dsn="{$this->type}:host={$this->host};port={$this->port};dbname={$this->dbname};charset={$this->charset}";
  47.             $this->pdo=new PDO($dsn, $this->user, $this->pwd);
  48.         } catch (PDOException $ex) {
  49.             $this->showException($ex);
  50.             exit;
  51.         }
  52.     }
  53.    
  54.     //显示异常
  55.     private function showException($ex,$sql=''){
  56.         if($sql!=''){
  57.             echo 'SQL语句执行失败<br>';
  58.             echo '错误的SQL语句是:'.$sql,'<br>';
  59.         }
  60.         echo '错误编号:'.$ex->getCode(),'<br>';
  61.         echo '错误行号:'.$ex->getLine(),'<br>';
  62.         echo '错误文件:'.$ex->getFile(),'<br>';
  63.         echo '错误信息:'.$ex->getMessage(),'<br>';
  64.     }
  65.     //设置异常模式
  66.     private function initException(){
  67.         $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  68.     }

  69.     //执行增、删、改操作
  70.     public function exec($sql){
  71.         try{
  72.             return $this->pdo->exec($sql);
  73.         } catch (PDOException $ex) {
  74.             $this->showException($ex, $sql);
  75.             exit;
  76.         }
  77.     }
  78.     //获取自动增长的编号
  79.     public function lastInsertId(){
  80.         return $this->pdo->lastInsertId();
  81.     }
  82.    
  83.     //判断匹配的类型
  84.     private function fetchType($type){
  85.         switch ($type){
  86.             case 'num':
  87.                 return PDO::FETCH_NUM;
  88.             case 'both':
  89.                 return PDO::FETCH_BOTH;
  90.             case 'obj':
  91.                 return PDO::FETCH_OBJ;
  92.             default:
  93.                  return PDO::FETCH_ASSOC;
  94.         }
  95.     }
  96.     //获取所有数据 ,返回二维数组
  97.     public function fetchAll($sql,$type='assoc'){
  98.         try{
  99.             $stmt=$this->pdo->query($sql);  //获取PDOStatement对象
  100.             $type= $this->fetchType($type); //获取匹配方法
  101.             return $stmt->fetchAll($type);
  102.         } catch (Exception $ex) {
  103.             $this->showException($ex, $sql);
  104.         }
  105.     }
  106.     //获取一维数组
  107.     public function fetchRow($sql,$type='assoc'){
  108.         try{
  109.             $stmt=$this->pdo->query($sql);  //获取PDOStatement对象
  110.             $type= $this->fetchType($type); //获取匹配方法
  111.             return $stmt->fetch($type);
  112.         } catch (Exception $ex) {
  113.             $this->showException($ex, $sql);
  114.             exit;
  115.         }
  116.     }
  117.     //返回一行一列
  118.     public function fetchColumn($sql){
  119.         try{
  120.              $stmt=$this->pdo->query($sql);
  121.             return $stmt->fetchColumn();
  122.         } catch (Exception $ex) {
  123.             $this->showException($ex, $sql);
  124.             exit;
  125.         }
  126.         
  127.     }
  128.    
  129. }
  130. //测试
  131. $param=array(
  132.    
  133. );
  134. $mypdo= MyPDO::getInstance($param);
  135. //echo $mypdo->exec('delete from news where id=6');
  136. /*
  137. if($mypdo->exec("insert into news values (null,'11','1111',unix_timestamp())"))
  138.     echo '自动增长的编号是:'.$mypdo->lastInsertId ();
  139. */

  140. //$list=$mypdo->fetchAll('select * from news');
  141. //$list=$mypdo->fetchRow('select * from news where id=1');
  142. $list=$mypdo->fetchColumn('select count(*) from news');
  143. echo '<pre>';
  144. var_dump($list);
  145. ?>
  146. </body>
  147. </html>
复制代码

易博软件介绍

0

主题

25

帖子

14

积分

营销入门

Rank: 2

积分
14
发表于 2023-2-15 19:49:45 | 显示全部楼层
你的这编文章让我体味到做程序员的艰难历程  
发表于 2023-2-17 04:09:14 | 显示全部楼层
就像楼上说的那样,我也不知道自己是第几个回帖的,但是看了这篇文章后我没有办法不让自己回,是啊,我今年大2了,很多同学说编程难,都去学网页什么的了,而我却一早把自己出卖给了编程,我学的是C/C++,真的很难,不过我仍然在坚持,我也不知道前途会怎样,我只知道做自己最想做的事,就好了,很开心认识大家!!

0

主题

29

帖子

16

积分

营销入门

Rank: 2

积分
16
发表于 2023-2-19 08:30:52 | 显示全部楼层
不错不错。说出了我在大学的困惑和努力的方向。。谢谢!!

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-2-20 17:44:09 | 显示全部楼层
学海无崖,回头是岸...

0

主题

23

帖子

12

积分

营销入门

Rank: 2

积分
12
发表于 2023-2-21 22:58:30 | 显示全部楼层
很好啊

0

主题

14

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-2-22 15:04:18 | 显示全部楼层
我真的很受启发!
发表于 2023-2-24 00:20:23 | 显示全部楼层
学海无崖苦做舟,努力,努力,再努力!

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-2-25 03:27:39 | 显示全部楼层
啊,真的很受用  我也打算学习编程,看了这篇文章,我也跟作者有一些相同的看法。

0

主题

23

帖子

12

积分

营销入门

Rank: 2

积分
12
发表于 2023-2-26 10:42:43 | 显示全部楼层
就像楼上说的那样,我也不知道自己是第几个回帖的,但是看了这篇文章后我没有办法不让自己回,是啊,我今年大2了,很多同学说编程难,都去学网页什么的了,而我却一早把自己出卖给了编程,我学的是C/C++,真的很难,不过我仍然在坚持,我也不知道前途会怎样,我只知道做自己最想做的事,就好了,很开心认识大家!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表