国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

PDO多種方式取得查詢結(jié)果

2019-11-06 06:39:38
字體:
供稿:網(wǎng)友

PDO最大的特點(diǎn)之一是它的靈活性,本節(jié)將介紹如何取得查詢結(jié)果,包括:

數(shù)組(數(shù)值或關(guān)聯(lián)數(shù)組);

字符串(單列的結(jié)果集);

對(duì)象;

回調(diào)函數(shù)。

1.快取一行

FetchColumn是為應(yīng)用程序取得一個(gè)僅包含單列的數(shù)據(jù),代碼如下:

$u = $db->query(“SELECT id FROM users WHERE login=‘login’ AND passWord=‘password’”);fetch(PDO::FETCH_COLUMN)if ($u->fetchColumn()) { //返回一個(gè)字符串//登錄成功} else {//驗(yàn)證失敗}

2.取得一個(gè)標(biāo)準(zhǔn)對(duì)象

還可以將取得的一行作為一個(gè)標(biāo)準(zhǔn)類stdClass的對(duì)象實(shí)例,其中列名=屬性名。

$res = $db->query(“SELECT * FROM foo”);while ($obj = $res->fetch(PDO::FETCH_OBJ)) {// $obj == instance of stdClass}

3.存取為一個(gè)類

PDO允許將結(jié)果保存為一個(gè)類,例子如下:

$res = $db->query(“SELECT * FROM foo”);$res->setFetchMode(PDO::FETCH_CLASS,“className”,array(‘optional’=‘Constructor Params’));while ($obj = $res->fetch()) {// $obj == instance of className}

4.從一個(gè)類取得常量

PDO允許查詢的結(jié)果可以被用來生成一個(gè)目的類。

$res = $db->query(“SELECT * FROM foo”);$res->setFetchMode(PDO::FETCH_CLASS |PDO::FETCH_CLASSTYPE);while ($obj = $res->fetch()) {// $obj == instance of class who’s name is// found in the value of the 1st column}

5.存取為一個(gè)對(duì)象

PDO還允許獲取數(shù)據(jù)到一個(gè)已經(jīng)存在的對(duì)象。

$u = new userObject;$res = $db->query(“SELECT * FROM users”);$res->setFetchMode(PDO::FETCH_INTO, $u);while ($res->fetch()) {// 取得的記錄集將放在$u這個(gè)對(duì)象變量中,在此顯示}

6.存取為關(guān)聯(lián)數(shù)據(jù)

PDO實(shí)現(xiàn)了迭代器(Iteator)接口,允許一個(gè)方法實(shí)現(xiàn)迭代的功能。

$res = $db->query(“SELECT * FROM users”,PDO::FETCH_ASSOC);foreach ($res as $row) {// $row是一個(gè)關(guān)聯(lián)數(shù)組,可以直接顯示,如$row['id']}

7.fetchAll()方法

PDO也提供了和ADODB類似的fetchAll()方法,它允許從一個(gè)結(jié)果集中取得數(shù)據(jù),然后放于關(guān)聯(lián)數(shù)組中。

$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);$qry = “SELECT * FROM users”;$res = $db->query($qry)->fetchAll(PDO::FETCH_ASSOC);?>或者獲取到索引數(shù)組里:$res = $db->query("SELECT * FROM foo");$result_arr = $res->fetchAll();PRint_r($result_arr);

數(shù)字索引數(shù)組比較浪費(fèi)資源,請(qǐng)盡量使用關(guān)聯(lián)數(shù)組,這樣可以在內(nèi)存中使用相當(dāng)密集的大型結(jié)果集。 相關(guān)說明如下:

setAttribute()方法用于設(shè)置部分屬性,主要屬性有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等,這里需要設(shè)置的是PDO::ATTR_CASE,就是使用關(guān)聯(lián)索引獲取數(shù)據(jù)集時(shí),關(guān)聯(lián)索引是大寫還是小寫,有如下幾個(gè)選擇:

PDO::CASE_LOWER——強(qiáng)制列名是小寫;

PDO::CASE_NATURAL——列名按照原始的方式;

PDO::CASE_UPPER——強(qiáng)制列名為大寫。

我們使用setFetchMode方法來設(shè)置獲取結(jié)果集的返回值的數(shù)據(jù)類型,類型有:

PDO::FETCH_ASSOC——關(guān)聯(lián)數(shù)組形式;

PDO::FETCH_NUM——數(shù)字索引數(shù)組形式;

PDO::FETCH_BOTH——兩種數(shù)組形式都有,這是默認(rèn)的;

PDO::FETCH_OBJ——按照對(duì)象的形式,類似于以前的 MySQL_fetch_object()。

當(dāng)然,一般情況下,我們使用PDO::FETCH_ASSOC取得關(guān)聯(lián)數(shù)組。具體使用哪種類型,應(yīng)按照自己的實(shí)際應(yīng)用選擇。

8.fetchColumn()方法

如果想獲取指定記錄里的一個(gè)字段結(jié)果,則可以使用PDOStatement::fetchColumn()。

$rs = $db->query("SELECT COUNT(*) FROM foo");$col = $rs->fetchColumn();echo $col;

一般使用fetchColumn()方法進(jìn)行count統(tǒng)計(jì),對(duì)某些只需要單字段的記錄可以很好地操作。

9.回調(diào)函數(shù)

PDO還規(guī)定在每一個(gè)fetch模式下,經(jīng)過處理后的結(jié)果中使用一個(gè)回調(diào)函數(shù)。

function draw_message($subject,$email) { … }$res = $db->query(“SELECT * FROM msg”);$res->fetchAll(PDO::FETCH_FUNC,“draw_message”);

10.直接查詢的問題

直接使用Query查詢行每次都會(huì)直接提交給數(shù)據(jù)庫(kù),如果查詢較多,每次頻頻查詢將導(dǎo)致效率降低。 另外,在安全問題上,沒有過濾一些特殊字符容易產(chǎn)生SQL注入

11.過濾字符

下面我們來看看如何使用PDO進(jìn)行過濾引起SQL注入的方法,即過濾特殊字符。我們?cè)赑DO中使用quote()方法,使用例子如下:

$query = “SELECT * FROM users WHERElogin=“.$db->quote($_POST[‘login’]).”ANDpasswd=“.$db->quote($_POST[‘pass’]);

12.事務(wù)處理

PDO驅(qū)動(dòng)程序支持所有的事務(wù)數(shù)據(jù)庫(kù),并且PDO提供更簡(jiǎn)便的方法,如下:

$db->beginTransaction();if ($db->exec($qry) === FALSE) {$db->rollback();}$db->commit();

13.執(zhí)行一個(gè)批處理事務(wù)

在下面的示例中,假設(shè)我們?yōu)橐粋€(gè)新雇員創(chuàng)建一組條目,這個(gè)雇員有一個(gè)ID號(hào),即23。除了輸入這個(gè)雇員的基本數(shù)據(jù)外,還需要記錄雇員的薪水。分別完成兩個(gè)更新很簡(jiǎn)單,但通過將這兩個(gè)更新包括在beginTransaction()和commit()調(diào)用中,就可以保證在更改完成之前,其他人無法看到更改。如果發(fā)生了錯(cuò)誤,catch塊可以回滾事務(wù)開始以來發(fā)生的所有更改,并打印出一條錯(cuò)誤消息。代碼內(nèi)容如下:

try { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO_ATTR_PERSISTENT => true)); echo "Connected/n"; $dbh->setAttribute(PDO_ATTR_ERRMODE, PDO_ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')"); $dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())"); $dbh->commit();} catch (Exception $e) { $dbh->rollBack(); echo "Failed: " . $e->getMessage();}

并不是一定要在事務(wù)中做出更新,也可以通過復(fù)雜的查詢來提取數(shù)據(jù),還可以使用信息構(gòu)建更多的更新和查詢。當(dāng)事務(wù)在活動(dòng)時(shí),可以保證其他人在工作進(jìn)行當(dāng)中無法做出更改。事實(shí)上,這不是100%的正確,但如果您之前沒有聽說過事務(wù)的話,這樣介紹也未嘗不可。 下面是一個(gè)擴(kuò)展PDO&PDO語句的類,內(nèi)容如下:

class Database extends PDO{ function __construct(){ parent::__construct('mysql:dbname=test;host=localhost', 'root', ''); $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DBStatement'array($this))); }}class DBStatement extends PDOStatement{ public $dbh; protected function __construct($dbh){ $this->dbh = $dbh; $this->setFetchMode(PDO::FETCH_OBJ);}public function foundRows(){ $rows = $this->dbh->prepare('SELECT found_rows() AS rows',array(PDO::MYSQL_ATTR_ USE_BUFFERED_QUERY = > TRUE)); $rows->execute(); $rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows; $rows->closeCursor(); return $rowsCount; }}

14.存儲(chǔ)過程

在MySQL一章,我們已經(jīng)了解了存儲(chǔ)過程的創(chuàng)建,下面我們來看使用PDO調(diào)用的例子:

$stmt = $dbh->prepare("CALL sp_set_string(?)");$stmt->bindParam(1, $str);$str = ‘hospinfo’; //綁定參數(shù)$stmt->execute();

與先前講過的綁定例子差不多,只是這里使用了“?”數(shù)據(jù)綁定方法,sp_set_string是存儲(chǔ)過程名稱。 帶有輸出參數(shù)的存儲(chǔ)過程:

$stmt = $dbh->prepare("CALL sp_get_string(?)");$stmt->bindParam(1, $ret,PDO:ARAM_STR, 4000);if ($stmt->execute()) { echo "返回值 $ret/n";}

下面是綁定列輸出的腳本例子:

$stmt = $dbh->prepare("SELECT extension, name from CREDITS");if ($stmt->execute()) { $stmt->bindColumn('extension', $extension); $stmt->bindColumn('name', $name); while ($stmt->fetch(PDO::FETCH_BOUND)) { echo "Extension: $extension/n"; echo "Author: $name/n"; }}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 马鞍山市| 普定县| 禄劝| 曲水县| 蕲春县| 洱源县| 观塘区| 且末县| 勐海县| 东方市| 桃源县| 巴东县| 凤凰县| 怀远县| 梨树县| 聊城市| 太白县| 伊川县| 太仆寺旗| 天全县| 珠海市| 自治县| 新丰县| 永修县| 上高县| 临洮县| 辽源市| 安溪县| 错那县| 天门市| 长泰县| 城市| 广安市| 洛南县| 绥德县| 象州县| 洛浦县| 时尚| 玛曲县| 宜黄县| 沙湾县|