经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
WEB前端第五十七课——单例模式、PDO、singleton获取PDO、PDO操作DB、PDO异常捕获
来源:cnblogs  作者:后来喵  时间:2021/1/18 16:37:38  对本文有异议

1.singleLeton

  singleLeton称为单例模式,是一种构造类的设计模式。

  目的是为了在全局获取这个类的对象时总能获取到唯一的对象,而不是每次实例化都创建出新的对象的一种结构。

  特别是在DB操作中,DB连接这种对象就必须是通过单例模式来实现的。

  代码示例:

  1. <?php
  2. class DBConnectionSingleton{
  3. private static $con = null; //使用私有静态变量声明单例对象
  4. public static function getcon(){
  5. if(!self::$con){ //对象self相当于this,表示当前类本身
  6. self::$con = new self(); //通过静态变量只执行一次的特点保证对象全局唯一性的特点。
  7. }
  8. return self::$con;
  9. }
  10. }
  11. $con1 = DBConnectionSingleton::getcon();  //获取类中的静态方法使用“::”操作符!!
  12. $con2 = DBConnectionSingleton::getcon();
  13. print_r ($con1);
  14. print_r ($con2); //两次实例化结果相同
  15. ?>

2.PDO

  PDO是PHP数据对象,即 PHP Data Object。

  PDO可以被视为一个工具,该工具为PHP访问数据库定义了一个轻量级的一致接口。

  实现PDO接口的每一个数据库驱动,可以公开具体数据库的特性作为标准扩展功能。

  语法:$pdo = new PDO("DB名:host=主机名; dbname=数据库名", "DB账号","DB密码");

     DB名 就是所使用的数据库,即MySQL或Oracle或mangodb等;

     主机名 是数据库服务器地址,localhost或127.0.0.1或其他ip地址;

  注意:

    ⑴ 利用PDO扩展自身并不能实现任何数据库功能,

     必须使用一个具体数据库的PDO驱动来访问数据库服务;

    ⑵ PDO提供了一个“数据访问”抽象层,这意味着不管使用哪种数据库,

     都可以用相同的函数(方法)来查询和获取数据;

    ⑶ PDO不提供数据库抽象层,它不会重写SQL,也不会模拟缺失的特性,

     如果需要的话,应该使用一个成熟的抽象层;

    ⑷ 从PHP5.1开始附带了PDO,而在PHP5.0中是作为一个pecl扩展使用,

     PDO需要PHP5核心的新特性,因此不能在较早版本的PHP上运行。

  补充:

    为了检测DB链接状态是否成功,PDO提供了“try...catch”机制。

    语法:

      try{

        $pdo = new PDO('mysql:host=lcalhost; dbname=dbTest','root','');

      }catch(PDOException $err){    //PDOException 为PDO内置异常对象

        echo '连接异常,错误信息:';

        echo $err->getMessage();   //getMessage()是PDO内置获取错误信息的方法。

      }

      在上述“try...catch”结构中,try部分是可能会出现异常的代码,

      当代码执行过程中,一旦 try 部分的代码发生异常,那么会立即将这个异常抛出,

      并执行 catch 部分的代码。

      catch 部分的形参“$err”就是用来接收抛出的异常信息的。

 3.singleton获取PDO

  下述代码示例可以作为通过 singleton 获取PDO数据库连接的一个基础模板。

  1. <?php
  2. header('Content-type: text/html; charset=UTF8');
  3. class singletonPDO{
  4. private static $pdo = null; //使用私有静态变量声明单例对象
  5. public static function getPdo(){
  6. if(self::$pdo==null){
  7. try{
  8. self::$pdo = new PDO("mysql:host=localhost;dbname=dbTest","root","");
  9. }catch(PDOException $err){
  10. echo "数据库连接失败,错误信息:".$err->getMessage();
  11. }
  12. }
  13. return self::$pdo;
  14. }
  15. }
  16. $pdo1 = singletonPDO::getPdo();
  17. print_r ($pdo1);
  18. // 可以通过“ require''或include'' ”方法,在其他PHP文件中引用这个模板。
  19. // 为避免重复多次引用,可以使用“ require_once'' ”。
  20. ?>

