PHP學習模塊之pdo模塊

pdo是什麼?

pdo是一個擴展庫,給不同的數據庫提供相同的接口,這樣的話在因業務需求更換數據庫時就不用重寫代碼了,只需要換不同的驅動就行了。

 

需要兩個條件:

  1. 支不支持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();
}

?>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章