2012-02-19 177 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; 
} 

,因为有该列UNIQUE约束它不会增加它第二次。

但是,脚本也不会报告任何错误。

我错过了什么?

回答

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 2012-02-19 16:02:47

+0

@Flavius:我不瘦(我可能是错的,我有一段时间没有使用PHP)。但是,您总是可以选择编写自己的类,该类继承自'mysqli'并重写一对方法,以便引发异常。 – a1ex07 2012-02-19 16:19:20

0

有没有什么办法让mysqli的类丢不必每次

根据this answer您可以使用以下调用检查错误异常而不是我启用例外这样的错误:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

mysqli_driver::$report_mode

(愚蠢的堆栈溢出不让我发表评论)