WEB前端第五十七課——單例模式、PDO、singleton獲取PDO、PDO操做DB、PDO異常捕獲

1.singleLetonphp

  singleLeton稱爲單例模式,是一種構造類的設計模式。html

  目的是爲了在全局獲取這個類的對象時總能獲取到惟一的對象,而不是每次實例化都建立出新的對象的一種結構。mysql

  特別是在DB操做中,DB鏈接這種對象就必須是經過單例模式來實現的。sql

  代碼示例:數據庫

<?php
    class DBConnectionSingleton{
        private static $con = null;         //使用私有靜態變量聲明單例對象
        public static function getcon(){
            if(!self::$con){                //對象self至關於this,表示當前類自己
                self::$con = new self();    //經過靜態變量只執行一次的特色保證對象全局惟一性的特色。
            }
            return self::$con;
        }
    }
    $con1 = DBConnectionSingleton::getcon();  //獲取類中的靜態方法使用「::」操做符!!
    $con2 = DBConnectionSingleton::getcon();
    print_r ($con1);
    print_r ($con2);     //兩次實例化結果相同
    
?>

2.PDO設計模式

  PDO是PHP數據對象,即 PHP Data Object。服務器

  PDO能夠被視爲一個工具,該工具爲PHP訪問數據庫定義了一個輕量級的一致接口。函數

  實現PDO接口的每個數據庫驅動,能夠公開具體數據庫的特性做爲標準擴展功能。工具

  語法:$pdo = new PDO("DB名:host=主機名; dbname=數據庫名", "DB帳號","DB密碼");ui

     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數據庫鏈接的一個基礎模板。

<?php
    header('Content-type: text/html; charset=UTF8');
    class singletonPDO{
        private static $pdo = null;         //使用私有靜態變量聲明單例對象
        public static function getPdo(){
            if(self::$pdo==null){
                try{
                    self::$pdo = new PDO("mysql:host=localhost;dbname=dbTest","root","");
                }catch(PDOException $err){
                    echo "數據庫鏈接失敗,錯誤信息:".$err->getMessage();
                }
            }
            return self::$pdo;
        }
    }
    $pdo1 = singletonPDO::getPdo();
    print_r ($pdo1);
//  能夠經過「 require''或include'' 」方法,在其餘PHP文件中引用這個模板。
//  爲避免重複屢次引用,可使用「 require_once'' 」。
?>

4.PDO實現DB增刪改查

  經過PDO對DB進行操做和PHP直接操做相似。

  代碼示例:

<?php
    require_once '20210111singleton.php';  //引入PDO鏈接文件
    $pdo2 = singletonPDO::getPdo();     //經過單例方法獲取全局惟一PDO對象
    $pdo2 -> exec('set names utf8');    //PDO中的「exec()」方法與PHP的「query()」方法至關,用於執行SQL語句
    $sql = "insert into namelist(name,age,sex,password) values('Lucy',27,'girl','111111')";
    $res = $pdo2 -> exec($sql);      //經過PDO執行DB操做
    if($res){
        echo 'execute success!';
    }else{
        echo 'execute error!';
    }
?>

  注意:經過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。

  注意:

    三種異常處理代碼在程序中書寫的位置不一樣!!!

  代碼示例:

<?php
    class singletonPDO{
        private static $pdo = null;
        public static function getPdo(){
            if(self::$pdo==null){
                try{
                    self::$pdo = new PDO("mysql:host=localhost;dbname=dbTest","root","");
//                第二種和第三種異常處理方法,在「try」中定義!

//                第二種異常處理方法,當數據庫錯作發生異常時,拋出警報提示,程序執行不會中斷
                    self::$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
                    
//                第三種異常處理方法,當數據庫錯作發生異常時,程序執行中斷並拋出錯誤信息
                    self::$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
                }
//            DB鏈接異常經過「catch()」方法進行捕獲並拋出
                catch(PDOException $err){
                    echo "數據庫鏈接失敗,錯誤信息:".$err->getMessage();
                }
            }
            return self::$pdo;
        }
    }
    $pdo2 = singletonPDO::getPdo();
    $pdo2 -> exec('set names utf8');
    $sql = "insert into namelist1(name,age,sex,password) values('Lucy',27,'girl','111111')";
    $res = $pdo2 -> exec($sql);
    if($res){
        echo 'execute success!';
    }else{
        echo 'execute error!'.'<br>';
//    系統提供的「errorCode」和「errorInfo」異常處理方法,經過 echo 拋出。
        echo $pdo2->errorCode();
        echo $pdo2->errorInfo();
    }
?>

  提示:

    在代碼程序中,異常處理並非必須有一種或多種,不設置異常處理機制也不違法,

    可是,主動實現異常處理,可以在異常發生的時候可以給出更友好的提示信息,

    所以,若是容許的狀況下,儘量的添加異常處理模塊代碼。

相關文章
相關標籤/搜索