php使用PDO抽象層獲取查詢結果,主要有三種方式:
(1)PDO::query()查詢。
看下面這段php代碼:
<?php //PDO::query()查詢
$res = $db->query('select * from user');
$res->setFetchMode(PDO::FETCH_NUM); //數字索引方式
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點點通')");
echo $res;
?>
(3)PDO::prepare()預處理執行查詢
<?php //PDO::prepare()預處理執行查詢
$res = $db->prepare("select * from user");
$res->execute();
while ($row = $res->fetchAll()) {
print_r($row);
}
?>
setAttribute() 方法是設置屬性,常用參數如下:
PDO::CASE_LOWER -- 強制列名是小寫
PDO::CASE_NATURAL -- 列名按照原始的方式
PDO::CASE_UPPER -- 強制列名為大寫
setFetchMode方法來設置獲取結果集的返回值的類型,常用參數如下:
PDO::FETCH_ASSOC -- 關聯數組形式
PDO::FETCH_NUM -- 數字索引數組形式
PDO::FETCH_BOTH -- 兩者數組形式都有,這是默認的
PDO::FETCH_OBJ -- 按照對象的形式,類似於以前的 mysql_fetch_object()
對上面總結如下:
查詢操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
PDO->query() — 處理一條SQL語句,並返回一個“PDOStatement”
PDO->exec() — 處理一條SQL語句,並返回所影響的條目數
PDO::prepare()主要是預處理操作,需要通過$rs->execute()來執行預處理里面的SQL語句
最后介紹兩個常用的函數:
(1)fetchColumn()獲取指定記錄里一個字段結果,默認是第一個字段!
<?php
$res = $db->query('select * from user');
//獲取指定記錄里第二個字段結果
$col = $res->fetchColumn(1);
echo $col;
?>
(2)fetchAll(),從一個結果集中獲取數據,然后存放在關聯數組中
<?php
$res = $db->query('select * from user');
$res_arr =$res->fetchAll();
print_r($res_arr);
?>
一、介紹PDO獲取結果集,不得不介紹一下PDO是如果執行SQL語句,一般情況下分三種,
1.query()方法
query()方法通常用於返回執行查詢后的結果集。語法是這樣的:PDOStatement PDO::query(string sql);
參數sql就很容易理解了,就是要執行的sql語句。
2.prepare()方法和execute()方法
prepare()是預處理語句的其中一個方法,通常來做查詢的准備工作,然后,execute()來執行查詢。
以上就簡單介紹這三種情況。
二、PDO如何獲取結果集
pdo獲取結果集有三種方法,分別是fetch()、fetchAll()和fetchColumn()方法。
首先,你先在數據庫里面建一個表,命名為t_user。
CREATE TABLE `t_user` (
`userid` int(11) NOT NULL,
`username` varchar(25) DEFAULT NULL,
`usersex` varchar(6) DEFAULT NULL,
`userage` int(6) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后,插入數據,很簡單,如下:
INSERT INTO `t_user` VALUES ('1', 'li', 'boy', '23');
INSERT INTO `t_user` VALUES ('2', 'nadia', 'gril', '20');
INSERT INTO `t_user` VALUES ('3', 'wang', 'boy', '55');
下面就簡單介紹一下每個方法是如何使用的。
1.fetch()方法
fecth()方法是獲取結果集的下一行數據。
表一:fetch_style控制結果集返回方式的可選值
PDO::FETCH_ASSOC | 關聯數組形式。 |
PDO::FETCH_NUM | 數字索引數組形式。 |
PDO::FETCH_BOTH | 兩者數組形式都有,這是默認的。 |
PDO::FETCH_OBJ | 按照對象的形式,類似於以前的mysql_fetch_object()函數。 |
PDO::FETCH_BOUND | 以布爾值的形式返回結果,同時將獲取的列值賦給bindParam()方法中指定的變量。 |
PDO::FETCH_LAZY | 以關聯數組、數字索引數組和對象3種形式返回結果。 |
ftech()方法的具體代碼如下所示:
<table border='1'>
<?php
$dbms = 'mysql';//選擇mysql數據庫
$host = '127.0.0.1';//數據庫主機名
$dbName = 'dbtext';//使用的數據庫
$user = "";//數據庫連接用戶名
$pwd = "";//數據庫連接密碼
$dsn = "$dbms:host=$host;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pwd);//初始化一個PDO對象,創建數據庫連接對象$pdo
$query = "select * from t_user";
$result = $pdo->prepare($query);
$result->execute();
while ($res=$result->fetch(PDO::FETCH_ASSOC)){?>
<tr>
<td><?php echo $res['userid'];?></td>
<td><?php echo $res['username'];?></td>
<td><?php echo $res['userage'];?></td>
<td><?php echo $res['usersex'];?></td>
</tr>
<?php }
}catch (Exception $e){
die("error!!!".$e->getMessage()."<br>");
}
?>
</table>
結果如下圖1:
圖1
2.fetchAll()方法
從單詞上可以看的很清楚,fetchAll()方法是為了獲取結果集的所有行。
fetch()方法
fetch()方法用於獲取結果集的下一行,語法如下:
mixed PDOStatement::fetch([int fetch_style][,int cursor_orientation[,int cursor_offset]]])
參數fetch_style控制結果集的返回方式
PDO::FETCH_ASSOC -- 關聯數組形式
PDO::FETCH_NUM -- 數字索引數組形式
PDO::FETCH_BOTH -- 兩者數組形式都有,這是缺省的
PDO::FETCH_OBJ -- 按照對象的形式,類似於以前的 mysql_fetch_object()
PDO::FETCH_BOUND--以布爾值的形式返回結果,同時獲取的列值賦給bindParam()方法中的指定變量。
PDO::FETCH_LAZY--以關聯數組、數字索引數組和對象3種形式返回結果
cursor_orientation:PDOStatement對象的一個滾動游標,可用於獲取指定的一行。
cursor_offset: 游標的偏移量
例如:
在PDO中通過預處理語句prepare()和execute()執行SQL查詢語句,並且應用while()語句和fetch()方法完成數據的循環輸出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$dbms
=
'mysql'
;
//數據庫類型
$dbName
=
'admin'
;
//使用的數據庫
$user
=
'root'
;
//數據庫連接用戶名
$pwd
=
'password'
;
//數據庫連接密碼
$host
=
'localhost'
;
//數據庫主機名
$dsn
=
"$dbms:host=$host;port=3306;dbname=$dbName"
;
try
{
$pdo
=
new
PDO(
$dsn
,
$user
,
$pwd
);
//初始化一個PDO對象,就是創建了數據庫連接對象$pdo
$query
=
"select * from user"
;
//需要執行的sql語句
$res
=
$pdo
->prepare(
$query
);
//准備查詢語句
$res
->execute();
while
(
$result
=
$res
->fetch(PDO::FETCH_ASSOC)){
echo
$result
[
'id'
].
" "
.
$result
[
'username'
].
" "
.
$result
[
'password'
].
'<br>'
;
}
}
catch
(Exception
$e
){
die
(
"Error!:"
.
$e
->getMessage().
'<br>'
);
}
|
運行結果為:
1
2
3
|
1 107lab e10adc3949ba59abbe56e057f20f883e
4 admin 123456
5 admin 123456
|
fetchAll()方法
fetchAll()方法用於獲取結果集中的所有行,其返回值是一個包含結果集中所有數據的二進制數組。語法如下:
array PDOStatement::fetchAll([int fetch_style[,int column_index]])
參數說明:
fetch_style:控制結果集中數據的顯示方式。
column_index: 字段的索引。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$dbms
=
'mysql'
;
//數據庫類型
$dbName
=
'admin'
;
//使用的數據庫
$user
=
'root'
;
//數據庫連接用戶名
$pwd
=
'password'
;
//數據庫連接密碼
$host
=
'localhost'
;
//數據庫主機名
$dsn
=
"$dbms:host=$host;port=3306;dbname=$dbName"
;
try
{
$pdo
=
new
PDO(
$dsn
,
$user
,
$pwd
);
//初始化一個PDO對象,就是創建了數據庫連接對象$pdo
$query
=
"select * from user"
;
//需要執行的sql語句
$res
=
$pdo
->prepare(
$query
);
//准備查詢語句
$res
->execute();
$result
=
$res
->fetchAll(PDO::FETCH_ASSOC);
print_r(
$result
);
}
catch
(Exception
$e
){
die
(
"Error!:"
.
$e
->getMessage().
'<br>'
);
}
|
運行結果為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Array
(
[0] => Array
(
[id] => 1
[username] => 107lab
[password] => e10adc3949ba59abbe56e057f20f883e
)
[1] => Array
(
[id] => 4
[username] => admin
[password] => 123456
)
[2] => Array
(
[id] => 5
[username] => admin
[password] => 123456
)
)
|
此時可以通過foreach來遍歷這個二維數組
1
2
3
|
foreach
(
$result
as
$val
){
echo
$val
[
'username'
].
'<br>'
;
}
|
運行結果為:
1
2
3
|
107lab
admin
admin
|
fetchColumn()方法
fetchColumn()方法獲取結果集中下一行指定列的值,語法如下:
string PDOStatement::fetchColumn([int column_number])
可選參數column_number設置行中列的索引值,該值從0開始。如果省略該參數則將從第1列開始取值
例如:
通過fetchColumn()方法獲取結果集中下一行中指定列的值。(或第一列id的值)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$dbms
=
'mysql'
;
//數據庫類型
$dbName
=
'admin'
;
//使用的數據庫
$user
=
'root'
;
//數據庫連接用戶名
$pwd
=
'password'
;
//數據庫連接密碼
$host
=
'localhost'
;
//數據庫主機名
$dsn
=
"$dbms:host=$host;port=3306;dbname=$dbName"
;
try
{
$pdo
=
new
PDO(
$dsn
,
$user
,
$pwd
);
//初始化一個PDO對象,就是創建了數據庫連接對象$pdo
$query
=
"select * from user"
;
//需要執行的sql語句
$res
=
$pdo
->prepare(
$query
);
//准備查詢語句
$res
->execute();
echo
$res
->fetchColumn(0).
'<br>'
;
echo
$res
->fetchColumn(0).
'<br>'
;
echo
$res
->fetchColumn(0).
'<br>'
;
}
catch
(Exception
$e
){
die
(
"Error!:"
.
$e
->getMessage().
'<br>'
);
}
|
運行結果為:
1
2
3
|
1
4
5
|