1. 程式人生 > 實用技巧 >WEB前端第五十七課——單例模式、PDO、singleton獲取PDO、PDO操作DB、PDO異常捕獲

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

1.singleLeton

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

  目的是為了在全域性獲取這個類的物件時總能獲取到唯一的物件,而不是每次例項化都創建出新的物件的一種結構。

  特別是在DB操作中,DB連線這種物件就必須是通過單例模式來實現的。

  程式碼示例:

<?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資料物件,即PHPDataObject。

  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資料庫連線的一個基礎模板。

<?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();
    }
?>

  提示:

    在程式碼程式中,異常處理並不是必須有一種或多種,不設定異常處理機制也不違法,

    但是,主動實現異常處理,能夠在異常發生的時候能夠給出更友好的提示資訊,

    因此,如果允許的情況下,儘可能的新增異常處理模組程式碼。