Php MySQL 5.5信号和PDO异常
我有一个MySQL表的触发器,当提供的数据出现问题时,它会发出异常信号。如何使用PDO在PHP中捕获此异常 提前谢谢 更新 关于我的问题的更多信息:我在一个事务中执行多个查询,如果其中一个由于信号而失败,我希望回滚该事务。当前激活一个信号,但执行所有其他查询 另一个更新 到目前为止,我已经:Php MySQL 5.5信号和PDO异常,php,mysql,Php,Mysql,我有一个MySQL表的触发器,当提供的数据出现问题时,它会发出异常信号。如何使用PDO在PHP中捕获此异常 提前谢谢 更新 关于我的问题的更多信息:我在一个事务中执行多个查询,如果其中一个由于信号而失败,我希望回滚该事务。当前激活一个信号,但执行所有其他查询 另一个更新 到目前为止,我已经: try { $db->beginTransaction(); if (!$db->query('UPDATE accounts SET amount = amount - 10 WHE
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();
}
这是处理异常的正确方式吗?
如果我的问题太宽泛,很抱歉。请尝试以下方法:
$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;
}
抽象例子。我有一个没有任何问题的解决方案 触发:
IF NEW.value < 0 THEN
SET @msg = CONCAT('Wrong count_from value! ', NEW.value);
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = @msg;
END IF;
因此,MySQL信号在PHP中不会自动转换为异常,对于事务中的每个查询,我必须手动检查是否成功。对吗?没错。PHP只是一种连接到MySQL的语言。它的MySQL数据库处理功能是检查错误并向数据库发出回滚。这是必需的,因为您已禁用自动提交以确保您自己管理事务。因此,如果最终成功,您将发出提交,否则回滚已经发出。我已经用代码示例更新了我的问题。如果你能给我一个建议,如果这是实施它的正确方法,我将不胜感激。我的答案不是有用的,而是最好的答案?:)德克萨斯州!这也是可能的。您正在生成自己的异常。但是,您错过了详细的错误消息。我的解决方案示例代码中的过程方式也做同样的事情,或多或少有相同的逻辑流。我也没有看到$mysqli->autocommit(FALSE),这是管理事务的强制性要求。确保它在上面。PDO手册上说beginTransaction()关闭自动提交。还是我弄错了?:)不,你完全正确!不知怎的,我把它记在了我的脑海中,是mysqli,而不是PDO。这是链接和确认。
try {
$conn->query('INSERT INTO `table` SET `value` = -1');
} catch (Exception $err) {
$error_message = $conn->query('SELECT @msg')->fetchColumn();
}