PDO mysql: Cómo saber si insert tuvo éxito


Estoy usando PDO para insertar un registro (mysql y php)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();

¿Hay alguna manera de saber si se insertó correctamente, por ejemplo, si el registro no se insertó porque era un duplicado?

Editar: por supuesto que puedo mirar la base de datos, pero me refiero a la retroalimentación programática.

Author: Chris, 2009-11-02

7 answers

PDOStatement->execute() devuelve true en caso de éxito. También hay PDOStatement->errorCode() que se puede comprobar errores.

 107
Author: Ólafur Waage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-23 21:05:34

Me pregunto por quétodavía no hay una respuesta adecuada.

Dado que el modo de error más recomendado para la DOP es ERRMODE_EXCEPTION, ninguna verificación directa de resultados execute() funcionará nunca . Ya que la ejecución del código ni siquiera alcanzará la condición ofrecida en otras respuestas.

Por lo tanto, hay tres escenarios posibles para manejar el resultado de la operación de inserción en PDO:

  1. Para decir el éxito, no se necesita verificación. Solo mantén el flujo de tu programa.
  2. Para manejar un error inesperado, mantener con el mismo - no se necesita código de manejo inmediato. Se lanzará una excepción en caso de un error de la base de datos, y se expandirá al manejador de errores de todo el sitio que eventualmente resultará en una página de error 500 común.
  3. Para manejar un error esperado, como una clave primaria duplicada, y si tiene un cierto escenario para manejar este mismo error - entonces use un operador try..catch.

Para un usuario regular de PHP suena un poco extraño - ¿cómo es eso, no verificar el resultado directo de la operación? - pero así es como funcionan las excepciones - se comprueba el error en otro lugar. De una vez por todas. Extremadamente conveniente.

Por lo tanto, en un caso normal no necesita ningún código de manejo en absoluto. Simplemente mantenga su código como está:

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever

Si tiene éxito, se lo dirá, en caso de error, se le mostrará la página de error normal que su aplicación está mostrando para tal ocasión.

Solo en caso de que tenga un manejo escenario aparte de informar el error, ponga su instrucción insert en un operador try..catch, compruebe si fue el error que esperaba y manejarlo; o - si el error fue diferente - vuelva a lanzar la excepción, para que sea posible ser manejado por el manejador de errores de todo el sitio de la manera habitual. A continuación se muestra el código de ejemplo de mi artículo sobre el manejo de errores con PDO :

try {
     $pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
    if ($e->getCode() == 1062) {
        // Take some action if there is a key constraint violation, i.e. duplicate name
    } else {
        throw $e;
    }
}
echo "Success!";

En el código anterior estamos comprobando el error en particular para tomar alguna acción y volver a lanzar la excepción para cualquier otro error (no hay tal tabla, por ejemplo) que se informará a un programador.

De nuevo, solo para decirle a un usuario algo como "Su inserción fue exitosa" no se necesita ninguna condición.

 16
Author: Your Common Sense,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-16 05:57:22

Intente mirar el valor de retorno de execute, que es TRUE en el éxito, y FALSE en el fracaso.

 9
Author: Dominic Rodger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-02 15:17:35

Si una consulta de actualización se ejecuta con valores que coinciden con el registro de la base de datos actual, $stmt->rowCount() devolverá 0 para que no haya filas afectadas. Si tiene un if( rowCount() == 1 ) para probar el éxito, pensará que la actualización falló cuando no falló, pero los valores ya estaban en la base de datos, por lo que nada cambia.

$stmt->execute();
if( $stmt ) return "success";

Esto no funcionó para mí cuando intenté actualizar un registro con un campo de clave único que fue violado. La consulta devolvió el éxito, pero otra consulta devuelve el campo antiguo valor.

 8
Author: dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-01 23:45:03

Puede probar el rowcount

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }
 1
Author: crafter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-18 11:33:07

PDOStatement - > execute() puede lanzar una excepción

Así que lo que puedes hacer es

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}
 0
Author: Sumit P Makwana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-06 07:04:20

Use id como clave primaria con incremento automático

$stmt->execute();
$insertid = $conn->lastInsertId();

El id incremental es siempre mayor que cero incluso en el primer registro, lo que significa que siempre devolverá un valor verdadero para id coz mayor que cero significa verdadero en PHP

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";
 0
Author: jumper rbk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-16 04:09:53