Mysql
 sql >> база данни >  >> RDS >> Mysql

Обработка на изключения за външни ключове в PHP

Начинът, по който се справям с това, е да настроя моя клас обвивка на база данни да хвърля винаги изключение, когато срещнете грешка в базата данни. Така че, например, може да имам клас, наречен MySQL със следните функции:

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());
}

Всеки път, когато заявка не успее, се хвърля обикновено PHP изключение. Имайте предвид, че бих ги хвърлил и от други места, като connect() функция или selectDb() функция, в зависимост от това дали операцията е била успешна или не.

С тази настройка можете да тръгнете. На всяко място, където очаквате, че може да се наложи да обработвате грешка в базата данни, направете нещо като следното:

//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.
    }
}

Редактиране

В отговор на коментара на постера по-долу, разполагате с известна ограничена информация, която да ви помогне да диагностицирате проблем с външен ключ. Текстът за грешка, създаден от неуспешно ограничаване на външния ключ и върнат от mysql_error() изглежда така:

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

Ако вашите външни ключове са достатъчно сложни, че не можете да сте сигурни какво може да причини грешка във външния ключ за дадена заявка, тогава вероятно бихте могли да анализирате този текст за грешка, за да помогнете да го разберете. Командата SHOW ENGINE INNODB STATUS връща по-подробен резултат и за последната грешка във външния ключ.

В противен случай вероятно ще трябва да се разровите сами. Следната заявка ще ви даде списък с външни ключове в дадена таблица, която можете да разгледате за информация:

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

За съжаление, не мисля, че има магически куршум за вашето решение, освен да проучите много внимателно грешките и ограниченията.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да покажа грешка в MySQL в PHP за дълга заявка, която зависи от въведеното от потребителя?

  2. Какъв е най-добрият начин за управление на дати в PHP, MySQL и т.н.?

  3. Функция за ранг в MySQL

  4. Лесен начин за изчисляване на медиана с MySQL

  5. условно присъединяване в mysql