Con PDO, ¿cómo puedo asegurarme de que una declaración de ACTUALIZACIÓN fue exitosa?

3 minutos de lectura

Parece que para una declaración INSERT, uno puede usar if (isset($connect->lastInsertId())) para verificar si la declaración INSERT fue exitosa. (Por favor corrígeme si estoy equivocado.)

Pero para una declaración de ACTUALIZACIÓN, ¿cómo puedo saber si fue exitosa?

Por ejemplo, tengo uno básico como ese:

$statement=$connect->prepare("UPDATE users SET premium='1' WHERE userid=?");
$statement->execute(array($id));

Muchas gracias por adelantado. Saludos

  • ¿Qué es una declaración de actualización exitosa en sus ojos?

    – hakré

    5 de agosto de 2012 a las 23:19

  • Hola, es una declaración que resultó en la modificación de al menos un valor en la tabla. Saludos

    – alexx0186

    5 de agosto de 2012 a las 23:19

  • PDOStatement::rowCount() devuelve el número de filas afectadas por la última instrucción DELETE, INSERT o UPDATE ejecutada por el objeto PDOStatement correspondiente. Ver de.php.net/manual/pdostatement.rowcount.php

    – hakré

    5 de agosto de 2012 a las 23:20

  • Hola a todos, muchas gracias por eso. Lo resolvió. Saludos

    – alexx0186

    5 de agosto de 2012 a las 23:23

avatar de usuario
FtDRbwLXw6

Depende de lo que entiendas por “exitoso”. Si quiere decir que la consulta se ejecutó sin fallar, entonces PDO lanzará una excepción en caso de falla o devolverá FALSE de PDOStatement::execute()según el modo de error que haya configurado, por lo que una consulta “correcta” en ese caso sería solo una en la que el método de ejecución no regresó FALSE o lanzar una excepción.

Si quiere decir “exitoso” en el sentido de que en realidad hubo filas actualizadas (en lugar de solo 0 filas actualizadas), entonces deberá verificar eso usando PDOStatement::rowCount()que le indicará el número de filas afectadas de la consulta anterior.

Advertencia: Para actualizaciones donde newvalue = oldvalue PDOStatement::rowCount() devuelve cero. Puedes usar

$p = new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));

para deshabilitar este comportamiento inesperado.

  • Hola, muchas gracias por esto. De hecho, quise decir “más de cero filas actualizadas”. Saludos

    – alexx0186

    5 de agosto de 2012 a las 23:23

  • Muy buena respuesta. De hecho, necesitaba la primera parte. Verdadero/falso 🙂

    – jave.web

    30/01/2014 a las 23:50

  • Preste atención al confiar en el resultado de rowCount: PDOStatement->rowCount: devuelve el número de filas afectadas por la última instrucción SQL. Si intenta actualizar una fila, pero los valores de los nuevos campos son los mismos que los de uno. ya almacenado en la base de datos, rowCount devolverá 0 (¡ya que nada se ha actualizado realmente!). ¡Esto no significa que su declaración de ACTUALIZACIÓN no se haya ejecutado con éxito!

    – Marco Gagliardi

    28 de febrero de 2014 a las 16:22

  • @MarcoGagliardi esta es la solución: php.net/manual/en/pdostatement.rowcount.php#104930

    – Linea blanca

    18 de marzo de 2016 a las 15:39

  • @FtDRbwLXw6 ¿podría aconsejarme qué significa? $dsn, $u y $p en $p = new PDO($dsn, $u, $p, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));

    – usuario2360831

    17 de marzo de 2020 a las 7:49

$stmt->execute();
$count = $stmt->rowCount();

if($count =='0'){
    echo "Failed !";
}
else{
    echo "Success !";
}

  • Será mejor que explique su respuesta, las respuestas de solo código no son muy útiles.

    – ᴀʀᴍᴀɴ

    21/02/2017 a las 19:00

  • mi respuesta es sobre ACTUALIZAR. $sql = “ACTUALIZAR usuarios SET premium=’1′ WHERE userid=$id “; $stmt = $dbConnection->prepare($sql); $sentencia->ejecutar(); entonces el código anterior se repetirá como exitoso o fallido.

    – Bashir Noori

    22 de febrero de 2017 a las 5:25


  • rowCount devuelve el número de filas afectadas por la última instrucción SQL. Entonces, si el conteo es 0, entonces ninguna fila se vio afectada. Por lo tanto, la actualización falló. Quitaría las comillas alrededor del número cero porque el método rowCount devuelve un int. Funcionará de todos modos porque no está usando triples iguales para comparar.

    – Juan Harris

    15 de marzo de 2020 a las 4:43

¿Ha sido útil esta solución?