mysqli - обработка ошибок с транзакциями - PullRequest
0 голосов
/ 19 февраля 2012

Как правильно обрабатывать ошибки с транзакциями и подготовленными выписками при использовании mysqli?

Отрывок:

<?php
$conn = require_once 'dbconn.php';
$conn->autocommit(FALSE);

$stmt_ins_option = $conn->prepare('INSERT INTO options(option_name) VALUES(?)');
$option_name = 'foo';
$stmt_ins_option->bind_param('s', $option_name);
$stmt_ins_option->execute();
$conn->commit();
if($conn->errno) {
    $conn->rollback();
    echo $conn->error;
}

Он не будет добавлен во второй раз, потому что в этом столбце есть УНИКАЛЬНОЕ ограничение.

Однако скрипт также не сообщит об ошибке.

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

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

try
{
  ....
  if (!$stmt_ins_option->execute())
  {
   throw new Exception("Cannot insert record. Reason :".$stmt_ins_option->error);
   // surely, it's better to define your own exception hierarchy
  }
  $conn->commit();
}
catch (Exception $e)
{
   $conn->rollback();
   // display error/re-raise/ or whatever you think makes sense for your function
}
0 голосов
/ 01 февраля 2014

Есть ли способ заставить классы mysqli генерировать исключения вместо того, чтобы мне каждый раз приходилось проверять ошибки

Согласно этому ответу вы можете использовать следующий вызов для включения исключений для таких ошибок:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

См. mysqli_driver :: $ report_mode

(Stupid Stack Overflow не позволяет мне комментировать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...