From the PDO manual:
PDOStatement::rowCount() returns the
number of rows affected by the last
DELETE, INSERT, or UPDATE statement
executed by the corresponding
PDOStatement object.
If the last SQL statement executed by
the associated PDOStatement was a
SELECT statement, some databases may
return the number of rows returned by
that statement. However, this
behaviour is not guaranteed for all
databases and should not be relied on
for portable applications.
I found that out only very recently. I had just changed my db abstraction layer to not use SELECT COUNT(1) ...
anymore, because just quering the actual rows and then counting the result would be much more efficient. And now PDO doesn't support that!?
I don't use PDO for MySQL and PgSQL, but I do for SQLite. Is there a way (without completely changing the dbal back) to count rows like this in PDO? In MySQL, this would be something like this:
$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
With the MySQLi and PgSQL drivers, this is possible. With all PDO it isn't!?
PS. My initial solution was to extend the SQLResult->count method (my own) to replace SELECT ... FROM
by SELECT COUNT(1) FROM
and just return that number (very inefficient, but only for SQLite PDO). That's not good enough though, because in the example query above is a GROUP BY
, which would change the meaning/function of the COUNT(1)
.
Question&Answers:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…