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 forma 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 comentarios programáticos.
if ($stmt->execute()) { //true }
PDOStatement->execute()
yPDOStatement->errorCode()
totalmente coherentes entre sí? ¿Hay alguna circunstancia en la quePDOStatement->errorCode()
haya algo peroPDOStatement->execute()
devuelva verdadero? ¿O cuandoPDOStatement->execute()
devuelve falso peroPDOStatement->errorCode()
no tiene nada?Dado que el modo de error más recomendado para PDO es
ERRMODE_EXCEPTION
, nunca funcionará la verificación directa deexecute()
resultados . Como 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 ejecución de la consulta en PDO:
try..catch
operador.Para un usuario habitual de PHP, suena un poco extraño, ¿cómo es eso, no verificar el resultado directo de la operación? - pero así es exactamente como funcionan las excepciones: verifica el error en otro lugar. De una vez por todas. Extremadamente conveniente.
Entonces, en pocas palabras: en un código normal, no necesita ningún manejo de errores en absoluto. Simplemente mantenga su código como está:
En caso de éxito, se lo dirá, en caso de error, le mostrará la página de error habitual que muestra su aplicación para tal ocasión.
Solo en caso de que tenga un escenario de manejo que no sea simplemente informar el error, coloque su declaración de inserción en un
try..catch
operador, verifique si fue el error que esperaba y maneje; o, si el error fue diferente, vuelva a lanzar la excepción, para que sea posible que la maneje el controlador de errores en 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 :En el código anterior, estamos verificando el error en particular para tomar alguna acción y volviendo a lanzar la excepción para cualquier otro error (no hay tal tabla, por ejemplo) que se informará a un programador.
Una vez más, solo para decirle a un usuario algo como "Su inserción fue exitosa" , nunca se necesita ninguna condición.
fuente
query()
función? ¿Puedo usar try-catch para enquery()
lugar deprepared()->execute()
?Intente observar el valor de retorno de
execute
, que estáTRUE
en el éxito yFALSE
en el fracaso.fuente
Si una consulta de actualización se ejecuta con valores que coinciden con el registro de la base de datos actual, entonces
$stmt->rowCount()
regresará0
porque ninguna fila se vio afectada. Si tiene unaif( rowCount() == 1 )
prueba de é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.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 valor del campo anterior.
fuente
if($stmt->execute() && ($stmt->rowCount()>0))
Puedes probar el recuento de filas
fuente
SELECT
consultas (e incluso allí, los documentos hablan de varias consultas). No dice nada sobreDELETE
,INSERT
oUPDATE
, que parecen funcionar bien (la pregunta era sobre unaINSERT
consulta). Sin embargo, soy nuevo en PDO y si me equivoco y alguien tiene otras referencias, escríbalas aquí. Estoy interesado en ver si existen desventajas reales para los 3 comandos anteriores.Utilice la identificación como clave principal con incremento automático
La identificación incremental siempre es mayor que cero incluso en el primer registro, por lo que significa que siempre devolverá un valor verdadero para la identificación porque mayor que cero significa verdadero en PHP
fuente
PDOStatement-> execute () puede lanzar una excepción
entonces lo que puedes hacer es
fuente