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資料物件,即 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資料庫連接的一個基礎模板,
<?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();
}
?>
提示:
在代碼程式中,例外處理并不是必須有一種或多種,不設定例外處理機制也不違法,
但是,主動實作例外處理,能夠在例外發生的時候能夠給出更友好的提示資訊,
因此,如果允許的情況下,盡可能的添加例外處理模塊代碼,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/247947.html
標籤:PHP
上一篇:PHP的變數賦值
