【问题标题】:Why won't this mysql query work?为什么这个 mysql 查询不起作用?
【发布时间】:2011-10-22 10:29:02
【问题描述】:

我有这个问题:

$q = $dbc -> prepare("SELECT * FROM mailbox WHERE msgTo = ? && read = 0");
$q -> execute(array($user['id']));
$mailboxCount = $q -> rowCount();

现在我的桌子上有

msgTo = 1, read = 0

$user['id'] 等于 1

但是行数返回0,这是为什么呢?

【问题讨论】:

  • rowCount 不能保证与 select 一起使用。

标签: mysql rowcount


【解决方案1】:

来自Manual

PDOStatement->rowCount — 返回受 最后一条 SQL 语句

PDOStatement::rowCount() 返回受 最后一个 DELETE、INSERT 或 UPDATE 语句由相应的 PDOStatement 对象。

看到这个example并写得很清楚

对于大多数数据库,PDOStatement::rowCount() 不返回 受 SELECT 语句影响的行数。相反,使用 PDO::query() 以相同的方式发出 SELECT COUNT(*) 语句 谓词作为您预期的 SELECT 语句,然后使用 PDOStatement::fetchColumn() 检索将要执行的行数 被退回。

【讨论】:

  • 请查看示例并阅读手册。最好的教训是自己学到的。 :)
  • 我还有其他带有行数的 SELECT 语句并且它们执行成功?这是为什么?
【解决方案2】:

恕我直言,rowCount() 仅匹配 UPDATE 和 DELETE 语句,而不匹配 SELECT 查询。通过选择 * 您从数据库中获取所有数据。由于您只需要行数,因此请改用 count() 函数 - 这样效率更高。

SELECT count(*) FROM mailbox WHERE msgTo = ? && read = 0

【讨论】:

  • 更改是使用 COUNT 函数,而不是选择所有行并计算它们。如果您实际上并没有使用数据,而只是想知道有多少行,那么计数比实际提取所有数据要高效得多。
  • 如何从查询中获取 count 变量?
  • @Dan Bizdadea 不过更好,我应该用这个,效率更高
  • 我同意更好的部分 :) 我本来打算对 Erik 的帖子投反对票,但比我播种计数(*)并重新考虑。但是,他仍然忽略了为什么你的函数返回 0
猜你喜欢
  • 2011-05-04
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多