最近刚刚做完一个PHP的项目,对方要求使用Pear中的DB包,一开始觉得还不错,但到了后来渐渐发现这个家伙真的是廉颇老矣,Pear中的数据抽象访问层的目标是做一个共通的数据访问,也就是说,代码不需要很多修改,就可以拿到别的数据库上使用,这一点在基本上达到了,像DB,MDB2都是很不错的选择,但在一些特殊情况下,却有点小问题了:
1 :当出现以下代码时,DB会将?号替换为空,还有一种是同样的就是当SQL语句中出现全角字符时也是同样的情况呵呵,可笑吧,但MDB2就不会,所以推荐大家使用MDB2
SELECT
×
FROM
TABLE
WHERE
user_check
&
2
=
0
AND
user_id
=
?
2:关于分页的小BUG,大家用过Pear的Pager就知道,Pager会提供一套与DB,MDb和MDB2结合使用的方法
Pager_wrapper_ DB | MDB2 | MDB 这个方法的使用相当简单,但在具体分页的实现上,各个类却有着很大的差异先说DB:
function
&
Pager_Wrapper_DB(
&
$db
,
$query
,
$dbparams
=
null
,&
$pager_options
)
{
$temp
=
array
(
'
mode
'
=>
'
Jumping
'
,
'
perPage
'
=>
5
,
'
delta
'
=>
1
);
if
((
!
array_key_exists
(
'
prevImg
'
,
$pager_options
)))
{
if
(
array_key_exists
(
'
perPage
'
,
$pager_options
))
{
$pager_options
[
'
prevImg
'
]
=
"
←前
"
.
$pager_options
[
'
perPage
'
]
.
"
件
"
;
$pager_options
[
'
nextImg
'
]
=
"
次
"
.
$pager_options
[
'
perPage
'
]
.
"
件→
"
;
}
else
{
$pager_options
[
'
prevImg
'
]
=
"
←前
"
.
$temp
[
'
perPage
'
]
.
"
件
"
;
$pager_options
[
'
nextImg
'
]
=
"
次
"
.
$temp
[
'
perPage
'
]
.
"
件→
"
;
}
}
$res
=&
$db
->
query(
$query
,
$dbparams
);
if
(PEAR
::
isError(
$res
))
{
throw
new
Exception
(
"
Query Error!
"
);
}
$totalItems
=
(int)
$res
->
numRows();
$res
->
free();
$pager_options
[
'
totalItems
'
]
=
$totalItems
;
$pager_options
=
array_merge
(
$temp
,
$pager_options
);
require_once
'
Pager/Pager.php
'
;
$pager
=
Pager
::
factory(
$pager_options
);
$this
->
page
=
array
();
$this
->
page[
'
totalItems
'
]
=
$pager_options
[
'
totalItems
'
];
$this
->
page[
'
back
'
]
=
$pager
->
_getBackLink();
$this
->
page[
'
next
'
]
=
$pager
->
_getNextLink();
$this
->
page[
'
page_numbers
'
]
=
array
(
'
current
'
=>
$pager
->
getCurrentPageID()
,
'
total
'
=>
$pager
->
numPages()
);
list
(
$this
->
page[
'
from
'
]
,
$this
->
page[
'
to
'
])
=
$pager
->
getOffsetByPageId();
$num
=
$this
->
page[
'
totalItems
'
]
-
(
$this
->
page[
'
page_numbers
'
][
'
current
'
]
*
$pager_options
[
'
perPage
'
]);
$num
=
$num
>
0
?
$pager_options
[
'
perPage
'
]
:
$num
+
$pager_options
[
'
perPage
'
];
if
(
$totalItems
==
0
)
{
$num
=
0
;
}
$res
=
$db
->
limitQuery(
$query
,
$this
->
page[
'
from
'
]
-
1
,
$num
,
$dbparams
);
if
(PEAR
::
isError(
$res
)) {
throw
new
Exception
(
$res
->
getUserInfo());
}
$data
=
array
();
while
(
$res
->
fetchInto(
$row
,
DB_FETCHMODE_ASSOC)) {
$data
[]
=
$row
;
}
$res
->
free();
return
$data
;
}
看完这段程序都知道了,其实这个函数很简单,DB的分页实现就是靠拿个limitquery,不过令我想不到的是,当num数大于数据库中当前页记录条数时,居然会报错,这让我很奇怪,于是看了下源码,才发现这家伙居然在底层是使用游标循环完成的分页,这才恍然大悟,可怕吧,嘿嘿,但MDB2就不愧为DB的替代者,它采用的是添加Top|limit限制,所以综上所述大家都知道谁好用了吧,哈哈,完了吗,还没,还有PHP的未来数据访问新贵PDO,这玩意是我见过的PHP中访问数据库最快的东东了,具体使用就不多说了,只是暂时版本还不够成熟,要想和Pager结合,需要自己手动写PDO访问数据分页的代码。