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(); } ?>
提示:
在代碼程序中,異常處理並非必須有一種或多種,不設置異常處理機制也不違法,
可是,主動實現異常處理,可以在異常發生的時候可以給出更友好的提示信息,
所以,若是容許的狀況下,儘量的添加異常處理模塊代碼。