目錄php
1, singletonmysql
2, pdo與dbsql
3, singleton獲取pdo數據庫
4, pdo實現db增刪改查設計模式
5, pdo異常處理exception數組
6, pdo預處理prepare函數
7, pdo事務處理transaction工具
8, 學生管理實例fetch
1, singletonui
singleton中文名稱爲單例模式,是一種構造類的設計模式。其目的是爲了在全局獲取這個類的對象時老是能獲取到惟一的對象,而不是每次實例化都建立出新的對象的一種類結構。 特別的在DB操做中,DB鏈接這種對象就必須是經過單例模式來實現的。
class DBConnectionSingleton{
private static $con = null; //經過私有+靜態聲明單例對象
//function __construct(){}
public static function getcon(){
if(!self::$con){ //經過靜態執行一次的特色保證對象惟一性
self::$con = new self();
}
return self::$con;
}
}
$con1 = DBConnectionSingleton::getcon();
$con2 = DBConnectionSingleton::getcon();
2. pdo與db
描述:PDO即PHP數據對象 (PHP Data Object)。
PDO可被視爲是一個工具,而這個工具爲PHP訪問數據庫定義了一個輕量級的一致接口。
實現PDO接口的每一個數據庫驅動能夠公開具體數據庫的特性做爲標準擴展功能。
語法:$pdo = new PDO("DB名:host=主機名;dbname=DB名","DB帳號","DB密碼");
注意:
(1)利用PDO擴展自身並不能實現任何數據庫功能,
必須使用一個具體數據庫的PDO驅動來訪問數據庫服務。
(2)PDO提供了一個【數據訪問】抽象層,這意味着無論使用哪一種數據庫,
均可以用相同的函數(方法)來查詢和獲取數據。
(3)PDO不提供數據庫抽象層,它不會重寫 SQL,也不會模擬缺失的特性。
若是須要的話,應該使用一個成熟的抽象層。
(4)從PHP 5.1開始附帶了PDO,在 PHP 5.0 中是做爲一個PECL擴展使用。
PDO須要PHP 5核心的新特性,所以不能在較早版本的 PHP 上運行。
總結:
PDO就像是一把槍,而使用哪一種數據庫就比如是選擇不一樣的子彈。
無論子彈有怎樣的特性,擊發的方法總沒有誤差,都是開槍而已。
補充:在鏈接DB的時候,並非每一次的鏈接都能保證必定完成。所以咱們必須
設置一個「保險」來幫助咱們監測鏈接的狀況,這個東西就是try…catch機制。
try{
$pdo = new PDO("mysql:host=localhost;dbname=frankdb","root","");
}catch(PDOException $e){
echo "錯誤";
echo $e->getMessage();
}
在整個try…catch結構中,try部分是可能會出現異常的代碼。
而當代碼執行的過程中一旦try部分的代碼真的發生了異常,那麼會當即將這個異常拋出,並執行catch部分的代碼。
catch部分的形參$e就是用來接收拋出的異常的。
能夠這樣認爲:上述結構是獲取PDO時的一個固定結構!
3.singleton獲取pdo
在說這節課內容以前,咱們先來肯定一下各位對於singleton和PDO這二者自己都已經掌握到必定程度,換句話說相信咱們都可以獨立的寫出singleton和獲取PDO的代碼。若是沒有異議,那麼讓咱們用一個問題來引出這節課的內容:
假設有小A和小B兩我的,這兩我的都在使用PDO來訪問DB。這時
(1)小A在經過PDO訪問DB,並刪除其中的全部數據。
(2)小B在經過PDO訪問DB,並查詢其中的某條數據。
若是沒有辦法肯定小A和小B誰先訪問DB,誰後訪問DB,那麼會產生怎樣的結果?
class PDOSingleton{
private static $pdo = null;
function __construct(){
if(!self::$pdo){
try{
$pdo = new PDO("mysql:host=localhost;dbname=frankdb","root","");
}catch(PDOException $e){
echo $e->getMessage();
}
}
return self::$pdo;
}
//提供單例方法以得到全局惟一的單例對象
public static function getpdo(){
if(!self::$pdo){
try{
$pdo = new PDO("mysql:host=localhost;dbname=frankdb","root","");
}catch(PDOException $e){
echo $e->getMessage();
}
}
return self::$pdo;
}
}
4.pdo實現db增刪改查
在上節課中咱們說過,pdo是一種【數據訪問】層的抽象。
所以本質上來說在面對同一種DB進行操做的時候,pdo的操做和php自己直接操做沒有區別。
require_once "PDOSingleton.php";
$pdo = PDOSingleton::getpdo(); //經過單例方法獲取全局pdo單例對象
$pdo->exec(‘set names utf8’); //exec()方法是pdo對象的執行方法,
至關於php中的query()方法.
$sql = "insert into friendslist values('炒雞大美女',222,222,2000001)";
//…
if($pdo->exec($sql)){ //經過pdo執行db操做
echo "success";
}else{
echo "error";
}
5.pdo異常處理exception
異常處理Exception是指在try…catch時發生異常時的處理手段,一般異常處理都是直接拋出提醒便可。而設置提醒的手段有三種設置方式:
(1)默認模式
主要依賴於系統提供的errorCode和errorInfo屬性實現
(2)警報模式:
爲pdo設置setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
(3)中斷模式:
爲pdo設置setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
小貼士:須要說明的是異常處理並非三種模式必須有一種顯式的去表現出來,哪怕一種都不主動寫出也不會認爲是違法。只不過主動實現異常處理可以在異常發生的時候給予咱們更好的提示,所以推薦若是容許的狀況下儘量的添加異常處理模塊代碼。
try{
$pdo = new PDO("mysql:host=localhost;dbname=frankdb","root","");
//$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
//$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOExeption $e){
echo $e -> getMessage();
}
$sql = "insert into friendslist vales(321,'hah',30,1000200)";
$res = $pdo->exec($sql);
if($res){
echo "succes";
}
else{
echo $pdo -> errorCode();
echo $pdo -> errorInfo();
}
6.pdo預處理prepare
預處理語句prepare是pdo提供的一中db操做方式。其語言邏輯與正常的pdo訪問相同。但區別在於prepare語句容許用戶在【設置sql語句】與【執行sql語句】之間部分進行參數的注入與提取操做,而不是像正常的pdo訪問同樣直接將參數寫死。
(1)prepare()方法和execute()方法
(2)bindValue()方法
(3)bindColumn()方法
1) prepare*()方法和execute()方法
描述:a.prepare()方法爲預處理sql語句的方法,可以讓pdo預先處理【半成品的】sql語句。
並生成一個PDOStatementObject類型的結果。
b.execute()方法是提供給PDOSO類型對象去執行的【成品】sql語句的方法
並生成一個PDOStatementObject類型的結果。
說明:
a.交由pdo去prepare預處理的【半成品】sql語句,使用?問號做爲佔位符,
表示待傳參的參數
b.prepare預處理必須只能處理【半成品】sql語句,若是是完整則須要使用exec方法執行
c.execute()方法容許一個數組做爲參數,將參數帶入到預處理的sql語句中,
而且會將結果存放到PDOSO對象中。
d.PDOSO對象在預處理的不一樣階段有着不一樣的含義!!不可混淆,必須根據上下文判斷。
語法:
$sql = "insert into friendslist values(?,?,?,?)";
$pdoso= $pdo->prepare($sql);
echo $pdoso->execute(array("炒雞大美女","female",99,12345698701));
2) bindvalue()方法
描述:bindValue()方法是提供給pdo預處理以後獲得的PDOSO對象使用的方法,
用來給【半成品】的sql語句進行傳值。
語法:$pdoso->bindValue(index,value);
說明:
(1)第一個參數表示給sql語句中第幾個參數傳值。第一個就寫1,以此類推。
(2)第二個參數表示給sql語句中的對應參數傳的具體的值。
(3)bindValue一次綁定一個參數,若是有多個則須要調用屢次。
例子:
$sql = "insert into friendslist values(?,?,?,?)";
$pdoso = $pdo->prepare($sql);
$pdoso->bindValue(1,'炒雞炒雞大美女');
$pdoso->bindValue(2,'female');
$pdoso->bindValue(3,666);
$pdoso->bindValue(4,1322321123);
echo $pdoso->execute();
3) bindcolumn()方法
描述:bindColumn()方法容許將執行結果的一列數據綁定到一個指定對象上,
本方法須要在execute()方法執行結束後在執行。
語法:$pdoso->bindColumn(index,指定變量);
說明:
(1)第一個參數表示結果中的第幾列數據。第一列就寫1,以此類推。
(2)第二個參數表示數據要賦值給那個變量,隨便一個變量便可。
(3)bindColumn()方法一次綁定一列給一個變量,如需綁定多個,則執行屢次便可。
例子:
$sql = "select * from friendslist";
$pdoso = $pdo -> prepare($sql);
$pdoso -> execute();
$pdoso -> bindColumn(1,$friendsName);
$pdoso -> bindColumn(2,$friendsSex);
while($row = $pdoso->fetch(PDO::FETCH_COLUMN)){
echo "{$friendsName}"."----"."{$friendsSex}"."<br/>";
}
7.pdo事務處理transaction
事務:多個事件組成的結構。
事件:事件實際上就是預處理語句執行的execute語句。
注意:
(1)整個事務操做必須放到try...catch中,這是由於咱們並不能保證執行的事件必定成功。
而對於整個事務而言,任何一個事件的失敗都會致使catch的觸發。
而catch觸發就意味着必須將以前作出的全部的操做都必須還原
回滾操做:$pdo->rollBack()
(2)操做語句必須在事務開啓以後執行,在事務提交以前中止.
開啓事務:$pdo->beginTransaction();
關閉事務:$pdo->commit();
(3)中文處理方案(避免亂碼):
讀取:$pdo ->query("set names utf8");
插入:$pdo ->exec('set names utf8');
require_once "PDOSingleton.php";
$pdo = PDOSingleton::getpdo();
$pdo->query('set names utf8');
$pdo->exec('set names utf8');
try{
$pdo->beginTransaction();
$sql = "update friendslist set friendsPhoneNumber=? where friendsName=?";
$pdoso = $pdo->prepare($sql);
$pdoso->execute(array(999,‘炒雞炒雞大美女’)); //成功
$pdoso->execute(array(777)); //失敗,參數不符
echo $pdo->commit();
}catch (PDOException $e){
$pdo -> rollBack();
echo "失敗";
}