行数与PDO

周围有许多相互矛盾的陈述。 在PHP中使用PDO进行排列计数的最佳方法是什么? 在使用PDO之前,我只是简单地使用了mysql_num_rows

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

你有什么build议吗?

 $sql = "SELECT count(*) FROM `table` WHERE foo = bar"; $result = $con->prepare($sql); $result->execute(); $number_of_rows = $result->fetchColumn(); 

不是最优雅的方法,再加上它涉及一个额外的查询。

PDO有PDOStatement::rowCount() ,这显然在MySql中不起作用。 太痛苦了

从PDO Doc:

对于大多数数据库,PDOStatement :: rowCount()不会返回受SELECT语句影响的行数。 相反,使用PDO :: query()来发出一个SELECT COUNT(*)语句,它与您想要的SELECT语句具有相同的谓词,然后使用PDOStatement :: fetchColumn()来检索将要返回的行数。 然后您的应用程序可以执行正确的操作。

编辑:上面的代码示例使用了一个准备好的语句,这在很多情况下可能是不必要的计数行的目的,所以:

 $nRows = $pdo->query('select count(*) from blah')->fetchColumn(); echo $nRows; 

正如我以前在类似问题的答案中所写的那样, mysql_num_rows()工作的唯一原因是因为它在内部获取所有行以提供这些信息,即使它看起来不像你。

所以在PDO中,你的select是:

  1. 使用MySQL的FOUND_ROWS()函数。
  2. 使用PDO的fetchAll()函数将所有行提取到一个数组中,然后使用count()
  3. 按照karim79的build议,对SELECT COUNT(*)做一个额外的查询。

这是超晚,但我遇到了问题,我这样做:

 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之前,我只是简单地使用了mysql_num_rows()

本来不应该使用它

mysql_num_rows() ,以及PDOStatement::rowCount()意味着你已经select了你的数据。 在这种情况下,这种function只有两种可能的用例:

  1. 你只是select你的数据来计算。
  2. 你想知道你的查询是否返回任何行。

前者不应该被使用。 一个人不应该select行来计算它们,因为你的服务器确实可能会由于返回的大数据集而窒息。

此外,select行来计算它们根本没有意义。 一个count(*)查询必须运行, 只返回一行。

第二个用例不是灾难性的,而是毫无意义的:如果你需要知道你的查询是否返回了任何数据,你总是有数据本身!

说,如果你只select一行,然后只是取它,并检查结果:

 $stmt->execute(); $row = $stmt->fetch(); if ($row) { // here! as simple as that } 

如果你需要得到很多行,那么你可以使用fetchAll()

fetchAll()是我不想要的,因为我有时可能会处理大型数据集

请注意,在Web应用程序中,您不应该select大量的行。 只有在网页上实际使用的行应被选中。 为此,必须使用SQL中的LIMIT或类似的子句。 而对于如此适量的数据,使用fetchAll()

在这种罕见的情况下,当你需要select一个真正的大量的行(例如在一个控制台应用程序中)时,为了减less使用的内存量,你必须使用一个无缓冲的查询, 但是在这种情况下, rowCount()不pipe怎么说 ,这个function也没有用。

所以你看,没有使用情况下的rowCount()也没有一个额外的查询来代替它,如接受的答案中所build议的。

我结束了使用这个:

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

这篇文章是旧的,但在PDO中获取行数很简单

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

这是一个旧的post,但越来越沮丧寻找替代品。 PDO缺乏这个function是非常不幸的,特别是PHP和MySQL往往并驾齐驱。

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

  1. 水果 – >香蕉
  2. 水果 – >苹果
  3. 水果 – >橙色

如果你使用fetchColumn(),你可以发现返回了3个水果,但是如果你现在循环遍历结果,你只有两列,fetchColumn()的价格就是第一列结果的丢失出了多less行返回。 这导致编码潦草,如果执行完全错误的结果。

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

我非常喜欢PHP,并且每天都会使用PHP来支持所有参与开发的人员以及社区,但是真的希望在将来的版本中能够解决这个问题。 这是“真正”我唯一的PHP PDO的投诉,否则是一个伟大的类。

如果你只是想获得行数(而不是数据),即。 在准备好的语句中使用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) 

实际上检索所有的行(数据)来执行一个简单的计数是浪费资源。 如果结果集很大,服务器可能会窒息。

回答这个问题是因为我现在知道这件事情,所以我陷入了困境,也许它会有用。

请记住,你不能两次获取结果。 您必须将提取结果保存到数组中,通过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 } } 

看看这个链接: http : //php.net/manual/en/pdostatement.rowcount.php不build议在SELECT语句中使用rowCount()!

当它是如何计算得到PHP PDO表中的多less行的问题,我使用这个

 // 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

这是一个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(); } } 

一个快速的class轮,以获得第一个入口返回。 这非常适合非常基本的查询。

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

参考

我试过$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):"&nbsp;")."</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; 

对于需要特定行的直接查询,并想知道是否find,我使用如下所示:

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

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

 function getRowCount($q){ global $db; return $db->query(preg_replace('/SELECT [A-Za-z,]+ FROM /i','SELECT count(*) FROM ',$q))->fetchColumn(); } $numRows = getRowCount($query); 
 $qry = "select * from tabel"; $cmd = $conn->prepare($qry); $cmd->execute(); $cmd->rowCount() 

当你在你的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语句计算的整数,这个整数有点长,但是要快速执行

编辑:抱歉的错误的职位,但作为一些例子显示查询与计数,我build议使用MySQL的结果,但如果你不使用计数在SQL fetchAll()是有效的,如果你保存结果的variables你不会放松一条线。

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

count($table)将返回行的数量,你仍然可以像使用$row = $table[0]或使用一个foreach

 foreach($table as $row){ print $row->id; } 
 <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:

Usen parametro 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;