PDO的安全處理與事物處理方法
事務(wù) (Transaction) 是操作數(shù)據(jù)庫中很重要的一個功能, 它可以讓你預(yù)定一條, 或者一系列 SQL 語句, 然后一起執(zhí)行,并且在執(zhí)行的過程中, 如果其中的某條執(zhí)行失敗, 可以回滾所有已更改的操作. 如果執(zhí)行成功, 那么這一系列操作都會永久有效. 事務(wù)很好的解決了在操作數(shù)據(jù)庫的時候不同步的問題. 同時, 通過事務(wù)去執(zhí)行大數(shù)據(jù)量的時候, 執(zhí)行效率可以提高很多很多.
事務(wù)處理具有四個特性:原子性、一致性、獨(dú)立性、持久性。并不是所有的數(shù)據(jù)庫都支持事務(wù)處理的,PDO 為能夠執(zhí)行事務(wù)處理的數(shù)據(jù)庫提供事務(wù)支持。
一.PDO異常處理
PDO::ATTR_ERRMODE
1) PDO::ATTR_ERRMODE//不報(bào)錯誤(忽略)(0)
2) PDO::ERRMODE_WARNING
//以警告的方式報(bào)錯(1)
3) PDO::ERRMODE_EXCEPTION //以異常的方式報(bào)錯(2)
<?php
//默認(rèn)是PDO::ATTR_ERRMODE 不報(bào)錯誤(忽略)(0),需要用errorCode()、errorInfo()
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp","root","");
// $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch (PDOException $e){
die("fail to connect db".$e->getMessage());
}
$sql="INSERT INTO user VALUES(null,'dabao','26')";
try{
$res=$pdo->exec($sql);
}catch (PDOException $e){
echo $e->getMessage();
}
//$res=$pdo->exec($sql);
//if($res){
// echo 'OK';
//}else{
// echo $pdo->errorCode();
// echo '<br/>';
// print_r($pdo->errorInfo());
//}
二.PDO預(yù)處理方法
1) prepare() //用于執(zhí)行查詢SQL語句,返回PDOStatement對象
2) bindValue() //將值綁定到對應(yīng)的一個參數(shù),返回布爾值
3) bindParam() //將參數(shù)綁定到相應(yīng)的查詢占位符上,返回布爾值
4) bindColumn() //用來匹配列名和一個指定的變量名
5) execute() // 執(zhí)行一個準(zhǔn)備好了的預(yù)處理語句,返回布爾值
6) rowCount() // 返回使用增、刪、改、查操作語句后受影響的行總數(shù)
<?php
/**
* ?號式的預(yù)處理語句,共有三種綁定方式
*/
//1.連接數(shù)據(jù)庫
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp","root","");
}catch (PDOException $e){
die("fail to connect db".$e->getMessage());
}
//2.預(yù)處理的SQL語句
$sql="INSERT INTO users(id,name,age) VALUES(?,?,?)";
$stmt=$pdo->prepare($sql);
//3.對?號的參數(shù)進(jìn)行綁定
$id=null;
$name="test103";
$age=103;
//第一種綁定方式
//$stmt->bindValue(1,$id);
//$stmt->bindValue(2,$name);
//$stmt->bindValue(3,$age);
//第二種綁定方式
//$stmt->bindParam(1,$id);
//$stmt->bindParam(2,$name);
//$stmt->bindParam(3,$age);
//4.執(zhí)行
//$stmt->execute();
//第三種綁定方式:直接執(zhí)行數(shù)組
$stmt->execute(array($id,$name,$age));
echo $stmt->rowCount();
<?php
/**
* 別名式的預(yù)處理語句,共有三種綁定方式
*/
//1.連接數(shù)據(jù)庫
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp","root","");
}catch (PDOException $e){
die("fail to connect db".$e->getMessage());
}
//2.預(yù)處理的SQL語句
$sql="INSERT INTO users(id,name,age) VALUES(:id,:name,:age)";
$stmt=$pdo->prepare($sql);
//3.參數(shù)進(jìn)行綁定
$id=null;
$name="test203";
$age=23;
//第一種綁定方式
//$stmt->bindValue("id",$id);
//$stmt->bindValue("name",$name);
//$stmt->bindValue("age",$age);
//第二種綁定方式
//$stmt->bindParam("id",$id);
//$stmt->bindParam("name",$name);
//$stmt->bindParam("age",$age);
//4.執(zhí)行
//$stmt->execute();
//第三種綁定方式:直接執(zhí)行數(shù)組
$stmt->execute(array("id"=>$id,"name"=>$name,"age"=>$age));
echo $stmt->rowCount();
<?php
/**
* 用預(yù)處理方式查詢數(shù)據(jù)
*/
//1.連接數(shù)據(jù)庫
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp","root","");
}catch (PDOException $e){
die("fail to connect mysql".$e->getMessage());
}
//2.預(yù)處理查詢
$sql="SELECT id,name,age FROM users";
$stmt=$pdo->prepare($sql);
//3.執(zhí)行
$stmt->execute();
foreach($stmt as $val){
echo $val['id']."------".$val['name']."------".$val['age']."<br/>";
}
三.事務(wù)處理操作方法介紹
1) beginTransaction() //開啟一個事物(做一個回滾點(diǎn))
2) commit()
//提交事務(wù)
3) rollBack() //事務(wù)回滾操作
<?php
//1.連接數(shù)據(jù)庫
try{
$pdo=new PDO("mysql:host=localhost;dbname=myapp","root","");
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch (PDOException $e){
die("fail to connect db".$e->getMessage());
}
//2.執(zhí)行數(shù)據(jù)操作
try{
//開啟事物
$pdo->beginTransaction();
$sql="insert into users(id,name,age) VALUES(?,?,?)";
$stmt=$pdo->prepare($sql);
//傳入?yún)?shù)
$stmt->execute(array(null,"test1","21"));
$stmt->execute(array(null,"test2","22"));
$stmt->execute(array(null,"test3","23"));
//提交事物
$pdo->commit();
}catch (PDOException $e){
die("fail to execute".$e->getMessage());
//事物回滾
$pdo->roolback();
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
PHP轉(zhuǎn)換文件夾下所有文件編碼的實(shí)現(xiàn)代碼
本篇文章是對PHP轉(zhuǎn)換文件夾下所有文件編碼的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php5.3/5.4/5.5/5.6/7常見新增特性匯總整理
這篇文章主要介紹了php5.3/5.4/5.5/5.6/7常見新增特性,整理總結(jié)了php5.3/5.4/5.5/5.6/7各種常見的新增特性,包括各種語法、關(guān)鍵字、函數(shù)、擴(kuò)展等,需要的朋友可以參考下2020-02-02
PHP使用緩存即時輸出內(nèi)容(output buffering)的方法
這篇文章主要介紹了PHP使用緩存即時輸出內(nèi)容(output buffering)的方法,實(shí)例分析了php緩存輸出的相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08
php實(shí)現(xiàn)算術(shù)驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)算術(shù)驗(yàn)證碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12

