有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。

fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。

你有什么建议吗?


当前回答

正如我之前在回答一个类似问题时所写的,mysql_num_rows()工作的唯一原因是它在内部获取所有行以提供信息,即使您不认为它是这样的。

所以在PDO中,你的选项是:

使用PDO的fetchAll()函数将所有行获取到数组中,然后对其使用count()。 按照karim79的建议,对SELECT COUNT(*)执行额外的查询。 使用MySQL的FOUND_ROWS()函数,除非查询有SQL_CALC_FOUND_ROWS或LIMIT子句(在这种情况下,查询返回的行数和FOUND_ROWS()返回的行数可能不同)。但是,此函数已弃用,并将在将来删除。

其他回答

下面是PDO类的定制扩展,其中有一个辅助函数,用于检索最后一个查询的“WHERE”条件所包含的行数。

不过,您可能需要添加更多的“处理程序”,这取决于您使用的命令。现在它只适用于使用“FROM”或“UPDATE”的查询。

class PDO_V extends PDO
{
    private $lastQuery = null;

    public function query($query)
    {
        $this->lastQuery = $query;    
        return parent::query($query);
    }
    public function getLastQueryRowCount()
    {
        $lastQuery = $this->lastQuery;
        $commandBeforeTableName = null;
        if (strpos($lastQuery, 'FROM') !== false)
            $commandBeforeTableName = 'FROM';
        if (strpos($lastQuery, 'UPDATE') !== false)
            $commandBeforeTableName = 'UPDATE';

        $after = substr($lastQuery, strpos($lastQuery, $commandBeforeTableName) + (strlen($commandBeforeTableName) + 1));
        $table = substr($after, 0, strpos($after, ' '));

        $wherePart = substr($lastQuery, strpos($lastQuery, 'WHERE'));

        $result = parent::query("SELECT COUNT(*) FROM $table " . $wherePart);
        if ($result == null)
            return 0;
        return $result->fetchColumn();
    }
}

快速一行程序返回第一个条目。这对于非常基本的查询是很好的。

<?php
$count = current($db->query("select count(*) from table")->fetch());
?>

参考

对于直接查询,我想要一个特定的行,并想知道它是否被找到,我使用类似于:

function fetchSpecificRow(&$myRecord) {
    $myRecord = array();
    $myQuery = "some sql...";
    $stmt = $this->prepare($myQuery);
    $stmt->execute(array($parm1, $parm2, ...));
    if ($myRecord = $stmt->fetch(PDO::FETCH_ASSOC)) return 0;
    return $myErrNum;
}

如果你只是想获得行数(而不是数据),即。在预处理语句中使用COUNT(*),那么你所需要做的就是检索结果并读取值:

$sql = "SELECT count(*) FROM `table` WHERE foo = bar";
$statement = $con->prepare($sql); 
$statement->execute(); 
$count = $statement->fetch(PDO::FETCH_NUM); // Return array indexed by column number
return reset($count); // Resets array cursor and returns first value (the count)

实际上,检索所有行(数据)来执行简单的计数是一种资源浪费。如果结果集很大,您的服务器可能会因此阻塞。

回答这个问题是因为我现在知道了这个问题,也许它会有用。

请记住,您不能获取两次结果。您必须将获取结果保存到数组中,按count($array)获取行计数,并使用foreach输出结果。 例如:

$query = "your_query_here";
$STH = $DBH->prepare($query);
$STH->execute();
$rows = $STH->fetchAll();
//all your results is in $rows array
$STH->setFetchMode(PDO::FETCH_ASSOC);           
if (count($rows) > 0) {             
    foreach ($rows as $row) {
        //output your rows
    }                       
}