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(); } ?>
提示:
在程式碼程式中,異常處理並不是必須有一種或多種,不設定異常處理機制也不違法,
但是,主動實現異常處理,能夠在異常發生的時候能夠給出更友好的提示資訊,
因此,如果允許的情況下,儘可能的新增異常處理模組程式碼。