我正在重构使用adodb作为db库的PHP应用程序的一部分,以便开始使用PDO。
我需要能够提供选择记录集中包含的行数的内容,这些内容可以轻松替换之前使用的旧$rs->RecordCount()
adodb方法。它应该适用于sqlite3。
我不能简单地重新执行查询(或使用select count(*)
重新执行查询),因为我无法改变原始应用程序,应用程序在很多部分调用函数{{ 1}}(仅包含get_num_rows($rs)
)我可以更改该函数的内容。
我尝试克隆记录集对象并计算提取的记录:
$rs->RecordCount()
但它不起作用,因为function get_num_rows($rs)
{
$rs_copy = clone $rs;
return (count($rs_copy->fetchAll()));
}
会返回$rs_copy->fetchAll()
。我不能在原始记录集上执行此操作,因为稍后在应用程序中我需要再次获取它并且我认为PDO sqlite中没有办法重用记录集(如果我错了,请纠正我)。
你有解决方案吗?
答案 0 :(得分:1)
使用SELECT COUNT(*) FROM
run作为第二个查询是在主查询中使用LIMIT
时计算结果集中行数的推荐方法。它不会两次获取相同的数据,它只计算找到的行数并返回1行,一个整数。使用LIMIT
语句时查找行数的另一种方法是在第一个查询中使用SELECT SQL_CALC_FOUND_ROWS (field list) FROM ...
,然后运行SELECT FOUND_ROWS()
以获取行数,但是,此方法较慢比前面提到的那个。请注意,在PHP中运行count()
只会为您提供返回的行数,而不是在数据库中找到的实际行数(如果您使用的是LIMIT
)。
干杯
答案 1 :(得分:0)
也许有可能像col弹片一样建议并将结果存储在数组中。您可以通过扩展PDOStatement然后
来保持界面清洁http://www.php.net/manual/en/pdo.setattribute.php PDO :: ATTR_STATEMENT_CLASS
因此它将返回EugenioEnhancedPDOStatement
答案 2 :(得分:0)
感谢所有人。
我发现了一个更简单,快速和肮脏的解决方案,我的新get_num_rows()
将是:
$temp_ar = explode("FROM", $rs->queryString);
$sql = "SELECT COUNT(*) FROM ".$temp_ar[1];
$conn->query($sql);
...
答案 3 :(得分:-1)
您无法正确克隆和/或序列化/反序列化PDO对象,这很可能是因为它们与连接资源紧密相关。
事实是,没有必要克隆它。如果$rs
是PDOStatement对象,则可以重新执行它,因为您可以访问它。这是准备好的陈述的主要优点之一,准备一次,多次执行。
像这样:
function get_num_rows($rs)
{
$rs->execute();
return (count($rs->fetchAll()));
}
您猜对了:第二次在同一个PDOStatement实例上调用execute()而不指定任何参数将重用最后一组参数并按原样重新执行该语句。< /强>
因此,无需克隆PDOStatement对象。