0

我有一个 MySQL 表的触发器,当提供的数据有问题时,它会引发 SIGNAL 异常。如何使用 PDO 在 PHP 中捕获此异常?

提前致谢。

更新

关于我的问题的更多信息:我在一个事务中执行多个查询,如果其中一个因为有信号而失败,我想回滚事务。当前激活了一个信号,但执行了所有其他查询。

另一个更新

到目前为止,我有:

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

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

4

2 回答 2

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;
}
于 2012-05-18T12:07:11.427 回答
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();
}
于 2016-11-11T21:07:31.973 回答