downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

PDOStatement::setAttribute> <PDOStatement::nextRowset
[edit] Last updated: Fri, 24 May 2013

view this page in

PDOStatement::rowCount

(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)

PDOStatement::rowCount Devuelve el número de filas afectadas por la última sentencia SQL

Descripción

int PDOStatement::rowCount ( void )

PDOStatement::rowCount() devuelve el número de filas afectadas por la última sentencia DELETE, INSERT, o UPDATE ejecutada por el correspondiente objeto PDOStatement.

Si la última sentencia SQL ejecutada por el objeto PDOStatement asociado fue una sentencia SELECT, algunas bases de datos podrían devolver el número de filas devuelto por dicha sentencia. Sin embargo, este comportamiento no está garantizado para todas las bases de datos y no debería confiarse en él para aplicaciones portables.

Valores devueltos

Devuelve el número de filas.

Ejemplos

Ejemplo #1 Devolver el número de filas eliminadas

PDOStatement::rowCount() devuelve el número de filas afectadas por una sentencia DELETE, INSERT, o UPDATE.

<?php
/* Borrar todas las filas de la tabla FRUIT */
$del $gbd->prepare('DELETE FROM fruit');
$del->execute();

/* Devolver el número de filas que fueron eliminadas */
print("Devolver el número de filas que fueron eliminadas:\n");
$cuenta $del->rowCount();
print(
"Eliminadas $cuenta filas.\n");
?>

El resultado del ejemplo sería:

Devolver el número de filas que fueron eliminadas:
Eliminadas 9 filas.

Ejemplo #2 Contar las filas devueltas por una sentencia SELECT

Para muchas bases de datos, PDOStatement::rowCount() no devuelve el número de filas afectadas por una sentencia SELECT. En su lugar, use PDO::query() para ejecutar una sentencia SELECT COUNT(*) con las mismas declaraciones que la sentencia SELECT pretendida, luego use PDOStatement::fetchColumn() para recuperar el número de filas que serán devueltas. La aplicación podrá entonces realizar la acción correcta.

<?php
$sql 
"SELECT COUNT(*) FROM fruit WHERE calories > 100";
if (
$resultado $conexión->query($sql)) {

    
/* Comprobar el número de filas que coinciden con la sentencia SELECT */
  
if ($resultado->fetchColumn() > 0) {

        
/* Ejecutar la sentencia SELECT real y trabajar con los resultados */
         
$sql "SELECT name FROM fruit WHERE calories > 100";
       foreach (
$conexión->query($sql) as $fila) {
           print 
"Nombre: " .  $fila['NAME'] . "\n";
         }
    }
    
/* No coincide ningua fila -- hacer algo en consecuencia */
  
else {
      print 
"Ninguna fila coincide con la consulta.";
    }
}

$resultado null;
$conexión null;
?>

El resultado del ejemplo sería:

apple
banana
orange
pear

Ver también



PDOStatement::setAttribute> <PDOStatement::nextRowset
[edit] Last updated: Fri, 24 May 2013
 
add a note add a note User Contributed Notes PDOStatement::rowCount - [12 notes]
up
5
leandro at marquesini dot com
1 year ago
To display information only when the query is not empty, I do something like this:

<?php
    $sql
= 'SELECT model FROM cars';
   
$stmt = $db->prepare($sql);
   
$stmt->execute();
   
    if (
$data = $stmt->fetch()) {
        do {
            echo
$data['model'] . '<br>';
        } while (
$data = $stmt->fetch());
    } else {
        echo
'Empty Query';
    }
?>
up
3
Ome Ko
1 year ago
When updating a Mysql table with identical values nothing's really affected so rowCount will return 0. As Mr. Perl below noted this is not always preferred behaviour and you can change it yourself since PHP 5.3.

