2012-02-19 6 views
0

Как правильно обрабатывать ошибки с транзакциями и подготовленные операторы при использовании mysqli?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; 
} 

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

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

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

ответ

3

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 
} 
+1

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

+0

@Flavius: Я не худею так (возможно, я ошибаюсь, я не работал с php некоторое время). Тем не менее, у вас всегда есть возможность написать собственный класс, который наследует от mysqli и переопределяет пару методов, поэтому они генерируют исключение. – a1ex07

0

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

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

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

См mysqli_driver::$report_mode

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

Смежные вопросы