The rowCount method does not seem to work with pdo_sqlite, maybe because it will not support forward-only cursors:
<?php
error_reporting(E_ALL+E_NOTICE);
$dsn = 'sqlite::memory:';
$pdo = new PDO($dsn);
$pdo->exec('CREATE TABLE foo(id varchar(11) NOT NULL, PRIMARY KEY(id))');
$pdo->exec("INSERT INTO foo(id) VALUES ('ffs')");
$sqlGet = 'SELECT * FROM foo WHERE id=:id';
$stmt = $pdo->prepare($sqlGet);
$id = 'ffs';
$stmt->bindParam(':id', $id, PDO::PARAM_STR);
$stmt->execute();
var_dump($stmt->rowCount(), count($stmt->fetchAll()));
?>
which outputs: 0 1
http://php.net/manual/en/function.sqlite-num-rows.php says sqlite_num_rows() cannot be used on unbuffered results; the explanation to the failure of the rowCount() method is probably along the same lines.
The workaround would be to use the count() function on a fetched result, but it might not be as efficient.
PDOStatement->rowCount
(No version information available, might be only in CVS)
PDOStatement->rowCount — Retourne le nombre de lignes affectées par le dernier appel à la fonction PDOStatement::execute()
Description
PDOStatement::rowCount() retourne le nombre de lignes affectées par la dernière requête DELETE, INSERT ou UPDATE exécutée par l'objet PDOStatement correspondant.
Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête. Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.
Valeurs de retour
Retourne le nombre de lignes.
Exemples
Exemple #1 Retourne le nombre de lignes effacées
PDOStatement::rowCount() retourne le nombre de lignes affectées par une requête DELETE, INSERT, ou UPDATE.
<?php
/* Effacement de toutes les lignes de la table FRUIT */
$del = $dbh->prepare('DELETE FROM fruit');
$del->execute();
/* Retourne le nombre de lignes effacées */
print("Retourne le nombre de lignes effacées :\n");
$count = $del->rowCount();
print("Effacement de $count lignes.\n");
?>
L'exemple ci-dessus va afficher :
Effacement de 9 lignes.
Exemple #2 Comptage des lignes retournées par une requête SELECT
Pour la plupart des bases de données, PDOStatement::rowCount() ne retourne pas le nombre de lignes affectées par une requête SELECT. À la place, utilisez PDO::query() pour faire une requête SELECT COUNT(*), puis utilisez PDOStatement::fetchColumn() pour récupérer le nombre de lignes retournées. Votre application peut ainsi effectuer la bonne action.
<?php
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
if ($res = $conn->query($sql)) {
/* Récupère le nombre de lignes qui correspond à la requête SELECT */
if ($res->fetchColumn() > 0) {
/* Effectue la vraie requête SELECT et travaille sur le résultat */
$sql = "SELECT nom FROM fruit WHERE calories > 100";
foreach ($conn->query($sql) as $row) {
print "Nom : " . $row['NOM'] . "\n";
}
}
/* Aucune ligne ne correspond -- faire quelque chose d'autre */
else {
print "Aucune ligne ne correspond à la requête.";
}
}
$res = null;
$conn = null;
?>
L'exemple ci-dessus va afficher :
apple banana orange pear
PDOStatement->rowCount
26-Dec-2007 04:10
14-Nov-2007 07:06
To Matt,
PDO is very similar in design to Perl's DBI which does allow you to set driver specific attributes such as mysql_client_found_rows=1 as part of the DSN.
PDO has a setAttribute() method, but afaik there is no
MYSQL_ATTR_CLIENT_FOUND_ROWS constant (yet). Hopefully some PDO developer will patch it in one day.
Setting that (at least in Perl and C) will make rowCount() return the number of rows selected for the update, not just the number of rows actually updated.
07-Oct-2007 09:22
Great, while using MySQL5, the only way to get the number of rows after doing a PDO SELECT query is to either execute a separate SELECT COUNT(*) query (or to do count($stmt->fetchAll()), which seems like a ridiculous waste of overhead and programming time.
Another gripe I have about PDO is its inability to get the value of output parameters from stored procedures in some DBMSs, such as SQL Server.
I'm not so sure I'm diggin' PDO yet.
10-Sep-2007 10:59
hipska at mac dot com : what you say is not correct.
The resulting $fruits cannot be used as an array, and count($fruits) always equals 1.
The confusion is however understandable, since foreach ($fruits->query($query) as $row){} will work, as with any array.
The most efficient way to retrieve number of rows found by SELECT in a portable application is probably to make a condition :
- Check that the current database system (get its name via getAttribute()), is one where rowCount() returns the number of rows found
1) If it does, there you have it
2) If it does not, execute an extra COUNT query.
21-Mar-2006 02:39
In some case you need to know how many row are retrieved from a select query (i.e to page a result set) you can use:
$totalRows = count($resultSet->fetchAll());
It works on MySQL 5.0.18 and PHP 5.1
30-Jan-2006 12:18
For large resultsets the method described below is not very efficient. It is better to do a select COUNT(*).