4.PDO实现DB增删改查

  通过PDO对DB进行操作和PHP直接操作类似。

  代码示例:

  1. <?php
  2. require_once '20210111singleton.php';  //引入PDO连接文件
  3. $pdo2 = singletonPDO::getPdo(); //通过单例方法获取全局唯一PDO对象
  4. $pdo2 -> exec('set names utf8'); //PDO中的“exec()”方法与PHP的“query()”方法相当,用于执行SQL语句
  5. $sql = "insert into namelist(name,age,sex,password) values('Lucy',27,'girl','111111')";
  6. $res = $pdo2 -> exec($sql);      //通过PDO执行DB操作
  7. if($res){
  8. echo 'execute success!';
  9. }else{
  10. echo 'execute error!';
  11. }
  12. ?>

  注意:通过PDO执行DB查询时,查询结果为不可见,需要结合“预处理prepare和事务处理transaction”。

 

5.PDO异常处理Exception

  异常处理Exception是指在“try...catch”过程中发生异常时的处理手段,通常都是直接抛出提醒即可。

  设置提醒的方法有三种:

    ⑴ 默认模式
      主要依赖于系统提供的“errorCode”和“errorInfo”属性实现;
    ⑵ 警报模式
      为PDO设置:setAttribute(PDO::ATTR_ERRORMODE,PDO::WRRORMODE_WARNING);
    ⑶ 中断模式

      为PDO设置:setAttribute(PDO::ATTR_ERRORMODE,PDO::ERRORMODE_EXCEPTION);

  说明:

    上述三种异常处理模式,都指的是在执行DB操作时发生的异常,比如SQL语句异常或语法错误;

    如果DB连接发生错误,则不会走该异常处理,而是直接由PDO输出连接失败,try...catch 中的 PDOException。

  注意:

    三种异常处理代码在程序中书写的位置不同!!!

  代码示例:

  1. <?php
  2. class singletonPDO{
  3. private static $pdo = null;
  4. public static function getPdo(){
  5. if(self::$pdo==null){
  6. try{
  7. self::$pdo = new PDO("mysql:host=localhost;dbname=dbTest","root","");
  8. // 第二种和第三种异常处理方法,在“try”中定义!
  9.  
  10. // 第二种异常处理方法,当数据库错做发生异常时,抛出警报提示,程序执行不会中断
  11. self::$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
  12. // 第三种异常处理方法,当数据库错做发生异常时,程序执行中断并抛出错误信息
  13. self::$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
  14. }
  15. // DB连接异常通过“catch()”方法进行捕获并抛出
  16. catch(PDOException $err){
  17. echo "数据库连接失败,错误信息:".$err->getMessage();
  18. }
  19. }
  20. return self::$pdo;
  21. }
  22. }
  23. $pdo2 = singletonPDO::getPdo();
  24. $pdo2 -> exec('set names utf8');
  25. $sql = "insert into namelist1(name,age,sex,password) values('Lucy',27,'girl','111111')";
  26. $res = $pdo2 -> exec($sql);
  27. if($res){
  28. echo 'execute success!';
  29. }else{
  30. echo 'execute error!'.'<br>';
  31. // 系统提供的“errorCode”和“errorInfo”异常处理方法,通过 echo 抛出。
  32. echo $pdo2->errorCode();
  33. echo $pdo2->errorInfo();
  34. }
  35. ?>

  提示:

    在代码程序中,异常处理并不是必须有一种或多种,不设置异常处理机制也不违法,

    但是,主动实现异常处理,能够在异常发生的时候能够给出更友好的提示信息,

    因此,如果允许的情况下,尽可能的添加异常处理模块代码。

 

原文链接:http://www.cnblogs.com/husa/p/14264597.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号