使用 PHP 的 PDO 類操做 MySQL

一,基本操做

1,鏈接數據庫

$mysql = new PDO('mysql:host=localhost;sort=3306;dbname=foo;',$user,$psd);  
複製代碼

值得一提的是,若是鏈接數據庫失敗,會拋出一個 PDOException 異常,這樣咱們就能夠直接用 try{}catch{} 來處理異常,不只如此,還能夠經過 PDO::setAttribute() 方法讓 PDO 每遇到一個錯誤時就拋出異常,這樣就能使用一種統一的方式處理數據庫問題php

try{  
    $mysql = new PDO('mysql:host=localhost;sort=3306;dbname=foo;',$user,$psd);  
    $mysql->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);  
}catch(Exception $e){  
    //some code 
}  
複製代碼

2,查詢數據

//得到結果集 
$res = $mysql->query("SELECT * FROM foo");  
//從結果集中取出一組做爲數組返回,該數組爲一個關聯數組和一個非關聯數組的並集 
$res->fetch();  
//從結果集中取出全部數據做爲二維數組返回,該數組爲一個關聯數組和一個非關聯數組的並集 
$res->fetchAll();  
複製代碼

(1)向 fetch() 、fetchAll() 語句中傳入參數改變返回的結果

//同時包含數字鍵和字符串鍵的數組,這是默認格式 
$res->fetch(PDO::FETCH_BOTH);  
//有數字鍵的數組 
$row = $res->fetch(PDO::FETCH_NUM); 
//有字符串鍵(列名)的數組 
$row =$res->fetch(PDO::FETCH_ASSOC);  
//stdClass類的對象,列名做爲屬性名 
$row = $res->fetch(PDO::FETCH_OBJ);  
//PDORow類的對象,列名做爲屬性名。屬性在訪問前不會填充 
$row = $res->fetch(PDO::FETCH_LAZY);  
複製代碼

(2)返回指定列的結果

向 PDO::fetchAll() 方法傳入 PDO::FETCH_COLUMN 和第二個參數(指定列數,從0開始)mysql

$row = $res->fetchAll(FETCH_COLUMN,2);  //返回結果中的第3列 
複製代碼

(3)綁定結果列

若是你想把查詢的結果直接賦值給某個變量,能夠採用如下方法sql

//向PDO::query()傳入第二個參數:PDO::FETCH_BOUND 
$res = $mysql->query(SELECT name,age FROM user);  
//使用bindColumn()方法將字段值綁定到變量 
//bindColumn()的第一個參數可使用列名,也可使用列號,列號從1開始 
$res->bindColumn('user',$user);  
$res->bindColumn('age',$age);  
//如今每次fetch(),$user和$age都會被賦新值 
while($res->fetch()){  
    echo "name:$name | age:$age <br/>";  
}  
複製代碼

(4)將結果行填充到特殊的對象中

//首先須要定義一個擴展 PDOStatement 的類 
class Foo extends PDOstatement {  
    //這裏咱們簡單的寫一個計算平均數的方法 
    public function avg(){  
        //能夠經過 get_object_vars($this) 來獲取當前對象屬性組成的關聯數組 
        $vars = get_object_vars($this);  
        //刪除 PDOStatement 的內置 queryString 變量 
        unset($vars['queryString']);  
        $sum = 0;  
        foreach($vars as $grade){  
            $sum += $grade;  
        }  
        return $sum / count($vars);  
    }  
}  
  
$obj = new Foo();  
$results = $mysql->query("SELECT english,math,computer FROM student_grade",PDO::FETCH_INTO,$obj);  
  
  
//每次調用 fetch() 時,都會從新將結果做爲屬性到填充 $obj 
$i = 1;  
while($results->fetch()){  
    echo "第{$i}位學生的成績爲:<br/> 英語:{$obj->english},數學:{$obj->math},計算機:{$obj->computer}<br/> 平均分:{$obj->avg()}<br/><br/>"; 
    $i++;
}  
複製代碼

3,修改數據

使用 PDO::exec() 方法數據庫

$inser_res = $mysql->exec("INSERT INTO user(name,age) VALUE ('foo',13)");  
$update_res = $mysql->exec("UPDATE user SET age=18 WHERE name='foo'");  
$delete_res = $mysql->exec("DELETE FROM user WHERE age=18");  
複製代碼

