我正在重构使用adodb作为db库的PHP应用程序的一部分,以便开始使用PDO .
我需要一些能够为我提供选择记录集中包含的行数的东西,这些东西可以轻松替换我之前使用过的旧的 $rs->RecordCount()
adodb方法 . 它应该适用于sqlite3 .
我不能简单地重新执行查询(或者使用_458109重新执行查询),因为我无法改变原始应用程序,应用程序在很多部分调用函数 get_num_rows($rs)
(其中只包含 $rs->RecordCount()
)和我可以只改变该功能的内容 .
我尝试克隆记录集对象并计算获取的记录:
function get_num_rows($rs)
{
$rs_copy = clone $rs;
return (count($rs_copy->fetchAll()));
}
但它不起作用,因为 $rs_copy->fetchAll()
返回我 false
. 我错了't do it on the original recordset because later in the applicaiton I need to fetch it again and I think there is no way in PDO sqlite to reuse the recordset (correct me if I' .
你有什么解决办法?
4 回答
也许有可能像col弹片一样建议并将结果存储在数组中 . 您可以通过扩展PDOStatement来保持界面清洁
http://www.php.net/manual/en/pdo.setattribute.php PDO :: ATTR_STATEMENT_CLASS
所以它会返回你EugenioEnhancedPDOStatement
您无法正确克隆和/或序列化/反序列化PDO对象,这很可能是因为它们与连接资源紧密相关 .
事实是,没有必要克隆它 . 如果
$rs
是PDOStatement对象,则可以重新执行它,因为您可以访问它 . 这是准备好的陈述的主要优点之一, prepare once, execute multiple times .像这样:
你猜对了:调用execute() on the same PDOStatement instance the second time without specifying any parameters 将 reuse the last set of parameters and re-execute the statement as is.
因此,无需克隆PDOStatement对象 .
谢谢大家 . 我找到了一个更简单,快速和肮脏的解决方案,我的新_458124将是这样的:
在主查询中使用
LIMIT
时,建议使用SELECT COUNT(*) FROM
run作为第二个查询来计算结果集中的行数 . 它不会两次获取相同的数据,它只计算找到的行数并返回1行,一个整数 . 使用LIMIT
语句时查找行数的另一种方法是在第一个查询中使用SELECT SQL_CALC_FOUND_ROWS (field list) FROM ...
,然后运行SELECT FOUND_ROWS()
以获取行数,但是,此方法比前面提到的慢 . 请注意,在PHP中运行count()
只会为您提供返回的行数,而不是在数据库中找到的实际行数(如果您使用的是LIMIT
) .干杯