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

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

你有什么建议吗?


当前回答

最后我用了这个:

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

其他回答

当你在mysql语句中使用COUNT(*)时,比如in

$q = $db->query("SELECT COUNT(*) FROM ...");

你的mysql查询已经在计算结果的数量,为什么在php中再次计数?来获得mysql的结果

$q = $db->query("SELECT COUNT(*) as counted FROM ...");
$nb = $q->fetch(PDO::FETCH_OBJ);
$nb = $nb->counted;

$nb将包含你在mysql语句中计算的整数 写起来有点长,但执行起来很快

编辑: 对不起,错误的帖子,但作为一些例子显示查询与计数在,我建议使用mysql的结果,但如果你不使用计数在sql fetchAll()是有效的,如果你保存在一个变量的结果,你不会失去一行。

$data = $dbh->query("SELECT * FROM ...");
$table = $data->fetchAll(PDO::FETCH_OBJ);

Count ($table)将返回行数,您仍然可以使用像$row = $table[0]或使用foreach后的结果

foreach($table as $row){
  print $row->id;
}

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

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连接到你的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();

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

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

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

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

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

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

要在查询中使用变量,必须使用bindValue()或bindParam()。并且不要将变量与"连在一起。$variable。”

$statement = "SELECT count(account_id) FROM account
                  WHERE email = ? AND is_email_confirmed;";
$preparedStatement = $this->postgreSqlHandler->prepare($statement);
$preparedStatement->bindValue(1, $account->getEmail());
$preparedStatement->execute();
$numberRows= $preparedStatement->fetchColumn();

GL