postgres pg_query pg_connect example error conectar con php sql postgresql error-handling

pg_query - php postgresql



detectando errores de Postgresql a PHP (3)

Quiero capturar y mostrar el error (de una forma que elijo) de una consulta en la página web usando php. Entonces, en lugar del código a continuación

$result=pg_query($connection,$query); if($result){ //success } else{ echo pg_last_error($connection); }

¿Puedo usar un método como la coincidencia de código de error o algo más para lograr cosas como

if(error equals duplicate value error){ echo "this value already exists"; } else if(error equals different type error){ echo "You should enter wrong type for column blabla" }

Tenga en cuenta que estoy usando postgresql


Debería analizar el retorno de pg_last_error para saber el tipo de error. Así que iría a algo así:

$result = pg_query($connection,$query); if($result) { //success } else { $error = pg_last_error($connection); // you need to adapt this regex if (preg_match(''/duplicate/i'', $error)) { echo "this value already exists"; } // you need to adapt this regex elseif(preg_match(''/different type/i'', $error)) { echo "You should enter wrong type for column blabla" } else { // different error } }



Es posible recuperar el código de error SQLSTATE estándar deseable, pero hay un truco: la consulta debe enviarse a través de la pg_send_query asíncrona () en lugar de la pg_query() sincrónica. Esto se debe a que pg_query() devuelve false por error en lugar del recurso que se requiere para ver los detalles del error.

Cuando se llama a pg_get_result () después de pg_send_query , se bloqueará de todos modos hasta que la consulta pg_send_query , por lo que en realidad no complica las cosas en comparación con el caso sincrónico. Y devuelve un resultado que puede explotarse completamente para un manejo preciso de errores.

Ejemplo:

if (pg_send_query($db, $query)) { $res=pg_get_result($db); if ($res) { $state = pg_result_error_field($res, PGSQL_DIAG_SQLSTATE); if ($state==0) { // success } else { // some error happened if ($state=="23505") { // unique_violation // process specific error } else { // process other errors } } } }