Как правильно обрабатывать ошибки с транзакциями и готовые инструкции при использовании 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.
Однако скрипт также не сообщает об ошибке.
Что мне не хватает?
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 не дает мне комментариев)