1、PDO(PHP Data Object)擴展為PHP定義了一個訪問數據庫的輕量、持久的接口。實現PDO接口的每一種數據庫驅動都能以正則擴展的形式把各自的特色表現出來。
主要:PDO擴展只是一個抽象的接口層,利用PDO擴展本身並不能實現任何數據庫操作,必須使用一個特定的數據庫PDO驅動訪問數據庫
2、啟動PDO方法:找到php.ini文件將
復制代碼 代碼如下:
;extension=php_pdo.dll
前的分號去掉即可(linux環境下類似)
3、PDO預定義類:
PDO包含了三個預定義類:PDO、PDOStatement、PDOException
(1)PDO類:代表一個PHP和數據庫之間的連接
PDO:構造器,創建一個新的PDO對象
beginTransaction:開始事務
commit:提交事務
errorCode:從數據庫返回一個錯誤代號,如果有的話
errorInfo:從數據庫返回一個含有錯誤信息的數組,如果有的話
exec:執行一條SQL語句並返回影響的行數
getAttribute:返回一個數據庫的連接屬性
lastInsertId:返回最新插入到數據庫的行(ID)
prepare:為執行准備一條SQL語句,返回語句執行後的聯合結果集
query:執行一條SQL語句並返回結果集
rollBack:回滾一個事務
setAttribute:設置一個數據庫連接屬性
(2)PDOStatement類:代表一條預處理語句以及語句執行後的聯合結果集
bindColomn:綁定一個PHP變量到結果集輸出列
bindParam:綁定一個變量到PHP預處理語句中的參數
bindValue:綁定一個值到處理語句中的參數
closeCursor:關閉游標,使語句可以再次執行
cloumnCount:返回結果集中列的數量
errorCode:從語句中返回一個錯誤代號,如果有的話
errorInfo:從語句中返回包含錯誤信息的數組
execute:執行一條預處理語句
fetch:從結果集中取出一行
fetchAll:從結果集中取出一個包含所有行的數組
fetchColomn:返回結果集中某一列的數據
getAttribute:返回一個PDOStatement屬性
getColomnMeta:返回結果集中某一列的結構
nextRowset:返回下一個結果集
rowCount:返回SQL語句執行後影響的行數
setAttribute:設置一個PDOStatement屬性
setFetchMode:為PDOStatement設定獲取數據
給一個事務處理的簡單例子:
復制代碼 代碼如下:
<?php
/*
事務處理
MYSQL 表引擎 MyISAM InnoDB
添加字段 alter table user add money int not null default 0;
查看表引擎 show create table user
修改表引擎 alter table user engine=InnoDB
*/
try{
//實例化PDO
$pdo=new PDO("mysql:host=localhost;dbname=photo","root","123456"。array('3'=>'2'));
}catch(PDOException $e){
echo $e->getMessage();
}
//設置字符集
$sql="set name utf8";
$pdo->exec($sql);
//開啟事務處理
$pdo->beginTransaction();
$num=250;
$sql="update user set money=money-{$num} where id =1";
$rows=$pdo->exec($sql);
$sql="update user set monet=money-{$num} where id=2";
$rows+=$pdo->exec($sql);
//結束事務處理
if($rows==2){
$pdo->commit();
}else{
$pdo->rollBack();
}
?>
(事務的主要特性:原子性、一致性、獨立性和持久性)
4、PDO最大的特點是引入了參數綁定和預編譯
預編譯負責兩件事,轉移和軟解析提速。程序要支持預編譯,除了數據庫支持外,還需要驅動支持(PDO和NySQLi支持)
5、PDO的效率問題
(1)在一個大表大數據量中進行測試,PDO的CRUD效率比MySql直連低5%~15%,並且方差大於MySQL直連
(2)至於負載方面,PDO開啟長連接後負載高於MySQL且比較穩定。
其實在實際應用中,90%的程序是不會進行數據庫遷移的,有數據庫遷移的應用程序少之又少。