Обрабатывание исключений внешнего ключа в PHP

Vb6:

Private Function factCalculation(ByVal Number%)
  Dim intNum%
  intNum = 1
  For i = 2 To Number
     intNum = intNum * Number
  Next i
  return intNum
End Function

Private Sub Form_Load()
 Dim FactResult% : FactResult = factCalculation(3) 'e.g
 Print FactResult
End Sub
6
задан Peter Lang 20 May 2010 в 20:20
поделиться

2 ответа

Я обрабатываю это так, чтобы мой класс-оболочка базы данных всегда генерировал исключение при обнаружении ошибки базы данных. Так, например, у меня может быть класс под названием 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.
    }
}

Edit

В ответ на комментарий автора ниже, у вас есть ограниченная информация, доступная вам, чтобы помочь диагностировать внешний ключ вопрос. Текст ошибки, созданный неудачным ограничением внешнего ключа и возвращенный функцией 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';

К сожалению, я не думаю, что у вашего решения есть волшебная палочка, кроме очень тщательного изучения ошибок и ограничений.

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';

К сожалению, я не думаю, что у вашего решения есть волшебная палочка, кроме очень тщательного изучения ошибок и ограничений.

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';

К сожалению, я не думаю, что у вашего решения есть волшебная палочка, кроме очень тщательного изучения ошибок и ограничений.

Команда SHOW ENGINE INNODB STATUS возвращает более подробный результат и для последней ошибки внешнего ключа.

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

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

К сожалению, я не думаю, что у вашего решения есть волшебная палочка, кроме очень тщательного изучения ошибок и ограничений.

Команда SHOW ENGINE INNODB STATUS возвращает более подробный результат и для последней ошибки внешнего ключа.

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

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

К сожалению, я не думаю, что у вашего решения есть волшебная палочка, кроме очень тщательного изучения ошибок и ограничений.

6
ответ дан 17 December 2019 в 02:30
поделиться

Я думаю, что лучше всего было бы для вас выполнить транзакцию . Таким образом, вставка всегда будет действительной или вообще не будет выполнена. Это может вернуть сообщение об ошибке, с которым вы также можете работать. Это избавит вас от необходимости вручную проверять каждую таблицу - база данных сделает это за вас.

0
ответ дан 17 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: