在select count(*)
声明之后使用时,PHP的PDO是否会为rowCount()
select
运行一个静默的$query = $conn->prepare('select name, alias from accounts where status = 0');
$query->execute();
$queryCount = $query->rowCount();
$profiles = $query->fetchAll(PDO::FETCH_ASSOC);
if($queryCount > 0) {
print_r($profiles);
} else {
echo 'No records found';
}
语句,或者它是否会得到它结果使用其他方法?
count
在上面的代码中,一切运行正常,我可以得到正确的行数作为结果。但那里有一个{{1}}语句吗? PHP如何做到这一点?
答案 0 :(得分:2)
这实际上取决于PDO数据库驱动程序。尽管手册说的是,它通常适用于MySQL连接。最近版本为mysqlnd
。可以使用PDO::MYSQL_ATTR_FOUND_ROWS
初始化旧版本和旧的libmysqlclient接口,以返回SELECT语句的行计数。
当您要求SELECT COUNT()
时,没有自动->rowCount()
重新查询。驱动程序在内部接收并保留uint64_t row_count;
。服务器响应几乎总是include a result row count for prepared statements。
对于->fetchAll
和迭代,PDO mysqlnd驱动程序甚至只需手动set->row_count++
计算它。
请查看https://github.com/php/php-src/blob/master/ext/mysqlnd/mysqlnd_result.c了解实际发生的情况。
较旧的mysql驱动程序调用{{3}},仅在获取所有行后才返回正确的结果计数。
答案 1 :(得分:0)
来自here:
示例#2计算SELECT语句返回的行
对于大多数数据库,PDOStatement :: rowCount()不返回 受SELECT语句影响的行数。
意味着:您可能不依赖于您目前实施的内容!
答案 2 :(得分:0)
没有。来自the docs:
对于大多数数据库,PDOStatement :: rowCount()不返回受SELECT语句影响的行数。相反,使用PDO :: query()发出带有与预期SELECT语句相同的谓词的SELECT COUNT(*)语句,然后使用PDOStatement :: fetchColumn()来检索将返回的行数。然后,您的应用程序可以执行正确的操作。
在弃用的PHP函数mysql_num_rows()中,使用了MySQL函数mysql_num_rows()。我想PDO也是如此。
可以找到更多信息here。
NB :这意味着您当前的代码可能在某些情况下有效,但您无法依赖它。改为使用COUNT(*)
查询。
答案 3 :(得分:-2)
来自PHP的文档:
PDOStatement :: rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。