首页 文章

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

提问于
浏览
2

我正在重构使用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 回答

  • 0

    也许有可能像col弹片一样建议并将结果存储在数组中 . 您可以通过扩展PDOStatement来保持界面清洁

    http://www.php.net/manual/en/pdo.setattribute.php PDO :: ATTR_STATEMENT_CLASS

    所以它会返回你EugenioEnhancedPDOStatement

  • 0

    您无法正确克隆和/或序列化/反序列化PDO对象,这很可能是因为它们与连接资源紧密相关 .

    事实是,没有必要克隆它 . 如果 $rs 是PDOStatement对象,则可以重新执行它,因为您可以访问它 . 这是准备好的陈述的主要优点之一, prepare once, execute multiple times .

    像这样:

    function get_num_rows($rs)
    {
     $rs->execute();
     return (count($rs->fetchAll()));
    }
    

    你猜对了:调用execute() on the same PDOStatement instance the second time without specifying any parametersreuse the last set of parameters and re-execute the statement as is.

    因此,无需克隆PDOStatement对象 .

  • -1

    谢谢大家 . 我找到了一个更简单,快速和肮脏的解决方案,我的新_458124将是这样的:

    $temp_ar = explode("FROM", $rs->queryString);
    
    $sql = "SELECT COUNT(*) FROM ".$temp_ar[1];
    
    $conn->query($sql);
    
    ...
    
  • 1

    在主查询中使用 LIMIT 时,建议使用 SELECT COUNT(*) FROM run作为第二个查询来计算结果集中的行数 . 它不会两次获取相同的数据,它只计算找到的行数并返回1行,一个整数 . 使用 LIMIT 语句时查找行数的另一种方法是在第一个查询中使用 SELECT SQL_CALC_FOUND_ROWS (field list) FROM ... ,然后运行 SELECT FOUND_ROWS() 以获取行数,但是,此方法比前面提到的慢 . 请注意,在PHP中运行 count() 只会为您提供返回的行数,而不是在数据库中找到的实际行数(如果您使用的是 LIMIT ) .

    干杯

相关问题