【问题标题】:Work-around for PHP5's PDO rowCount MySQL issuePHP5 的 PDO rowCount MySQL 问题的解决方法
【发布时间】:2010-10-02 09:07:39
【问题描述】:

我最近开始使用 PHP5 开发一个新项目,并希望使用他们的 PDO 类。问题是 MySQL PDO 驱动程序不支持 rowCount() 因此无法运行查询然后获取受影响的行数或返回的行数,就我而言,这是一个相当大的问题。我想知道以前是否有其他人处理过这个问题,以及你为解决这个问题做了什么。必须执行 fetch() 或 fetchAll() 来检查是否有任何行受到影响或返回对我来说似乎是一种 hack,我宁愿只执行 $stmt->numRows() 或类似的东西。

【问题讨论】:

  • 这在 PHP 5.4 中似乎不是问题。谁能确认一下?

标签: php pdo


【解决方案1】:

这个问题是基于几个错误的假设和一个过时的陈述。

首先,不要混淆受影响选择行的数量。 PDO 早在 09 年就支持前者。

说到 SELECT 语句返回的行数 - 你只是不需要那个数字。你有数据就够了。

是的,现在rowCount() 也支持从 mysql 中选择的行数。但同样 - 在一般的网络应用程序中你不需要这个数字。

【讨论】:

  • “你只是不需要那个数字。你拥有的数据就足够了”。哦,我的.. 翻译为“您不需要电子邮件地址。拥有一个网站就足够了!”我几乎总是需要这个数字,并且当我可以只计算查询本身时避免进行多个 COUNT 查询。如果是这种情况,最好告诉用户“没有找到任何条目”,而不是仅仅循环 NOTHING。 (另外,当使用 while 循环时,您无法检查 fetch() 是否返回 true)
【解决方案2】:

对于那些使用 MySQL 存储过程的人来说,这个解决方案并不可行。我建议您做的是让您的存储过程创建两个行集。第一个将包含一行和一列,包含记录数。第二个是您将用于获取该行数的记录集。

无限行数可以是带有完全相同的WHERE 子句的SELECT COUNT(*) 与没有LIMIT/OFFSET 子句的第二行集。

另一个想法可能是创建一个临时表。使用您的SELECT 语句填充临时表。然后您可以将SELECT COUNT(*) FROM tmpTable 用于您的第一个行集,将SELECT * FROM tmpTable 用于您的第二个行集。

【讨论】:

  • 你不觉得使用临时表来获取这么一个无用的数字有点矫枉过正吗?
【解决方案3】:

您可以在原始SELECT 查询之后立即发出SELECT FOUND_ROWS() 查询以获取行数。

$pdo->query("SELECT * FROM users");
$foundRows = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();

另请参阅:MySQL Docs on FOUND_ROWS()

【讨论】:

  • 一个问题,rowCount() 对我很有效,也适用于 SELECT 语句。自从回答了这个问题后,这是否已实施?
  • @Imran rowCount() 对我来说也适用于 select 以及像 SHOW TABLES LIKE '<tablename>' 查询这样的查询。我正在使用 PHP 5.2.6。不知道我的 Pecl 版本。如何检查? PHP 5.2.6+ 会不会有问题?发现这个问题 - stackoverflow.com/questions/769767/…
  • rowCount() 仅在您之前执行了 fetchAll() 时才能正常工作,但如果您正在使用 fetch() 则不能正常工作(这样会消耗更少的内存)
  • 这是一个糟糕的答案,因为它需要两个查询而不是一个,并且第一个查询可能是全表扫描。很多时候,您只想知道是否存在某个示例,例如用户名冲突。使用 SELECT...LIMIT 1 然后查看结果集是否超过零行比 COUNT(*) 快得多。我依赖于 MySQL 的 rowCount(),但在任何获取之前执行它。您无需在 rowCount 之前 fetchAll 即可显示正确数量的 SELECT 结果。
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多