回調(diào)函數(shù)。
為容縣等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及容縣網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、容縣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
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)類(lèi)stdClass的對(duì)象實(shí)例,其中列名=屬性名。
$res = $db-query(“SELECT * FROM foo”);
while ($obj = $res-fetch(PDO::FETCH_OBJ)) {
// $obj == instance of stdClass
}
?
3.存取為一個(gè)類(lèi)
PDO允許將結(jié)果保存為一個(gè)爛蘆類(lèi),例子如下:
$res = $db-基譽(yù)query(“SELECT * FROM foo”);
$res-setFetchMode(
PDO::FETCH_CLASS,
“className”,
array(‘optional’=‘Constructor Params’)
);
while ($obj = $res-fetch()) {
// $obj == instance of className
}
?
4.從一個(gè)類(lèi)取得常量
PDO允許查詢(xún)的結(jié)果可以被用來(lái)生成一個(gè)目的類(lèi)。
$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類(lèi)似的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)說(shuō)明如下:
setAttribute()方法用于設(shè)置部分屬性,主要屬性有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等,這里需要設(shè)置的是PDO::ATTR_CASE,就是使用關(guān)聯(lián)索引獲取數(shù)據(jù)集時(shí),關(guān)聯(lián)索引是大寫(xiě)還是小寫(xiě),有如下幾個(gè)選擇:
PDO::CASE_LOWER——強(qiáng)制列名是小寫(xiě);
PDO::CASE_NATURAL——列名按照原始的方式;
PDO::CASE_UPPER——強(qiáng)制列名為大寫(xiě)。
我們使用setFetchMode方法來(lái)設(shè)置獲取結(jié)果集的返回值的數(shù)據(jù)類(lèi)型,類(lèi)型有:
PDO::FETCH_ASSOC——關(guān)聯(lián)數(shù)組形式;
PDO::FETCH_NUM——數(shù)字索引數(shù)組形式;
PDO::FETCH_BOTH——兩種數(shù)組形式都有,這是默認(rèn)的;
PDO::FETCH_OBJ——按照對(duì)象的形式,類(lèi)似于以前的 mysql_fetch_object()。
當(dāng)然,一般情況下,我們使用PDO::FETCH_ASSOC取得關(guān)聯(lián)數(shù)組。具體使用哪種類(lèi)型,應(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)過(guò)處理后的結(jié)果中使用一個(gè)回調(diào)函數(shù)。
function draw_message($subject,$email) { … }
$res = $db-query(“SELECT * FROM msg”);
$res-fetchAll(PDO::FETCH_FUNC,“draw_message”);
?
10.直接查詢(xún)的問(wèn)題
直接使用Query查詢(xún)行每次都會(huì)直接提交給數(shù)據(jù)庫(kù),如果查詢(xún)較多,每次頻頻查詢(xún)將導(dǎo)致效率降低。
另外,在安全問(wèn)題上,沒(méi)有過(guò)濾一些特殊字符容易產(chǎn)生SQL注入。
11.過(guò)濾字符
下面我們來(lái)看看如何使用PDO進(jìn)行過(guò)濾引起SQL注入的方法,即過(guò)濾特殊字符。我們?cè)赑DO中使用quote()方法,使用例子如下:
$query = “SELECT * FROM users WHERE
login=“.$db-quote($_POST[‘login’]).”
AND
passwd=“.$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)單,但通過(guò)將這兩個(gè)更新包括在beginTransaction()和commit()調(diào)用中,就可以保證在更改完成之前,其他人無(wú)法看到更改。如果發(fā)生了錯(cuò)誤,catch塊可以回滾事務(wù)開(kāi)始以來(lái)發(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();
}
?
php使用PDO抽象層獲取查詢(xún)結(jié)果,主要有三種方式:
(1)PDO::query()查詢(xún)。
看下面這段php代碼:
?php //PDO::query()查詢(xún)
$res = $db-query('select * from user');
$res-setFetchMode(PDO::FETCH_NUM); //數(shù)字索引方式
while ($row = $res-fetch()){
print_r($row);
}
?
(2)PDO-exec()處理sql
?php //PDO-exec()處理sql
$db-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$res = $db-exec("insert into user(id,name) values('','php點(diǎn)點(diǎn)通')");
echo $res;
?
(3)PDO::prepare()預(yù)處理執(zhí)行查詢(xún)
?php //PDO::prepare()預(yù)處理執(zhí)行查詢(xún)
$res = $db-prepare("select * from user");
$res-execute();
while ($row = $res-fetchAll()) {
print_r($row);
}
?
setAttribute() 方法是設(shè)置屬性,常用參數(shù)如下:
PDO::CASE_LOWER -- 強(qiáng)制列名是小寫(xiě)悔亂
PDO::CASE_NATURAL -- 列名按照原始的方式
PDO::CASE_UPPER -- 強(qiáng)制列名為大寫(xiě)
setFetchMode方法來(lái)設(shè)置獲取結(jié)果集的返回值的類(lèi)型,常用參數(shù)如下:
PDO::FETCH_ASSOC -- 關(guān)聯(lián)數(shù)組形式
PDO::FETCH_NUM -- 數(shù)字索引數(shù)組形式
PDO::FETCH_BOTH -- 兩者數(shù)組形式都有,這是默認(rèn)的
PDO::FETCH_OBJ -- 按照對(duì)象的形式,類(lèi)似于以前的 mysql_fetch_object()
對(duì)上面總結(jié)如下:
查詢(xún)操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
PDO-query() — 處理一條SQL語(yǔ)句,碧山檔并返回一個(gè)“PDOStatement”
PDO-exec() — 處理一條SQL語(yǔ)句,并返回所影響的條目數(shù)
PDO::prepare()主要是預(yù)處理操作,需要通唯辯過(guò)$rs-execute()來(lái)執(zhí)行預(yù)處理里面的SQL語(yǔ)句
最后介紹兩個(gè)常用的函數(shù):
(1)fetchColumn()獲取指定記錄里一個(gè)字段結(jié)果,默認(rèn)是第一個(gè)字段!
?php
$res = $db-query('select * from user');
//獲取指定記錄里第二個(gè)字段結(jié)果
$col = $res-fetchColumn(1);
echo $col;
?
(2)fetchAll(),從一個(gè)結(jié)果集中獲取數(shù)據(jù),然后存放在關(guān)聯(lián)數(shù)組中
?php
$res = $db-query('select * from user');
$res_arr =$res-fetchAll();
print_r($res_arr);
?
?php
header('content-type:text/html;charset=utf-8');
$dsn = 'mysql:dbname=m-test;host=localhost';
$user = 'root';//數(shù)據(jù)庫(kù)用戶(hù)名
$passwd = '';//數(shù)據(jù)庫(kù)密碼
try {
$pdo = new pdo($dsn, $user, $passwd);
$pdo-腔蔽緩query('set names utf8');//設(shè)置字符集
$result = $pdo-query('select * from user');//查詢(xún)數(shù)據(jù)庫(kù)
foreach ($result as $row) {
echo $row['id'];//輸伍模出 id 號(hào)
echo ':';
echo $row['name'并改];//輸出 name
echo 'br /';
}
} catch (pdoexception $e) {
echo $e-getmessage();//錯(cuò)誤信息
}
?