有很多相互矛盾的说法。在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;
}

其他回答

当你在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;

你可以将最好的方法合并到一行或函数中,并自动生成新的查询:

function getRowCount($q){ 
    global $db;
    return $db->query(preg_replace('/SELECT [A-Za-z,]+ FROM /i','SELECT count(*) FROM ',$q))->fetchColumn();
}

$numRows = getRowCount($query);

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

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

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

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

参考