mysqli – обработка ошибок с транзакциями

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

Snippet:

<?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; } 

Он не добавит его второй раз, потому что в этом столбце есть ограничение UNIQUE.

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

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

    Related of "mysqli – обработка ошибок с транзакциями"

    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 } 

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

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

     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

    См. Mysqli_driver :: $ report_mode

    (Stupid Stack Overflow не дает мне комментариев)