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

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

你有什么建议吗?


当前回答

这太迟了,但我遇到了一个问题,我这样做:

function countAll($table){
   $dbh = dbConnect();
   $sql = "select * from `$table`";

   $stmt = $dbh->prepare($sql);
    try { $stmt->execute();}
    catch(PDOException $e){echo $e->getMessage();}

return $stmt->rowCount();

这真的很简单。:)

其他回答

这是一个老帖子,但正在沮丧地寻找替代方案。非常不幸的是,PDO缺少这个特性,特别是PHP和MySQL往往是齐头并进的。

使用fetchColumn()有一个不幸的缺陷,因为当fetchColumn()将指针移动到下一行时,您不能再使用该结果集(有效地)。举个例子,如果你有一个类似于

水果- - - >香蕉 水果——>苹果 水果- - - >橙色

如果你使用fetchColumn(),你可以发现有3个水果返回,但如果你现在循环的结果,你只有两列,fetchColumn()的价格是损失的第一列结果,只是找出多少行被返回。这会导致草率的编码,如果实现的话,结果会完全错误。

所以现在,使用fetchColumn(),你必须实现一个全新的调用和MySQL查询,只是为了得到一个新的工作结果集。(希望自你上次提问以来没有改变),我知道,不太可能,但这是可能发生的。此外,所有行数验证上的双重查询的开销。对于这个例子来说,这是很小的,但是在一个连接查询上解析200万行,这不是一个令人愉快的代价。

我热爱PHP,支持每一个参与PHP开发的人,以及日常使用PHP的社区,但真的希望在未来的版本中能够解决这个问题。这是我对PHP PDO“真正”唯一的不满,否则它是一个伟大的类。

最后我用了这个:

$result = $db->query($query)->fetchAll();

if (count($result) > 0) {
    foreach ($result as $row) {
        echo $row['blah'] . '<br />';
    }
} else {
    echo "<p>Nothing matched your query.</p>";
}

这篇文章是旧的,但获得行计数在php与PDO是简单的

$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();

有一个简单的解决办法。如果你使用PDO连接到你的DB,像这样:

try {

    $handler = new PDO('mysql:host=localhost;dbname=name_of_your_db', 'your_login', 'your_password'); 
    $handler -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) { 

    echo $e->getMessage();
}

现在,如果你想知道你的表中有多少行,并且你有列'id'作为主键,对DB的查询将是:

$query = $handler->query("SELECT id FROM your_table_name");

最后,要获得与查询匹配的行数,可以这样写:

$amountOfRows = $query->rowCount();

或者你可以这样写:

$query = $handler ->query("SELECT COUNT(id) FROM your_table_name");

$amountOfRows = $query->rowCount();

或者,如果你想知道表'products'中有多少产品的价格在10到20之间,写这样的查询:

$query = $handler ->query("SELECT id FROM products WHERE price BETWEEN 10 AND 
20");

$amountOfRows = $query->rowCount();

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

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;
}