克隆PHP PDO记录集对象以计算select语句返回的行数

时间:2011-01-22 15:13:28

标签: php sqlite pdo

我正在重构使用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中没有办法重用记录集(如果我错了,请纠正我)。

你有解决方案吗?

4 个答案:

答案 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对象。