1、什麼是PDO?php
PHP DATA OBJECTmysql
PHP數據庫抽象層sql
位於PHP與數據庫中間的一個橋樑數據庫
2、爲何要使用PDO?數組
方便數據庫的遷移安全
方便數據庫的升級框架
減小學習成本學習
使程序更加安全fetch
防止sql注入spa
提升代碼效率
3、什麼時候採用PDO?
絕大多數操做數據庫的項目都使用PDO
4、PDO的安裝
1)類庫文件須要存在
php根目錄下的ext文件夾中:php_pdo.dll、php_pdo_mysql.dll
2)在php的配置文件php.ini中須開啓
extension=php_pdo.dll
extension=php_pdo_mysql.dll
5、如何使用PDO?
1)PDO核心類
①鏈接數據庫
new PDO($dsn,$username,$password)
$dsn:
1.直接寫入字符串(推薦)
$dsn="mysql:host=localhost;dbname=test;charset=utf8";
2.遠程加載文件(不推薦)
$dsn="uri:file:///d:/dsn.txt";
$dsn="uri:http://www.baidu.com/dsn.txt";
dsn.txt文件中的內容爲:
mysql:host=localhost;dbname=test;charset=utf8
3.設置php.ini(不推薦)
在php的配置文件php.ini中找到:[PDO],若沒有找到則在文件最後手動添加:
[PDO]
pdo.dsn.mydsn="mysql:host=localhost;dbname=test;charset=utf8";
在代碼中引入:
$dsn="mydsn";
②判斷錯誤
使用PDOException異常處理
③設置字符集
$pdo->query("set names utf8");
④錯誤模式設置
1.手動拋出錯誤異常,放在sql語句執行以後
PDO::errorCode()
PDO::errorInfo()
2.設置自動拋出錯誤異常,放在sql語句執行以前
PDO::setAttribute()
靜默模式(默認)
PDO::ATTR_ERRMODE=>PDO::ERRMODE_SILENT
警告模式
PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING
異常處理模式(推薦)
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
⑤執行sql語句
1.exec()
執行增、刪、改語句,成功返回受影響行數,失敗返回false
2.query()
執行查詢語句,成功返回PDO預處理對象(可做二維數組處理,直接用foreach遍歷)
3.lastInsertId()
返回最近一次插入行的ID或序列值
⑥關閉數據庫鏈接
$pdo=null; 或 unset($pdo);
2)PDO預處理類
1.什麼是預處理?
就是將sql語句的語法提早解析
2.爲何要使用預處理?
效率提升,語法只解析一次
有效防止sql注入
3.什麼時候採用預處理?
框架當中基本全是預處理
4.如何使用預處理?
①準備參數,依次爲預處理對象中佔位符對應的字段
②建立預處理對象
$stmt=$pdo->prepare(" ");
③綁定參數,標識符從1開始,有幾個參數就依次綁定幾回
方式一:
$stmt->bindParam(1,$i);
$stmt->bindParam(2,$j);
方式二:
$stmt->bindValue(1,$i);
$stmt->bindValue(2,$j);
方式三:
可使用數組對應各佔位符的值,在下一步執行對象時將該數組傳入
$arr=array('第一個佔位符對應的值','第二個佔位符對應的值',...);
$arr=array('字段名1'=>'以字段名1爲佔位符對應的值','字段名2'=>'以字段名2爲佔位符對應的值',...);
④執行對象
$stmt->execute();
//$stmt->execute($arr);
⑤佔位符
?
在綁定參數時須指定各佔位符對應位置,從1開始
:字段名稱
在綁定參數時須指定各對應的字段名稱
⑥查詢處理
$stmt->execute()執行完畢後,解析結果:
1.$stmt->fetch(PDO::FETCH_ASSOC)
解析一條,須要循環解析
while($stmt->fetch(PDO::FETCH_ASSOC){
}
2.$stmt->fetchAll(PDO::FETCH_ASSOC)
解析全部結果,將結果返回到一個二維數組中
3.$stmt->rowCount()不只能夠獲取增、刪、改的受影響行數,也可獲取查詢的記錄行數
3)PDO的異常處理類
PDOException
PDOException::getCode() 異常號
PDOException::getMessage() 異常信息
4)事務處理
1.什麼是事務處理
把一整件事情做爲一個總體,做爲一個事務
2.爲何要使用事務處理
程序的安全性、完整性
3.何時使用事務處理
重要數據
4.如何使用事務處理
①開啓事務
PDO::beginTransaction()
②執行sql語句
PDO::exec()
③執行事務或回滾事務
PDO::commit()
PDO::rollBack()
try{ //鏈接數據庫 $dsn="mysql:host=localhost;dbname=test;charset=utf8"; $username="autumn"; $password="ZWQ900815"; $pdo=new PDO($dsn,$username,$password); //設置字符集 $pdo->query("set names utf8"); //錯誤模式設置 //方式一:手動拋出錯誤異常,放在sql語句執行以後 /* $errorInfo=$pdo->errorInfo(); //發生錯誤時,$errorInfo[1]爲錯誤號和$errorInfo[2]爲錯誤信息 //無錯誤時,$errorInfo[1]和$errorInfo[2]均爲空 if(!empty($errorInfo[1])){ //拋出錯誤異常 throw new PDOException($errorInfo[2],$errorInfo[1]); } */ //方式二:自動拋出錯誤異常,放在sql語句執行以前 //設置PDO::ATTR_ERRMODE(靜默模式[默認]、警告模式、異常處理模式[推薦]) $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //準備sql語句 //$sql01="insert into cms_user(username,password) values('admin02','1234')"; //$sql02="delete from cms_user where id=2"; //$sql03="update cms_user set username='admin' where id=1"; //$sql04="select1 * from cms_user"; //執行sql語句 //exec 處理增、刪、改語句,返回受影響行數 //query 處理查詢語句 //$pdo->exec($sql01); //返回最近一次插入行的ID或序列值 //echo $pdo->lastInsertId(); //$pdo->exec($sql02); //$pdo->exec($sql03); /* $data=$pdo->query($sql04); foreach ($data as $key=>$val) { echo $val['id']."\n"; echo $val['username']."\n"; echo $val['password']."\n"; } */ //預處理 //方式一 /* //1.準備參數,依次爲下面要處理的sql語句中?佔位符對應的字段值 $id=1; $username='autumn'; //2.建立預處理對象 $stmt=$pdo->prepare("delete from cms_user where id=? and username=?"); //3.綁定參數,$id、$username爲引用傳參,參數賦值可在前可在後 //綁定參數標識符從1開始,有幾個參數變量,就依次綁定幾回 $stmt->bindParam(1,$id); $stmt->bindParam(2,$username); //綁定值,變量值的賦值只能在前,不能在後,做用等同於bindParam() //$stmt->bindValue(1,$id); //$stmt->bindValue(2,$username); //4.執行對象 $stmt->execute(); */ //方式二 /* $id=1; $username='autumn'; $stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username"); $stmt->bindParam(":id",$id); $stmt->bindParam(":username",$username); $stmt->execute(); */ //方式三(推薦) //若使用「?」做爲佔位符 //$stmt=$pdo->prepare("delete from cms_user where id=? and username=?"); //$arr=array(1,'autumn'); //若使用「:字段名稱」做爲佔位符 /* $stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username"); $arr=array("id"=>1,"username"=>"autumn"); $stmt->execute($arr); echo $stmt->rowCount(); //受影響行數 */ $stmt=$pdo->prepare("select * from cms_user where id>:id"); $arr=array("id"=>3); $stmt->execute($arr); $data=$stmt->fetchAll(PDO::FETCH_ASSOC); echo $stmt->rowCount(); //也可獲取查詢的記錄行數 echo "<pre>"; var_dump($data); echo "</pre>"; //執行事務處理 /* //1.開啓事務 $pdo->beginTransaction(); //2.執行sql語句 $aff01=$pdo->exec("update cms_user set username='admin01' where id=1"); //sql語句自己有錯誤而沒法執行時會自動拋出錯誤異常,而當sql語句可執行後受影響行數爲0時,須要手動拋出異常 if($aff01==0){ throw new PDOException("受影響行數爲0!"); } $aff02=$pdo->exec("insert into cms_user(username,password) values('admin02','0000')"); if($aff02==0){ throw new PDOException("受影響行數爲0!"); } //3.執行事務 $pdo->commit(); */ //關閉數據庫鏈接 $pdo=null; }catch(PDOException $e){ //4.回滾事務 //$pdo->rollBack(); //異常處理 //$e->getCode();//異常號 //$e->getMessage();//異常信息 echo "(".$e->getCode().")".$e->getMessage(); }