PHP基礎之PDO

簡介

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>

執行SQL語句

PDO中提供了query()和exec()方法用於執行SQL語句,query()方法主要是用於有記錄結果返回的操做,特別是SELECT操做,執行成功則返回一個PDOStatement類的對象,失敗則返回false。exec()則主要針對沒有結果集合返回的操做,如INSERT、UPDATE、DELETE等,它用於執行一條SQL語句而且返回執行後受影響的行數。

處理結果集

PDO中經常使用獲取結果集的方式有三種:fetch()、fetchColumn()、fetchAll()
  1. PDO中的fetch()方法能夠從結果集中獲取下一行數據
  2. PDO中的fetchColumn()方法用於獲取結果集中單獨一列
  3. 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()方法有個可選參數,表示一個元素個數與預處理語句佔位符數量同樣多的數組,用於爲預處理語句中的佔位符賦值。當佔位符爲問號佔位符時,須要給excute()方法傳遞一個索引數組參數,反之,當佔位符爲命名參數佔位符時傳入一個關聯數組參數

錯誤處理

PDO錯誤處理機制提供了三種方案,經過設置"PDO::ATTR_ERRMODE"的值來進行不一樣的處理。下面分別闡述:
  1. PDO錯誤處理默認模式
    "PDO::ERRMODE_SILENT"爲PDO默認的錯誤處理模式。在發生錯誤時不進行任何操做,只簡單設置錯誤代碼,能夠經過PDO提供的errorCode()和errorInfo()這兩個方法對語句和數據庫對象進行排查。
  2. PDO錯誤處理WARNING模式
    若是想要查看發生了什麼問題且不中斷應用程序的流程,能夠將PDO的錯誤模式設置爲"PDO::ERRMODE_WARNING",當錯誤發生時,除了設置錯誤代碼外,PDO還會發出一條E_WARNING信息。
  3. PDO錯誤處理EXCEPTION模式
    "PDO::ERRMODE_EXCEPTION"表示進行錯誤異常處理,能夠在PDO執行SQL語句錯誤時,使用try...catch捕捉到PDOException異常。代碼以下:
<?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();
}
相關文章
相關標籤/搜索