PDO(PHP Data Object)是指PHP數據對象,它定義了一個輕量級的一致接口來統一操做各類數據庫。PDO提供了一個數據訪問抽象層,這意味着,無論使用哪一種數據庫,均可以用相同的函數(方法)來查詢和獲取數據。當選擇不一樣的數據庫時,只須要修改PDO的DSN(數據源)便可,有效的解決了早期PHP版本中各個數據庫擴展互不兼容,維護性差,可移植性差的缺點。注意:從 PHP 5.1開始附帶了PDO,在 PHP 5.0 中是做爲一個 PECL 擴展使用。 PDO 須要PHP 5 核心的新 OO 特性,所以不能在較早版本的 PHP 上運行。
建立測試數據表而且插入測試數據php
CREATE TABLE `book` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL COMMENT '書名', `author` varchar(15) DEFAULT NULL COMMENT '做者', `ptime` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`), KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; INSET INTO book VALUES(1,'php','leo',now()),(2,'mysql','lisi',now()),(3,'linux','ben',now()),(4,'apache','lily',now());
鏈接數據庫、執行SQL語句、處理結果集而且展現到模板html
<?php header('Content-type:text/html;charset=utf-8'); //保存數據源基本信息 $arr = array( 'dbms' =>'mysql', 'host' =>'localhost', 'port' =>3306, 'dbname' =>'mytest', 'charset' =>'utf8', 'user' =>'root', 'pwd'=>123456 ); $dsn = "$arr[dbms]:host=$arr[host];port=$arr[port];dbname=$arr[dbname];charset=$arr[charset]";//php版本需大於5.3.6才能使用charset屬性設置字符集 try{ //鏈接數據庫、選擇數據庫 $pdo = new PDO($dsn,$arr['user'],$arr['pwd']); //執行sql語句 $sql ='SELECT * FROM book'; $result = $pdo->query($sql); //定義空數組保存數據 $info = array(); //遍歷結果集獲取數據詳細信息 while ($row = $result->fetch()){ $info[] = $row; } }catch (PDOException $e){ //輸出異常信息 echo $e->getMessage().'<br>'; } ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h2>書籍信息列表</h2> <table border="1" > <tr> <td>圖書名稱</td> <td>圖書做者</td> <td>出版日期</td> </tr> <?php foreach ($info as $v):?> <tr> <td><?php echo $v['name'];?></td> <td><?php echo $v['author'];?></td> <td><?php echo $v['ptime'];?></td> </tr> <?php endforeach;?> </table> </body> </html>
PDO中提供了query()和exec()方法用於執行SQL語句,query()方法主要是用於有記錄結果返回的操做,特別是SELECT操做,執行成功則返回一個PDOStatement類的對象,失敗則返回false。exec()則主要針對沒有結果集合返回的操做,如INSERT、UPDATE、DELETE等,它用於執行一條SQL語句而且返回執行後受影響的行數。
PDO中經常使用獲取結果集的方式有三種:fetch()、fetchColumn()、fetchAll()
PDO中的fetchAll()方法用於返回一個包含結果集中全部行的數組
具體的語法參數就不一一贅述了,可參看PHP手冊。mysql
PDO中的預處理語句機制可簡單理解爲SQL的一種編譯過的模板,在執行時,只需在服務器和客戶端之間傳輸有變化的數據便可,能夠避免重複分析與編譯,因爲預處理語句實現了將SQL和數據的分離,所以能夠防止SQL注入。如下代碼演示預處理語句的使用
<?php header("Content-type:text/html;charset=utf-8"); try{ //鏈接數據庫 $pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456'); //預處理sql語句 $stmt = $pdo->prepare("insert into `book`(`name`,`author`)VALUES (?,?)"); //print_r($stmt);exit(); //爲佔位符綁定變量 $stmt->bindParam(1,$name); $stmt->bindParam(2,$author); // 第二種佔位符使用方式 // $stmt = $pdo->prepare("insert into `book`(`name`,`author`)VALUES (:name,:author)"); // $stmt->bindParam(':name',$name); // $stmt->bindParam(':author',$author); //準備數據 $data = array( array('php第一本教材','人民郵電出版社'), array('php第二本教材','人民郵電出版社'), array('php第三本教材','人民郵電出版社'), array('php第四本教材','人民郵電出版社'), array('php第五本教材','人民郵電出版社') ); foreach ($data as $row){ //爲綁定的變量賦值 $name = $row[0]; $author = $row[1]; //執行預處理語句 $stmt->execute(); } }catch (PDOException $e){ echo $e->getMessage().'<br>'; }
能夠在SQL語句中添加佔位符,當屢次執行SQL語句時,只須要編譯一次SQL語句,可使用相同或不一樣的參數執行屢次,能夠節省資源。PDO支持兩種佔位符:問號佔位符(?)和命名參數佔位符(:參數名稱),使用時需注意,同一條SQL語句只能選擇一種佔位符使用。
準備好預處理語句後可使用bindParam()方法爲佔位符綁定變量參數,方法的第一個參數表示參數標識符,第二個參數用於表示參數標識符對應的變量名。
excute()方法有個可選參數,表示一個元素個數與預處理語句佔位符數量同樣多的數組,用於爲預處理語句中的佔位符賦值。當佔位符爲問號佔位符時,須要給excute()方法傳遞一個索引數組參數,反之,當佔位符爲命名參數佔位符時傳入一個關聯數組參數
PDO錯誤處理機制提供了三種方案,經過設置"PDO::ATTR_ERRMODE"的值來進行不一樣的處理。下面分別闡述:
<?php header("Content-type:text/html;charset=utf-8"); try{ //1.鏈接數據庫 $pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456'); //2.設置錯誤處理 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT); //3.預處理SQL語句 $stmt = $pdo->prepare('select * from books'); //4.執行預處理語句 $stmt->execute(); echo"well-done!"; //5.獲取錯誤碼 $code = $stmt->errorCode(); //6.判斷執行錯誤 if (!empty($code)){ echo"<br>$code<br>"; print_r($stmt->errorInfo()); } }catch (PDOException $e){ echo $e->getMessage().'<br>'; }
PDO提供了事務處理機制,對於MySQL數據庫來講支持事務的數據引擎有InnoDB和BDB兩種。有三個PDO方法能夠完成事務任務:beginTransaction()、commit()和rollBack()。測試代碼以下:
<?php header("Content-type:text/html;charset=utf-8"); //1.鏈接數據庫 $pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456'); $pdo->exec('set names utf8'); //2.設置錯誤處理 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //3.開啓事務 $pdo->beginTransaction(); try{ //一次操做 $sql = "delete from book where id=3"; $stmt = $pdo->prepare($sql); $stmt->execute(); //一次操做 $sql = "delete from book where id=4"; $stmt = $pdo->prepare($sql); $stmt->execute(); //一次操做 $sql = "delete from book where id=5"; $stmt = $pdo->prepare($sql); $stmt->execute(); //提交 $pdo->commit(); }catch (PDOException $e){ echo $e->getMessage().'<br>'; //回滾 $pdo->rollBack(); }