PDO是什么呢?
通俗說就是別人寫的一個“數據庫操作工具類”,它非常強大,可以應對市面上幾乎所有主流數據庫,
具體應用時候有這樣一個關系:

即,要操作某種數據,就得去“打開”對應的pdo引擎。
在php.ini的配置文件中,無非就是一個“模塊”而已,我們只需要把分號刪掉就表示開啟!如下:

改為:

使用pdo連接mysql數據庫
- $dsn = "mysql:host=服務器地址/名稱;port=端口號;dbname=數據庫名";
- $opt = array(PDO::MYSQL_ATTR_INIT_COMMAND=>’set names 連接編碼’);
- $pdo = new pdo($dsn, "用戶名", "密碼", $opt);

可見,返回的是一個pdo對象,
pdo對象的使用(常見方法)
$result = $pdo->query(“返回結果集的sql語句”);
結果:
成功:就是一個pdo結果集對象(見后續);
失敗:false;
$result = $pdo->exec(“增刪改的sql語句”);
結果: true(表示成功),false(表示失敗);
$pdo = null; //銷毀該對象;
其他操作
- $pdo->lastInsertId();
獲取最后添加的id值
- $pdo->beginTransaction();:
開啟一個事務
- $pdo->commit()
提交一個事務
- $pdo->rollBack();
回滾一個事務;
- $pdo->inTransaction();
判斷當前行是否在事務中,返回true/false
- $pdo->setAttribute(屬性名,屬性值);
設置pdo對象的屬性值;
舉例:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
pdo的錯誤處理
-
靜默模式
默認情況下,pdo采用“靜默模式”處理錯誤:
就是發生了錯誤后,並不提示,而只是返回false。我們需要在程序中去判斷返回是否為fale,然后,如果是false,再去“主動”獲取錯誤信息。——跟mysql一樣!
對比mysql:
$sql = “updateeeee tab set name = ‘abc'; ”;
$result = mysql_query($sql); //這里,執行該sql語句,肯定出錯
if( $result === false){
echo “發生錯誤:” . mysql_error();
}
else{......}
則對pdo來說,大致如此:
$sql = “updateeeee tab set name = ‘abc’ ; ”;
$result = $pdo->exec ($sql); //這里,執行該sql語句,肯定出錯
if( $result === false){
echo “發生錯誤:” . $pdo->errorInfo(); //這里只是示意;
//實際情況是:$pdo->errorInfo()返回的是一個“數組”,其中的下標為3的項,才是錯誤提示內容
}
else{......}
-
異常模式
可以簡單理解為:適應面向對象語法的處理錯誤的一種語法結構。如下所示:
try{
在這里,可以執行“可能出錯”的語句(多條也可以);
一旦發生錯誤,就會終止當前范圍的后續程序執行,
而立即跳轉到catch部分——處理錯誤!
}
catch( Exception $e ){
//一旦發生錯誤,就會進入這里,此時,並會生成一個“錯誤對象”;
//該錯誤對象,就是系統類Exception的一個實例:它包含了錯誤信息。
}
pdo要使用異常模式,就得專門設置(因為其默認是靜默模式):
pdo的結果集對象(PDOStatement)
pdo的結果集對象從哪里來?
來自pdo對象執行“返回數據集的sql語句”並成功的時候,得到的就是pdo的結果集對象。
$stmt = $pdo->query(“select ..... “); //如果執行成功,則$stmt就是pdo的結果集對象
pdo結果集對象的常用方法
- $stmt = $pdo->query(“select ...... ”);//這是獲得結果集
- $stmt->rowCount() ; //得到結果集的行數
- $stmt->columnCount() ; //得到結果集的列數
- $stmt->fetch( [返回類型] ); //從結果集中取出“一行”數據;
取出的結果,由其中的“返回類型”來決定,常用的有:
PDO::FETCH_ASSOC:表示關聯數組
PDO::FETCH_NUM:表示索引數組
PDO::FETCH_BOTH:表示前二者皆有,這是默認值
PDO::FETCH_OBJ:表示對象
- $stmt->fetchAll([返回類型]);一次性獲取結果集中的所有數據,返回的是一個二維數組
- $stmt->fetchColumn( [$i] );獲取結果集中的“下一行”數據的第$i個字段的值,結果是一個“標量數據”
- $stmt->fetchObject();
- $stmt->errorCode();:pdo結果集的錯誤代號
- $stmt->errorInfo(); pdo結果集的錯誤信息(是一個數組)
- $stmt->closeCursor(); 關閉結果集(相當於mysql_close() )
pdo中的預處理語法
什么叫預處理語法
就是,為了“重復執行”多條結構類似的sql語句,而將該sql語句的形式“進行預先處理”(編譯);
該sql語句的“形式”中,含有“未給定的數據項”。
然后,到正式執行的時候,只要給定相應的形式上的“數據項”,就可以更快速方便執行。
比如(有兩種預定義語法):
語法1:
$sql = “select * from tab where id = ? “; //這里這個“?”就是未給定的數據項;這里通常叫做“占位符”
//也可以是多個問好。
語法2:
$sql = “select * from tab where id = :v1 and name = :v2 “; //這里這個“:v1”和 “:v2” 就是未給定的數據項;通常這里叫做“命名參數”;
怎么使用?
分3步:
1,對含預處理語法的sql語句進行“預處理”:
$stmt = $pdo->prepare( $sql ); //
2, 對上述預處理的結果對象($stmt)的未賦值數據,進行賦值:
$stmt->bindValue( 數據項1, 值1);
$stmt->bindValue( 數據項2, 值2);
。。。。。。
3, 執行;
$stmt->execute();
這樣之后,該sql語句就算正式完成!
