$mysql = new pdo('mysql:host=localhost;sort=3306;dbname=foo;',$user,$psd);
值得一提的是,如果連線資料庫失敗,會丟擲乙個pdoexception異常,這樣我們就可以直接用try{}catch{}來處理異常,不僅如此,還可以通過pdo::setattribute()方法讓pdo每遇到乙個錯誤時就丟擲異常,這樣就能使用一種統一的方式處理資料庫問題
trycatch(exception $e)
//獲得結果集
$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開始;
$row = $res->fetchall(fetch_column,2); //返回結果中的第3列
如果你想把查詢的結果直接賦值給某個變數,可以採用以下方法
//向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())
//首先需要定義乙個擴充套件pdostatement的類
class foo extends pdostatement
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())位學生的成績為:
英語:,數學:,計算機:
平均分:
";}
使用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操作時,返回值就是受影響的行數。
使用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).'條資料';
更多資料:php官方手冊:pdo
mysql pdo手冊 使用PDO操作MySQL
pdo擴充套件為php訪問資料庫定義了乙個輕量級的 一致性的介面,它提供了乙個資料訪問抽象層,這樣,無論使用什麼資料庫,都可以通過一致的函式執行查詢和獲取資料。pdo支援的php版本為php5.1以及更高的版本,而且在php5.2下pdo預設為開啟狀態,下面是在php.ini中pdo的配置 exte...
PHP的PDO基本操作
php 5 及以上版本建議使用以下方式連線 mysql mysqli extension i 意為 improved pdo php data objects pdo 應用在 12 種不同資料庫中,mysqli 只針對 mysql 資料庫。二者都支援預處理語句,可防止sql注入。示例 servern...
在php使用PDO類查詢Mysql
在我的php開發過程中,資料庫的採用都是使用mysql資料庫,與資料庫有關的操作基本上都是使用php中的mysql擴充套件函式,例如mysql query,mysql connect等函式,使用這些傳統的方法來連線查詢資料庫時,個人覺得有兩個弊端,一是沒有擴充套件性,就是只能用在mysql資料庫中,...