使用PHP的PDO類操作MySQL

2021-08-09 02:24:35 字數 4627 閱讀 6742

$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資料庫中,...