我有一个用于MySQL表的TRIGGER,当提供的数据出现问题时,会引发SIGNAL异常。如何在PHP中使用PDO捕获此异常?
提前致谢。
更新
有关我的问题的更多信息:我正在一个事务中执行多个查询,如果其中一个因为存在SIGNAL而失败,我想要回滚该事务。目前,信号已激活,但所有其他查询都已执行。
另一个更新
到目前为止,我已经:
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 :(得分: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;
}
答案 1 :(得分: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();
}