2012-05-18 53 views
0

我有一個TRIGGER用於MySQL數據表,當發生數據提供錯誤時,它會用SIGNAL引發異常。我如何在PHP中用PDO捕獲這個異常?MySQL 5.5信號和PDO異常

在此先感謝。

上的更新我的問題

的更多信息:我執行多個查詢在一個事務中,我想回滾事務,如果他們中的一個,因爲有一個信號失效。目前一個信號被激活,但所有其他查詢都被執行。

另一個更新

到目前爲止我有:

try { 
    $db->beginTransaction(); 

    if (!$db->query('UPDATE accounts SET amount = amount - 10 WHERE id = 1')) { 
    throw new Exception($db->errorInfo()[2]); 
    } 

    if (!$db->query('UPDATE accounts SET amount = amount + 10 WHERE id = 2')) { 
    throw new Exception($db->errorInfo()[2]); 
    } 

    $db->commit(); 
} catch (Exception $e) { 
    $db->rollback(); 
    echo 'There was an error: ' . $e->getMessage(); 
} 

這是做處理異常交易的正確方法? 對不起,如果我的問題太寬泛。

+0

即也是可能的。你正在生成你自己的例外。但是,您錯過了詳細的錯誤消息。我的解決方案示例代碼中的過程方式也做同樣的事情,或多或少具有相同的邏輯流程。 – somnath

+0

我也沒有看到$ mysqli-> autocommit(FALSE),這是管理事務的強制性要求。確保你擁有它。 – somnath

+0

PDO手冊說beginTransaction()關閉自動提交。或者我錯了? – Vladimir

回答

0

嘗試類似:

$ls_error = ""; 
$mysqli->autocommit(FALSE); 
// first sql 
if (!$mysqli->query($sql)) { 
    $ls_error .= sprintf("Error: %d: %s\n",$mysqli->errno, $mysqli->error); 
    $mysqli->rollback(); 
} 
// second one 
if ($ls_error == "") { 
    if (!$mysqli->query($sql)) { 
     $ls_error .= sprintf("Error: %d: %s\n",$mysqli->errno, $mysqli->error); 
     $mysqli->rollback(); 
    } 
} 

// third one 
if ($ls_error == "") { 
    if (!$mysqli->query($sql)) { 
     $ls_error .= sprintf("Error: %d: %s\n",$mysqli->errno, $mysqli->error); 
     $mysqli->rollback(); 
    } 
} 
if ($ls_error == "") { 
    $mysqli->commit(); 
} else { 
    echo $ls_error; 
} 
+0

因此,MySQL信號不會自動轉換爲PHP中的異常,並且對於事務中的每個查詢,我都必須手動檢查它是否成功。那是對的嗎? – Vladimir

+0

的確如此。 PHP只是連接到MySQL的一種語言。它的MySQL數據庫處理函數正在檢查錯誤並向數據庫發出回滾。這是需要的,因爲您已禁用自動提交功能,以確保您自己管理交易。因此,如果最終成功發出Commit,或者已經發布了回滾。 – somnath

+0

我用代碼示例更新了我的問題。如果你能給我一個建議,如果這是實施它的正確方法,將會非常感激。 – Vladimir

0

抽象的例子。我有解決方案沒有任何問題。

觸發:

IF NEW.value < 0 THEN 
    SET @msg = CONCAT('Wrong count_from value! ', NEW.value); 
    SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = @msg; 
END IF; 

PHP(PDO):

try { 
    $conn->query('INSERT INTO `table` SET `value` = -1'); 
} catch (Exception $err) { 
    $error_message = $conn->query('SELECT @msg')->fetchColumn(); 
}