【问题标题】:Detect if PDO->execute returns a row/record?检测 PDO->execute 是否返回行/记录?
【发布时间】:2012-11-03 15:28:39
【问题描述】:

代码示例;

$stmt = $db->prepare('SELECT u.username, u.display_name FROM users u WHERE u.id = :userId');
$stmt->bindValue(':userId', 10);
$stmt->execute();

使用准备 -> 执行。如果您确定查询将返回最多 1 行;有没有一种简单的方法来查看查询是否返回了一行?我看到每个人都在验证“rowCount”,但没有更清洁的方法吗?

本文:http://www.christiansouth.com/php/pdo-getting-started-part-2-pdostatement/ 州;

如果查询成功则为 TRUE,否则为 FALSE。这里的绊脚石 如果 SQL 有错误,它只会返回 FALSE。所以如果 SQL 是 有效但不返回任何行集,您仍将获得 TRUE 返回值。

这个说法正确吗?因为php.net只讲:

成功时返回 TRUE,失败时返回 FALSE。

所以,再次提出问题:

  • 您是否无法验证是否使用 $stmt(在上面的示例中)返回了一行 一个布尔值?
  • 是否有任何解决方案看起来更干净,然后在 if 中敲击“rowCount”?

【问题讨论】:

    标签: php pdo execute


    【解决方案1】:

    使用结果集(即fetch):是否存在一行?

    具有 0 条记录的结果集在“是否有效”方面仍然完全有效,这就是为什么在 每个 有效查询 execute'ed 上返回 TRUE。在这种情况下,FALSE 应仅被视为异常条件

    另一方面,来自(第一个)fetch 的结果 - 结合查询将仅返回 0..1 行的知识 - 可用于确定是否提取了单行。由于这是访问此类查询数据的“标准”方式,因此无需执行额外检查。

    【讨论】:

    • 所以我可以使用 $result = $stmt->fetch(PDO::FETCH_ASSOC); if ($result) //找到一行; ?
    • 从空结果集中获取将返回错误。当您已经在 rowCount() 的 $stmt 对象中拥有可用的 rowCount 时,我仍然不明白您为什么要这样做
    • @gview fetch 在空结果集上的 result 是什么? (提示:它是FALSE。)这是与execute 对空结果集(如果是有效查询,则为TRUE)的结果的单独 问题!这个特殊的问题不是要找出一般意义上返回了多少结果——这个特定查询/使用的结果集旨在返回 0..1 条记录(它是一个非使用单个键选择加入查询)。现在,也许有人认为代码应该“检查至多返回一条记录”,但是..我就把它留在那里。
    • @pst 我同意你的看法,鉴于问题的上下文,我认为你的回答没有问题。当您已经知道没有结果时,甚至没有必要进行提取,因为客户端已经从 rowCount() 中获得了该信息。我还可以争辩说 rowCount() 的优势在于它具有可能有价值的附加信息——例如预期只有 0..1 的结果实际上 > 1。
    【解决方案2】:

    只要您使用 mysql,rowCount 就会为您提供结果集中的数字,而无需进行其他查询。其他数据库可能无法准确支持 rowCount,因此您必须先进行单独的 select count(*) ... 查询。

    至于您在执行时是否只得到真或假,这绝对是真的,即使对于不返回任何行的查询也是如此。这是因为在关系理论中,空的结果集是完全有效的,没有行的选择不是错误。

    【讨论】:

      【解决方案3】:

      使用 exec();

      来自 PHP 手册:

      PDO::exec() 返回被您发出的 SQL 语句修改或删除的行数。如果没有行受到影响,PDO::exec() 返回 0。

      http://php.net/manual/en/pdo.exec.php

      【讨论】:

      • 我觉得它回答了这个问题:“是否有任何解决方案看起来更干净,然后 'rowCount' 在 if 中敲击?”
      • 你感觉不对。此外,您不能用 exec() 代替 execute()。坦率地说,您需要更多的经验来回答已经回答的问题。
      • 问题是关于 SELECT 语句的。而 exec 没有为它返回任何东西
      • 啊。看起来我应该更仔细地阅读我链接的 PHP 手册页和问题。我的错。谢谢指正。
      • 更深入地研究问题,掌握整个问题,而不是仅仅从上下文中挑选一个句子,可以看出 OP 不需要任何行数全部。正如在接受的答案中所述,返回的数据本身就绰绰有余了。
      猜你喜欢
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2023-04-10
      • 2019-11-27
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多