1

我正在将 PHP 中与 mysql 相关的所有内容转换为 PDO 格式。话虽如此,我需要问一些事情。

我知道不是使用 mysql_num_rows() 来找出返回的行数,一个好的选择是

"SELECT COUNT(*) FROM table"

那么,使用 PDO 是否更好:

$stmt = $db->query('SELECT COUNT(*) FROM table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = count($results);

或者

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

谢谢

4

4 回答 4

1

我不会说这是“一个很好的选择”。这是完全不同的东西。

    SELECT data FROM table

获取您可以使用的数据。然后,您可以使用mysql_num_rows()(或rowCount()在 PDO 情况下)获取记录数(用于渲染、分页或其他)。

如果您只想要记录数(而不是实际数据),您应该使用

    SELECT COUNT(data) FROM table

因为您只选择记录(准确地说,您正在计算 的非 NULL 值data,用于SELECT COUNT(*)获取所有记录)。

如果您将后者与前者结合使用以获得两者,那么当两个查询之间的记录数发生变化时,您可能会遇到麻烦。

于 2013-01-17T08:33:01.830 回答
1

你的问题对我来说毫无意义。
正如您已经知道的那样,仅向数据库询问行比询问所有行本身然后将​​它们数出要好得多 - 如果您只使用不同的 db 驱动程序,您为什么认为会是这样?

从字面上回答您的问题:SELECT COUNT(*)这不是一个“好的选择”,而是计算行数的唯一正确方法,无论使用什么特定的 API 将查询发送到数据库。

然而,正如评论中指出的那样——如果你已经在选择行,并且想知道返回的行数——那就完全相反了:运行一个额外的查询来获取计数是没有意义的,任何 API 函数获取结果集的行数将是唯一正确的方法。
但无论如何,这些问题与从一个 API 迁移到另一个 API 无关。

更新
啊哈,看来我找到了你困惑的根源!
看起来你被旧的 API 弄错了,它与数据库服务器共享它的名称 - mysql。
事实上,这是不同的问题 - MySQL RDBMS 是一个数据库服务器,而 PHP 中的 mysql 扩展只是一个访问该服务器的 API(一组函数)。
而且 PDO 不是数据库服务器,而是另一个 API。因此,您的查询没有变化,而只是在您用来将它们发送到 DB 的函数中。希望能帮助到你。

于 2013-01-17T08:24:15.563 回答
0

SELECT COUNT没有 a 的AGROUP BY将始终只返回 1 行和 1 个字段,即符合您的条件的行的总数COUNT,在这种情况下就是所有内容。count()因此,对该结果执行 PHP将始终返回1,因为$results数组中只有 1 个元素。因此,这两个选项中的选项 2 是唯一有效的选项。

于 2013-01-17T08:22:52.610 回答
0

最好是这个

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

编辑:删除计数。

于 2013-01-17T08:23:18.473 回答