6

code example;

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

Using prepare -> execute. If your sure the query will return max 1 row; is there a simple way to see if query did return a row? I see everyone validating on 'rowCount', but isn't there a cleaner way?

this article: http://www.christiansouth.com/php/pdo-getting-started-part-2-pdostatement/ states;

TRUE if the query was successful FALSE if it wasn’t. The stumble here is it will ONLY return FALSE if the SQL has an error. So if the SQL is valid but return no rowset you will still get a TRUE return value.

Is this statement correct? Because php.net only talks about:

Returns TRUE on success or FALSE on failure.

So, rapping up the questions again:

  • Is it true you can't validate if a row was returned using $stmt (in above example) as a boolean?
  • Is there any solution to this that looks cleaner then 'rowCount' rapped in an if?
4

3 回答 3

5

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

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

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

于 2012-11-15T02:35:44.817 回答
2

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

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

于 2012-11-15T02:22:52.523 回答
-3

使用 exec();

来自 PHP 手册:

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

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

于 2013-10-02T14:38:40.550 回答