Answers:
$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语句相同的谓词的SELECT COUNT(*)语句,然后使用PDOStatement :: fetchColumn()检索将返回的行数。然后,您的应用程序可以执行正确的操作。
编辑:上面的代码示例使用一个准备好的语句,在许多情况下,出于计数行的目的可能是不必要的,因此:
$nRows = $pdo->query('select count(*) from blah')->fetchColumn();
echo $nRows;
fetchColumn()
返回一个字符串“1234” ......您的编辑echo count($nRows);
- count()
是一个数组功能:P。我也建议将结果类型强制转换为fetchColumn()
整数。$count = (int) $stmt->fetchColumn()
正如我先前在回答类似问题时所写的那样,mysql_num_rows()
起作用的唯一原因是因为它是在内部获取所有行以为您提供该信息,即使您看起来不喜欢它也是如此。
因此,在PDO中,您可以选择:
FOUND_ROWS()
功能。fetchAll()
功能将所有行提取到数组中,然后count()
在其上使用。SELECT COUNT(*)
根据karim79的建议,对进行额外的查询。由于经常发生,这个问题令人困惑。人们来到这里时会想到两个不同的任务:
这是两个绝对不同的任务,没有共同点,无法由同一功能解决。具有讽刺意味的是,对于它们两个都不使用实际PDOStatement::rowCount()
功能。
让我们看看为什么
在使用PDO之前,我只是简单地使用过
mysql_num_rows()
。
意味着您已经做错了。就消耗服务器资源而言,使用mysql_num_rows()
或rowCount()
计算表中的行数是一个真正的灾难。数据库必须从磁盘读取所有行,消耗数据库服务器上的内存,然后将所有这些数据堆发送到PHP,同时也消耗PHP进程的内存,这绝对没有理由负担服务器的负担。
此外,仅选择行以对其进行计数根本没有意义。一个count(*)
查询必须改为运行。该数据库将数记录列的索引,而不读取实际的行,然后只有一个返回行。
为此,接受的答案中建议的代码是公平的。
第二种用例并不是那么灾难性的,而是毫无意义的:如果您需要知道查询是否返回了任何数据,那么您总是拥有数据本身!
说,如果您只选择一行。好的,您可以将提取的行用作标志:
$stmt->execute();
$row = $stmt->fetch();
if (!$row) { // here! as simple as that
echo 'No data found';
}
如果您需要获得许多行,则可以使用fetchAll()
。
fetchAll()
这是我不想要的东西,因为有时可能要处理大型数据集
是的,当然,在第一个用例中,它的损坏率是原来的两倍。但是,正如我们已经了解到的那样,就是不要只选择行来对它们进行计数,也不能不使用rowCount()
或fetchAll()
。
但是,如果您要实际使用所选的行,则使用没什么错fetchAll()
。请记住,在Web应用程序中,绝对不要选择大量的行。只有这样才能在网页上实际使用的行应选择,因此你一定要使用LIMIT
,WHERE
或在您的SQL类似的条款。对于如此少量的数据,就可以使用fetchAll()
。同样,只需在以下条件下使用此函数的结果:
$stmt->execute();
$data = $stmt->fetchAll();
if (!$data) { // again, no rowCount() is needed!
echo 'No data found';
}
当然,运行一个额外的查询只是为了告诉您其他查询是否返回了任何行,这绝对是疯狂的做法,正如两个最佳答案中所建议的那样。
在这种罕见的情况下,当您需要选择大量的行(例如在控制台应用程序中)时,必须使用无缓冲查询,以减少所使用的内存量。但是,这是在实际情况下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缺少此功能,尤其是在PHP和MySQL趋于齐头并进的情况下。
不幸的是,使用fetchColumn()有一个缺陷,因为当fetchColumn()将指针移至下一行时,您将无法再有效地使用该结果集。例如,如果您得到的结果类似于
如果使用fetchColumn(),您会发现返回了3个水果,但是如果现在循环遍历结果,则只有两列,而fetchColumn()的价格就是结果第一列的损失返回多少行。这导致草率的编码,并且如果实施的话,将导致完全出错的结果。
因此,现在,必须使用fetchColumn()来实现一个全新的调用和MySQL查询,以获取新的工作结果集。(希望自您上次查询以来没有改变),我知道,虽然不太可能,但它可能会发生。同样,在所有行计数验证中双重查询的开销。在此示例中,这很小,但是在联接的查询上解析了200万行,这并不是一个合理的代价。
我热爱PHP,并支持参与其开发的每个人以及整个社区每天使用PHP,但确实希望在以后的版本中能够解决此问题。这是我对PHP PDO的唯一抱怨,“否则”这是一个很棒的课程。
回答这个问题是因为我现在就知道了这一点,因此陷入了困境,也许它会很有用。
请记住,您无法两次获取结果。您必须将提取结果保存到数组中,将行计数为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
}
}
如果您只想获取行数(而不是数据),即。在准备好的语句中使用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)
实际上检索所有行(数据)以执行简单计数是浪费资源。如果结果集很大,则服务器可能会阻塞。
看看这个链接:http : //php.net/manual/en/pdostatement.rowcount.php 不建议在SELECT语句中使用rowCount()!
要在查询中使用变量,您必须使用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
当它是物质的mysql如何计算或得到多少表中的行与PHP PDO我用这个
// count total number of rows
$query = "SELECT COUNT(*) as total_rows FROM sometable";
$stmt = $con->prepare($query);
// execute query
$stmt->execute();
// get total rows
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['total_rows'];
学分归于Mike @ codeofaninja.com
我尝试$count = $stmt->rowCount();
使用Oracle 11.2,但无法正常工作。我决定使用如下所示的for循环。
$count = "";
$stmt = $conn->prepare($sql);
$stmt->execute();
echo "<table border='1'>\n";
while($row = $stmt->fetch(PDO::FETCH_OBJ)) {
$count++;
echo "<tr>\n";
foreach ($row as $item) {
echo "<td class='td2'>".($item !== null ? htmlentities($item, ENT_QUOTES):" ")."</td>\n";
} //foreach ends
}// while ends
echo "</table>\n";
//echo " no of rows : ". oci_num_rows($stmt);
//equivalent in pdo::prepare statement
echo "no.of rows :".$count;
有一个简单的解决方案。如果您使用PDO像这样连接到数据库:
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();
}
然后,对数据库的查询将是:
$query = $handler->query("SELECT id FROM your_table WHERE ...");
最后,要计算与查询匹配的行,如下所示
$amountOfRows = $query->rowcount();
fetchColumn()
如果要获取记录数则使用[effisien]
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
$res = $conn->query($sql);
$count = $res->fetchColumn(); // ex = 2
查询()
如果要检索数据和记录计数[选项],则使用
$sql = "SELECT * FROM fruit WHERE calories > 100";
$res = $conn->query($sql);
if ( $res->rowCount() > 0) {
foreach ( $res as $row ) {
print "Name: {$row['NAME']} <br />";
}
}
else {
print "No rows matched the query.";
}
当您在mysql语句中输入COUNT(*)时,例如
$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]
或使用a 之后使用结果foreach
foreach($table as $row){
print $row->id;
}
这是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();
}
}
<table>
<thead>
<tr>
<th>Sn.</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<?php
$i=0;
$statement = $db->prepare("SELECT * FROM tbl_user ORDER BY name ASC");
$statement->execute();
$result = $statement->fetchColumn();
foreach($result as $row) {
$i++;
?>
<tr>
<td><?php echo $i; ?></td>
<td><?php echo $row['name']; ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
使用参数 array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
,否则显示-1:
用例参数 array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)
,sin ello sale -1
例:
$res1 = $mdb2->prepare("SELECT clave FROM $tb WHERE id_usuario='$username' AND activo=1 and id_tipo_usuario='4'", array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$res1->execute();
$count=$res1->rowCount();
echo $count;