sql >> Base de Datos >  >> RDS >> Mysql

Manejo de excepciones de clave externa en PHP

La forma en que manejo esto es configurar mi clase contenedora de base de datos para que siempre arroje una excepción cuando encuentre un error en la base de datos. Entonces, por ejemplo, podría tener una clase llamada MySQL con las siguientes funciones:

public function query($query_string)
{
    $this->queryId = mysql_query($query_string,$this->connectionId);
    if (! $this->queryId) {
        $this->_throwException($query_string);
    }
    return $this->queryId;
}

private function _throwException($query = null)
{
    $msg = mysql_error().".  Query was:\n\n".$query.
                "\n\nError number: ".mysql_errno();
    throw new Exception($msg,mysql_errno());
}

Cada vez que falla una consulta, se lanza una excepción de PHP regular. Tenga en cuenta que también los lanzaría desde otros lugares, como un connect() función o un selectDb() dependiendo de si la operación tuvo éxito o no.

Con esa configuración, estás listo para irte. En cualquier lugar en el que espere que necesite manejar un error de la base de datos, haga algo como lo siguiente:

//assume $db has been set up to be an instance of the MySQL class

try {
    $db->query("DELETE FROM parent WHERE id=123");
} catch (Exception $e) {
    //uh-oh, maybe a foreign key restraint failed?
    if ($e->getCode() == 'mysql foreign key error code') {
        //yep, it failed.  Do some stuff.
    }
}

Editar

En respuesta al comentario del cartel a continuación, tiene información limitada disponible para ayudar a diagnosticar un problema de clave externa. El texto de error creado por una restricción de clave foránea fallida y devuelto por mysql_error() se parece a esto:

Cannot delete or update a parent row:
a foreign key constraint fails
(`dbname`.`childtable`, CONSTRAINT `FK_name_1` FOREIGN KEY
(`fieldName`) REFERENCES `parenttable` (`fieldName`));

Si sus claves externas son lo suficientemente complejas como para que no pueda estar seguro de qué podría causar un error de clave externa para una consulta determinada, entonces probablemente podría analizar este texto de error para ayudar a resolverlo. El comando SHOW ENGINE INNODB STATUS también devuelve un resultado más detallado para el último error de clave externa.

De lo contrario, probablemente tendrás que investigar un poco tú mismo. La siguiente consulta le dará una lista de claves foráneas en una tabla determinada, que puede examinar para obtener información:

select * from information_schema.table_constraints
WHERE table_schema=schema() AND table_name='table_name';

Desafortunadamente, no creo que haya una varita mágica para su solución más que examinar los errores y las restricciones con mucho cuidado.