$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
}
複製代碼
//得到結果集
$res = $mysql->query("SELECT * FROM foo");
//從結果集中取出一組做爲數組返回,該數組爲一個關聯數組和一個非關聯數組的並集
$res->fetch();
//從結果集中取出全部數據做爲二維數組返回,該數組爲一個關聯數組和一個非關聯數組的並集
$res->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);
複製代碼
向 PDO::fetchAll() 方法傳入 PDO::FETCH_COLUMN 和第二個參數(指定列數,從0開始)mysql
$row = $res->fetchAll(FETCH_COLUMN,2); //返回結果中的第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/>";
}
複製代碼
//首先須要定義一個擴展 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++;
}
複製代碼
使用 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() 更快。數組
//準備預處理語句
$st = $mysql->prepare("SELECT * FROM user WHERE age>? AND weight<?");
//第一次綁定參數並執行
$st->execute([18,100]);
$res1 = $st->fetchAll();
//第二次綁定參數並執行
$st->execute([16,150]);
$res2 = $st->fetchAll();
複製代碼
//準備預處理語句
$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();
複製代碼
//準備預處理語句
$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 的值,更聰明的方法是經過循環或者函數來改變變量的值,實現上視具體需求而變。安全
下面的例子都是使用?佔位符,使用命名佔位符的用法等同於 SELECT函數
//準備預處理語句
$st = $mysql->prepare('INSERT INTO user VALUE(?,?,?)');
//參數綁定並執行
$st->execute(['jone',18,100]);
$st->execute(['mike',19,120]);
複製代碼
//準備預處理語句
$st = $mysql->prepare('UPDATE user SET age=? WHERE weight=?');
//參數綁定並執行
$st->execute([20,100]);
$st->execute([25,120]);
複製代碼
//準備預處理語句
$st = $mysql->prepare('UPDATE FROM user WHERE age=?');
//參數綁定並執行
$st->execute([20]);
$st->execute([25]);
複製代碼
當使用 PDO::exec() 執行 INSERT,UPDATE,DELETE 操做時,返回值就是受影響的行數。fetch
使用 PDOStatement::rowCount() 方法來獲得修改的行數優化
$st = $mysql->prepare('DELETE FROM user WHERE age>?');
$st->execute([18]);
echo '本次操做刪除了'.$st->rowCount().'行數據';
複製代碼
使用 PDO::fetchAll() 獲取全部行,再統計有多少行
$res = $mysql->query('SELECT * FROM user');
//必定要向 fetchAll 傳入一個參數,否則該函數默認使用 PDO::FETCH_BOTH 參數
//會返回一個同時包含數字鍵和字符串鍵的數組。
$row = $res->fetchAll(PDO::FETCH_NUM);
echo '本次查詢共有'.count($rows).'條數據';
複製代碼