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
}
}
Puede obtener acceso a SQLSTATE a través de los dos controladores principales.
http://uk3.php.net/manual/en/function.pg-result-error-field.php
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
}
}
}
}