Thursday, April 28, 2011

PHP/PDO: use simple prepared statement with query return/affected rows?

I am new to PDO objects and cannot find a single piece of documentation that will help me. Say I got a simple code to delete a row:

$count = $dbh->exec("DELETE FROM fruit WHERE colour = 'red'");

That will return affected rows, but how would I use prepared statements with that? Can use use $dbh->prepare AND $dbh->exec or query !?

From stackoverflow
  • $dbh->prepare returns a PDOStatement object. You then call $stmt->execute to get the result.

    More info in the PDO manual

    Here's an example from the manual:

    <?php
    /* Execute a prepared statement by passing an array of insert values */
    $calories = 150;
    $colour = 'red';
    $stmt = $dbh->prepare('SELECT name, colour, calories
                           FROM fruit
                           WHERE calories < ? AND colour = ?');
    $stmt->execute(array($calories, $colour));
    ?>
    
    John : But how would I return number of rows affected? Can I use it like in my example, `$count = $stmt->execute`? EDIT: someone else answered it.
  • It should be the same as any other statement:

    $stmt = $dbh->prepare("DELETE FROM fruit WHERE colour = ?");
    $stmt->execute(array('red'));
    $count = $stmt->rowCount();
    

    The PDO Statement rowCount() should be what you are looking to do.

    EDIT

    Fixed by adding the ->rowCount() which will return the row count. ->execute in a statement will return a bool, true or false whether the query errored out or not. Of course all of this information is readily available at the PDO Statement Manual

    John : So `->execute` can return affected rows too, this is exactly what I needed. Thank you!
    Brad F Jacobs : No, I had an error before. The manual states that `->execute` returns a bool, but looking at the other functions in the manual, `->rowCount()` will provide the count.
    John : This would fit my code perfectly, and makes a lot more sense with the `->rowCount()` function in the end. Thanks again.

0 comments:

Post a Comment