PDO的數據獲取方法與其他數據庫擴展都非常類似,只要成功執行SELECT查詢,都會有結果集對象產生。不管是使用PDO對象中的query()方法,還是使用prepare()和execute()等方法結合的預處理語句,執行SELECT查詢都會得到相同的結果集對象PDOStatement。都需要通過PDOStatement類對象中的方法將數據遍歷出來。下面介紹PDOStatement類中常見的幾個獲取結果集數據的方法。
1、fetch()方法
PDOStatement類中的fetch()方法可以將結果集中當前的記錄以某種方式返回,並將結果集指針移至下一行,當到達結果集末尾時返回FALSE。該方法的原型如下:
mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )
第一個參數fetch_style是可選項,獲取一行數據記錄中,各列的引用方式取決於這個參數如何設置。可以使用的設置有以下6種。
PDO::FETCH_ASSOC 從結果集中獲取以列名為索引的關聯數組。
PDO::FETCH_NUM 從結果集中獲取一個以列在行中的數值偏移量為索引的值數組。
PDO::FETCH_BOTH 這是默認值,包含上面兩種數組。
PDO::FETCH_OBJ 從結果集當前行的記錄中獲取其屬性對應各個列名的一個對象。
PDO::FETCH_BOUND 使用fetch()返回TRUE,並將獲取的列值賦給在bindParm()方法中指 定的相應變量。
PDO::FETCH_LAZY 創建關聯數組和索引數組,以及包含列屬性的一個對象,從而可以在這三種接口中任選一種。
第二個參數cursor_orientation是可選項,用來確定當對象是一個可滾動的游標時應當獲取哪一行。
第三個參數cursor_offset也是可選項,需要提供一個整數值,表示要獲取的行相對於當前游標位置的偏移。
在下面的示例中,使用PDO對象中的query()方法執行SELECT查詢,獲取聯系人信息表contactinfo中的信息,並返回PDOStatement類對象作為結果集。然后通過fetch()方法結合while循環遍歷數據,並以HTML表格的形式輸出。代碼如下所示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php
try
{
$dbh
=
new
PDO(
'mysql:dbname=testdb;host=localhost'
,
$username
,
$passwd
);
}
catch
(PDOException
$e
){
echo
'數據庫連接失敗:'
.
$e
->getMessage();
exit
;
}
echo
'<table border="1" align="center" width=90%>'
;
echo
'<caption><h1>聯系人信息表</h1></caption>'
;
echo
'<tr bgcolor="#cccccc">'
;
echo
'<th>UID</th><th>姓名</th><th>聯系地址</th><th>聯系電話</th><th>電子郵件</th></tr>'
;
//使用query方式執行SELECT語句,建議使用prepare()和execute()形式執行語句
$stmt
=
$dbh
->query(
"select uid,name,address,phone,email FROM contactinfo"
);
//以PDO::FETCH_NUM形式獲取索引並遍歷
while
(list(
$uid
,
$name
,
$address
,
$phone
,
$email
)=
$stmt
->fetch(PDO::FETCH_NUM)){
echo
'<tr>'
;
echo
'<td>'
.
$uid
.
'</td>'
;
echo
'<td>'
.
$name
.
'</td>'
;
echo
'<td>'
.
$address
.
'</td>'
;
echo
'<td>'
.
$phone
.
'</td>'
;
echo
'<td>'
.
$email
.
'</td>'
;
echo
'</tr>'
;
}
echo
'</table>'
;
?>
|
2、fetchAll()方法
fetchAll()方法與上一個方法fetch()類似,但是該方法只需要調用一次就可以獲取結果集中的所有行,並賦給返回的數組(二維)。該方法的原型如下:
array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )
fetchAll()方法的應用示例如下所示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?php
try
{
$dbh
=
new
PDO(
'mysql:dbname=testdb;host=localhost'
,
$username
,
$passwd
);
}
catch
(PDOException
$e
){
echo
'數據庫連接失敗:'
.
$e
->getMessage();
exit
;
}
echo
'<table border="1" align="center" width=90%>'
;
echo
'<caption><h1>聯系人信息表</h1></caption>'
;
echo
'<tr bgcolor="#cccccc">'
;
echo
'<th>UID</th><th>姓名</th><th>聯系地址</th><th>聯系電話</th><th>電子郵件</th></tr>'
;
//使用query方式執行SELECT語句,建議使用prepare()和execute()形式執行語句
$stmt
=
$dbh
->prepare(
"select uid,name,address,phone,email FROM contactinfo"
);
$stmt
->execute();
$allrows
=
$stmt
->fetchAll(PDO::FETCH_ASSOC);
//以關聯下標從結果集中獲取所有數據
//以PDO::FETCH_NUM形式獲取索引並遍歷
foreach
(
$allrows
as
$row
){
echo
'<tr>'
;
echo
'<td>'
.
$row
[
'uid'
].
'</td>'
;
echo
'<td>'
.
$row
[
'name'
].
'</td>'
;
echo
'<td>'
.
$row
[
'$address'
].
'</td>'
;
echo
'<td>'
.
$row
[
'phone'
].
'</td>'
;
echo
'<td>'
.
$row
[
'email'
].
'</td>'
;
echo
'</tr>'
;
}
echo
'</table>'
;
//以下是在fetchAll()方法中使用兩個特別參數的演示示例
$stmt
->execute();
$row
=
$stmt
->fetchAll(PDO::FETCH_COLUMN,1);
//從結果集中獲取第二列的所有值
echo
'所有聯系人的姓名:'
;
print_r(
$row
);
?>
|
3、setFetchMode()方法
PDOStatement對象中的fetch()和fetchAll()兩個方法,獲取結果數據的引用方式默認都是一樣的,既按列在行中的數值偏移量(從0開始)索引的值數組,因為它們的默認模式都被設置為PDO::FETCH_BOTH值。如果計划使用其他模式來改變這個默認設置,可以在fetch()或fetchAll()方法中提供需要的模式參數。但如果多次使用這兩個方法,在每次調用時都需要設置新的模式來改變默認的模式。這時就可以使用PDOStatement類對象中的setFetchMode()方法,在腳本頁面的頂部設置一次模式,以后所有fetch()和fetchAll()方法的調用都將生成相應的結果集,減少了多次在調用fetch()方法時的參數錄入。
4、bindColumn()方法
使用該方法可以將一個列和一個指定的變量名綁定,這樣在每次使用fetch()方法獲取各行記錄時,會自動將相應的列值賦給該變量,但必須是在fetch()方法的第一個參數設置為PDO::FETCH_BOTH值時。bindColumn()方法的原型如下所示:
bool PDOStatement::bindColumn ( mixed $column , mixed &$param [, int $type [, int $maxlen [, mixed $driverdata ]]] )
第一個參數column為必選項,可以使用整數的列偏移位置索引(索引值從1開始),或是列的名稱字符串。第二個參數param也是必選項,需要傳遞一個引用,所以必須提供一個相應的變量名。第三個參數type是可選項,通過設置變量的類型來限制變量值,該參數支持的值和介紹bindparam()方法時提供的一樣。該方法的應用示例如下所示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?php
try
{
$dbh
=
new
PDO(
'mysql:dbname=testdb;host=localhost'
,
$username
,
$passwd
);
$dbh
= setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch
(PDOException
$e
){
echo
'數據庫連接失敗:'
.
$e
->getMessage();
exit
;
}
$query
=
"select uid,name,,phone,email FROM contactinfo WHERE departmentId=d01'"
;
try
{
$stmt
=
$dbh
->prepare(
$query
);
$stmt
->execute();
$stmt
->bindColumn(1,
$uid
);
$stmt
->bindColumn(2,
$name
);
$stmt
->bindColumn(
'phone'
,
$phone
);
$stmt
->bindColumn(
'email'
,
$email
);
while
(
$stmt
->fetch(PDO::FETCH_BOUND)){
echo
$uid
.
"\t"
.
$name
.
"\t"
.
$phone
.
"\t"
.
$email
.
"\n"
;
}
}
catch
(PDOException
$e
){
echo
$e
->getMessage();
}
?>
|
5、獲取數據列屬性信息
在項目開發中,除了尅通過上面的幾種方式獲取數據表中的記錄信息外,還可以使用PDOStatement類對象的columnCount()方法獲取數據表中字段的數量,並且可以通過PDOStatement類對象的getColumnMeta()方法獲取具體列的屬性信息。
