MySQL 5.5 SIGNAL和PDO异常

时间:2012-05-18 12:00:21

标签: php mysql

我有一个用于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();
}

这是处理异常的事务的正确方法吗? 对不起,如果我的问题太宽泛了。

2 个答案:

答案 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();
}