有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。
fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。
你有什么建议吗?
有很多相互矛盾的说法。在PHP中使用PDO获得行数的最佳方法是什么?在使用PDO之前,我只是简单地使用了mysql_num_rows。
fetchAll是我不想要的东西,因为我有时可能要处理大型数据集,所以不适合我使用。
你有什么建议吗?
当前回答
当你在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;
}
其他回答
$sql = "SELECT count(*) FROM `table` WHERE foo = ?";
$result = $con->prepare($sql);
$result->execute([$bar]);
$number_of_rows = $result->fetchColumn();
这不是最优雅的方式,而且它涉及到一个额外的查询。
PDO有PDOStatement::rowCount(),这显然在MySql中不起作用。真痛苦。
来自PDO文档:
对于大多数数据库, PDOStatement::rowCount()没有 返回受影响的行数 SELECT语句。相反,使用 PDO::query()发出SELECT COUNT(*)语句 谓词作为您想要的SELECT 语句,然后使用 PDOStatement: fetchColumn () 检索需要的行数 被归还。您的应用程序可以 请执行正确的操作。
编辑:上面的代码示例使用了一个预处理语句,在许多情况下,这对于计数行的目的可能是不必要的,因此:
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
这是一个老帖子,但正在沮丧地寻找替代方案。非常不幸的是,PDO缺少这个特性,特别是PHP和MySQL往往是齐头并进的。
使用fetchColumn()有一个不幸的缺陷,因为当fetchColumn()将指针移动到下一行时,您不能再使用该结果集(有效地)。举个例子,如果你有一个类似于
水果- - - >香蕉 水果——>苹果 水果- - - >橙色
如果你使用fetchColumn(),你可以发现有3个水果返回,但如果你现在循环的结果,你只有两列,fetchColumn()的价格是损失的第一列结果,只是找出多少行被返回。这会导致草率的编码,如果实现的话,结果会完全错误。
所以现在,使用fetchColumn(),你必须实现一个全新的调用和MySQL查询,只是为了得到一个新的工作结果集。(希望自你上次提问以来没有改变),我知道,不太可能,但这是可能发生的。此外,所有行数验证上的双重查询的开销。对于这个例子来说,这是很小的,但是在一个连接查询上解析200万行,这不是一个令人愉快的代价。
我热爱PHP,支持每一个参与PHP开发的人,以及日常使用PHP的社区,但真的希望在未来的版本中能够解决这个问题。这是我对PHP PDO“真正”唯一的不满,否则它是一个伟大的类。
看看这个链接: http://php.net/manual/en/pdostatement.rowcount.php 不建议在SELECT语句中使用rowCount() !
这太迟了,但我遇到了一个问题,我这样做:
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类的定制扩展,其中有一个辅助函数,用于检索最后一个查询的“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();
}
}