Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Manipulando exceções de chave estrangeira em PHP


A maneira de lidar com isso é configurar minha classe wrapper de banco de dados para sempre lançar uma exceção quando você encontrar um erro de banco de dados. Então, por exemplo, eu poderia ter uma classe chamada MySQL com as seguintes funções:
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());
}

Sempre que uma consulta falha, uma exceção PHP normal é lançada. Observe que eu os lançaria de outros lugares também, como um connect() função ou um selectDb() função, dependendo se a operação foi bem sucedida ou não.

Com essa configuração, você está pronto para ir. Em qualquer lugar que você espera que precise lidar com um erro de banco de dados, faça algo como o seguinte:
//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

Em resposta ao comentário do pôster abaixo, você tem algumas informações limitadas disponíveis para ajudar a diagnosticar um problema de chave estrangeira. O texto de erro criado por uma restrição de chave estrangeira com falha e retornado por mysql_error() parece algo assim:
Cannot delete or update a parent row:
a foreign key constraint fails
(`dbname`.`childtable`, CONSTRAINT `FK_name_1` FOREIGN KEY
(`fieldName`) REFERENCES `parenttable` (`fieldName`));

Se suas chaves estrangeiras forem complexas o suficiente para que você não tenha certeza do que pode causar um erro de chave estrangeira para uma determinada consulta, provavelmente poderá analisar esse texto de erro para ajudar a descobrir. O comando SHOW ENGINE INNODB STATUS também retorna um resultado mais detalhado para o erro de chave estrangeira mais recente.

Caso contrário, você provavelmente terá que fazer algumas escavações por conta própria. A consulta a seguir fornecerá uma lista de chaves estrangeiras em uma determinada tabela, que você pode examinar para obter informações:
select * from information_schema.table_constraints
WHERE table_schema=schema() AND table_name='table_name';

Infelizmente, não acho que haja uma solução mágica para sua solução além de examinar os erros e as restrições com muito cuidado.