在使用 PDO::exec() 執行 INSERT,UPDATE,DELETE 語句時,該方法會返回受影響的行數後端

二,騷操做(其實就是預處理)

綁定參數的兩大有點是安全和速度。利用綁定參數,不用再擔憂 SQL 注入攻擊, PDO 會適當的對各個參數加引號和進行轉義,使特殊字符中性化。另外,執行 prepare() 時,不少數據庫後端會完成查詢的一些解析和優化,使得每一個 execute() 調用要比你自行創建一個查詢字符串來調用 exec() 或 query() 更快。數組

1,使用預處理進行查詢(SELECT)

//準備預處理語句 
$st = $mysql->prepare("SELECT * FROM user WHERE age>? AND weight<?");  
//第一次綁定參數並執行 
$st->execute([18,100]);  
$res1 = $st->fetchAll();  
//第二次綁定參數並執行 
$st->execute([16,150]);  
$res2 = $st->fetchAll();   
複製代碼

1.1,使用命名佔位符

//準備預處理語句 
$st = $mysql->prepare("SELECT * FROM user WHERE age>:age AND weight<:weight");  
//第一次綁定參數並取出結果 
$st->execute(['age'=>18,'weight'=>100]);  
$res1 = $st->fetchAll();  
//第二次綁定參數並取出結果 
$st->execute(['age'=>16,'weight'=>150]);  
$res2 = $st->fetchAll();   
複製代碼

1.2,綁定佔位符

//準備預處理語句 
$st = $mysql->prepare("SELECT * FROM user WHERE age>:age AND weight<:weight");  
//將佔位符與與某個變量自動關聯,這裏假設有 $age 和 $weight 兩個已經被賦值的變量 
$st->bindParam(':age',$age);  
$st->bindParam(':weight',$weight);  
//執行綁定參數並取出結果 
$st->execute();  
$st->fetchAll();  
//對變量從新賦值後,繼續綁定參數並取出結果 
$age = 15;  
$weight = 100;  
$st->execute();  
$st->fetchAll();  
複製代碼

上面的例子中咱們用了一個很笨拙的方法去改變 $age 和 $weight 的值,更聰明的方法是經過循環或者函數來改變變量的值,實現上視具體需求而變。安全

2,使用預處理對數據庫進行修改(INSERT,UPDATE,DELETE)

下面的例子都是使用?佔位符,使用命名佔位符的用法等同於 SELECT函數

2.1,INSERT

//準備預處理語句 
$st = $mysql->prepare('INSERT INTO user VALUE(?,?,?)');  
//參數綁定並執行 
$st->execute(['jone',18,100]);  
$st->execute(['mike',19,120]);  
複製代碼

2.2,UPDATE

//準備預處理語句 
$st = $mysql->prepare('UPDATE user SET age=? WHERE weight=?');  
//參數綁定並執行 
$st->execute([20,100]);  
$st->execute([25,120]);  
複製代碼

2.3,DELETE

//準備預處理語句 
$st = $mysql->prepare('UPDATE FROM user WHERE age=?');  
//參數綁定並執行 
$st->execute([20]);  
$st->execute([25]);  
複製代碼

3,查看查詢返回的行數

3.1,普通操做的修改行數(INSERT,UPDATE,DELETE)

當使用 PDO::exec() 執行 INSERT,UPDATE,DELETE 操做時,返回值就是受影響的行數。fetch

3.2,預處理操做的修改行數(INSERT,UPDATE,DELETE)

使用 PDOStatement::rowCount() 方法來獲得修改的行數優化

$st = $mysql->prepare('DELETE FROM user WHERE age>?');  
$st->execute([18]);  
echo '本次操做刪除了'.$st->rowCount().'行數據';  
複製代碼

3.3,查看 SELECT 語句的返回行數

使用 PDO::fetchAll() 獲取全部行,再統計有多少行

$res = $mysql->query('SELECT * FROM user');  
//必定要向 fetchAll 傳入一個參數,否則該函數默認使用 PDO::FETCH_BOTH 參數 
//會返回一個同時包含數字鍵和字符串鍵的數組。 
$row = $res->fetchAll(PDO::FETCH_NUM);  
echo '本次查詢共有'.count($rows).'條數據';  
複製代碼
相關文章
相關標籤/搜索