Rud*_*die 44 php database sqlite pdo
从PDO手册:
PDOStatement :: rowCount()返回 由相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响 的行数.
如果关联的PDOStatement执行的最后一个SQL语句是 SELECT语句,则某些数据库可能会返回该语句返回的行数.但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序.
我最近才发现这一点.我刚刚将我的数据库抽象层更改为不再使用SELECT COUNT(1) ...
,因为只是查询实际的行然后计算结果会更有效率.现在PDO不支持!?
我没有将PDO用于MySQL和PgSQL,但我是为SQLite做的.有没有办法(没有完全改变dbal背部)在PDO中计算这样的行?在MySQL中,这将是这样的:
$q = $db->query('SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele');
$rows = $q->num_rows;
// and now use $q to get actual data
Run Code Online (Sandbox Code Playgroud)
使用MySQLi和PgSQL驱动程序,这是可能的.所有的PDO都不是!?
PS.我的初始解决方案是扩展SQLResult-> count方法(我自己的)以替换为SELECT ... FROM
,SELECT COUNT(1) FROM
并且只返回该数字(非常低效,但仅适用于SQLite PDO).但这还不够好,因为在上面的示例查询中是a GROUP BY
,这会改变其含义/功能COUNT(1)
.
Rob*_*mer 44
这是您的解决方案
$sql="SELECT count(*) FROM [tablename] WHERE key == ? ";
$sth = $this->db->prepare($sql);
$sth->execute(array($key));
$rows = $sth->fetch(PDO::FETCH_NUM);
echo $rows[0];
Run Code Online (Sandbox Code Playgroud)
mje*_*jec 24
它有点内存效率低但是如果你还在使用数据,我经常使用它:
$rows = $q->fetchAll();
$num_rows = count($rows);
Run Code Online (Sandbox Code Playgroud)
我最终使用的方法非常简单:
$query = 'SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele';
$nrows = $db->query("SELECT COUNT(1) FROM ($query) x")->fetchColumn();
Run Code Online (Sandbox Code Playgroud)
可能不是最有效的,但它似乎是万无一失的,因为它实际上计算了原始查询的结果.