pdo是什麼?
pdo是一個擴展庫,給不同的數據庫提供相同的接口,這樣的話在因業務需求更換數據庫時就不用重寫代碼了,只需要換不同的驅動就行了。
需要兩個條件:
- 支不支持PDO
開啓PDO步驟:找到php.ini
開啓:pod_myql_dll擴展
重啓apache
驗證是否登錄成功
2.有沒有相對應的驅動
可以在數據庫官網上查找
創建數據庫對象
創建數據庫的步驟:
1.設置dsn:
1)設置host
2)設置數據庫名字
3)設置字符集
舉例:
$dsn=’mysql:host=localhost;dbname=demo;charset=utf8’;
2.連接數據庫
寫SQL語句
操作數據庫
例子:
<?php
//連接數據庫
$dsn='mysql:host=localhost;dbname=demo;charset=utf8';
try{
$pdo=new PDO($dsn,"root","");
//設置錯誤模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
exit("數據庫連接錯誤".$e->getMessage());
}
try{
$sql="insert into user(name,password,money) value('lisi','123',2000)";
$num=$pdo->exec($sql);
}catch(PDOException $e){
echo $e->getMessage();
}
常用的數據庫操作:
exec 執行不要結果集的語句 比如 增刪改
query 執行要結果集的語句 比如查詢
異常設置:
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
返回自增id:
echo $pdo->lastInsertId();
事務
多條SQL語句同時執行,要麼全部成功,要麼全部失敗,並回滾到未執行的狀態。
舉例:
銀行轉賬
假如甲方給乙方轉賬500元,那麼一次成功的銀行轉賬是:
甲方的賬戶餘額減少500元,
且乙方賬號上增加500元
所以應該將這兩次轉賬視爲一個原子操作,即不能分開,而這就是一個事務。
與事務有關的函數:
$pdo->beginTransaction(); 開啓事務
$pdo->commit(); 提交事務
$pdo->rollback(); 回滾事務到初始狀態
注:事務的操作時在對數據庫的處理時進行操作的
例子:
<?php
//1.創建dsn
$dsn="mysql:host=localhost;dbname=demo;charset:utf8";
//2.開始連接
//4.用try..catch捕獲異常
try{
$pdo=new PDO($dsn,"root","");
//5.設置錯誤模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
exit($e->getMessage());
}
//張三
try{
//10.開啓事務
$pdo->beginTransaction();
//6.寫SQL語句
$sql="update user set money=money-500 where id=1 ";
//7.執行SQL語句
$res=$pdo->exec($sql);
//8.判斷SQL語句是否執行成功,不成功就拋出異常
if($res>0){
echo "張三轉賬500<br />";
}else{
throw new PDOException("張三轉賬失敗");
}
//李四
$sql="update user set money=money+500 where id=2";
$res=$pdo->exec($sql);
if($res>0){
echo "李四收賬500<br />";
}else{
throw new PDOException("李四收賬失敗");
}
//11提交事務
$pdo->commit();
echo "交易成功<br />";
}catch(PDOException $e){
//9.在catch中對異常進行打印
exit($e->getMessage());
//12事務回滾
$pdo->rollback();
}
//3.判斷連接是否成功
//var_dump($pdo);
?>
pdo數據庫操作優化
PDO預處理
預處理的原理:
我們以一個插入例子爲例:insert into myblog(name,password)values(?,?);
1.預處理:先將SQL模板語句發送到數據庫,至於後邊的值先置於?號
2.數據庫解析,編譯,對SQL語句模板執行查詢優化,並存儲結果不輸出。
3.執行:最後,將應用綁定的值傳遞給參數("?" 標記),數據庫執行語句。應用可以多次執行語句,如果參數的值不一樣。
好處:
如果單一插入,那麼每次插入都會進行編譯,插入操作,效率太慢,提高插入的效率
與pdo預處理有關的函數:
$pdo->prepare(); 預處理語句,返回一個PDOStatement對象(我們假定爲$stmt),兩種,一種用?一種用:+變量
$stmt->bindParam(); 參數綁定,有兩個參數,第一個是數字(如果上一個函數是?,那麼就用數字標識;如果是第二種,就直接使用就行了)
$stmt->execute(); 處理語句,參數可以包含一個數組,數組是prepare中的參數
當SQL語句爲查詢語句時,就要用到下面的函數了:
$stmt->fetch() 提取查詢信息,常和while結合,參數:
PDO::FETCH_BOTH(默認):返回一個索引爲結果集列名和以0開始的列號的數組
其他常用參數:
PDO::FETCH_ASSOC:返回一個索引爲結果集列名的數組
PDO::FETCH_NUM:返回一個索引爲以0開始的結果集列號的數組
例子:
<?php
$dsn="mysql:host=localhost;dbname=demo;charset:utf8";
try{
$pdo=new PDO($dsn,"root","");
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
exit("連接錯誤".$e->getMessage());
}
try{
/*$sql="update user set name='sun'where money=4000";
$res=$pdo->exec($sql);
if($res>0){
echo "插入成功";
}else{
echo "插入失敗";
}*/
//預處理
/*$stmt=$pdo->prepare("insert into user(name,password,money)values(:name,:password,:money)");*/
$stmt=$pdo->prepare("update user set money=? where id=?");
//開始綁定
/*$stmt->bindParam(':name',$name);
$stmt->bindParam(':password',$password);
$stmt->bindParam(':money',$money);
$name="tang";
$password="123";
$money=10000;
*/
$stmt->execute([7000,6]);
}catch(PDOException $e){
echo $e->getMessage();
}
?>