Just create your PDO object with
<? php
$p
= new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
?>
and rowCount() will tell you how many rows your update-query actually found/matched.
up
2
Daniel Karp
8 months ago
Note that an INSERT ... ON DUPLICATE KEY UPDATE statement is not an INSERT statement, rowCount won't return the number or rows inserted or updated for such a statement.  For MySQL, it will return 1 if the row is inserted, and 2 if it is updated, but that may not apply to other databases.
up
2
gunnrosebutpeace at gmail dot com
4 years ago
It'd better to use SQL_CALC_FOUND_ROWS, if you only use MySQL. It has many advantages as you could retrieve only part of result set (via LIMIT) but still get the total row count.
code:
<?php
$db
= new PDO(DSN...);
$db->setAttribute(array(PDO::MYSQL_USE_BUFFERED_QUERY=>TRUE));
$rs  = $db->query('SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 5,15');
$rs1 = $db->query('SELECT FOUND_ROWS()');
$rowCount = (int) $rs1->fetchColumn();
?>
up
2
Matt
5 years ago
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.
up
1
dcahh at gmx dot de
1 year ago
It's pretty obvious, but might save one or the other from bug tracking...

Alltough rowCount ist returned by the statement, one has to execute the statement before rowCount returns any results...

Does not work
<?php
    $statement
= $dbh->prepare('SELECT FROM fruit');
   
$count = $statement->rowCount();
?>

Works
<?php
    $statement
= $dbh->prepare('SELECT FROM fruit');
   
$statement->execute();
   
$count = $statement->rowCount();
?>
up
-1
e dot sand at elisand dot com
4 years ago
My rowCount() workaround & how it's used:

<?php
class MyPDO extends PDO {
    private
$queryString;

    public function
query(/* ... */) {
       
$args = func_get_args();
       
$this->queryString = func_get_arg(0);

        return
call_user_func_array(array(&$this, 'parent::query'), $args);
    }

    public function
rowCount() {
       
$regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/i';
        if (
preg_match($regex, $this->queryString, $output) > 0) {
           
$stmt = parent::query("SELECT COUNT(*) FROM {$output[1]}", PDO::FETCH_NUM);

            return
$stmt->fetchColumn();
        }

        return
false;
    }
}

$pdo = new MyPDO("sqlite::memory:");
$result = $pdo->query("SELECT row1, row2 FROM table WHERE something = 5");

if (
$pdo->rowCount() > 0) {
    echo
"{$result['row1']}, {$result['row2']}";
}
?>
up
0
Mike Robinson
3 months ago
Please note that using PDOStatement::rowCount with a MySQL SELECT statement returns the number of rows found by that statement, not the number of rows affected (which would obviously be 0).
up
0
e dot sand at elisand dot com
4 years ago
As of SQLite 3.x, the SQLite API itself changed and now all queries are implemented using "statements".  Because of this, there is no way for PDO to know the rowCount of a SELECT result because the SQLite API itself doesn't offer this ability.

As a workaround, I created my own rowCount() function - it's a bit of a hack and hasn't been fully tested yet (I don't know how it will work when using JOINs in SELECTs, etc...), but at least alleviates the necessity for SELECT COUNT(*)'s everywhere in your code.

I would have preferred if it were possible to overload the rowCount() function from PDOStatement, but I don't think it's possible (or I don't know how to do it).  There's also potential room for a bit more security ensuring that $queryString is wiped clean after other query()s so that you don't get a bad result, etc...

The actual code should be posted in the above/below post (max post limits, argh!).  If others wish to extend/perfect this method, please keep me posted with an email as to what you've done.
up
0
Anonymous
5 years ago
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.
up
0
Mr. Perl
5 years ago
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.
up
-1
php at alishabeth dot com
4 years ago
It appears that rowCount behavior is different on Mysql 5.0 vs 5.1.  Here's the test I ran:

<?php
$db
= new PDO('mysql:host=localhost;dbname=test','test','test');
$sql = "SELECT 1";
$st = $db->prepare($sql);
$st->execute();
print_r($st->rowCount());
?>

Mysql 5.0.45, PHP 5.2.5 returned 1

Mysql 5.1.30, PHP 5.1.6 returned 0

I know... I need to test against same php versions... buy I'm getting lazy...

 
show source | credits | sitemap | contact | advertising | mirror sites