Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL 5.5信号和PDO异常_Php_Mysql - Fatal编程技术网

Php MySQL 5.5信号和PDO异常

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

我有一个MySQL表的触发器,当提供的数据出现问题时,它会发出异常信号。如何使用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();
}
这是处理异常的正确方式吗? 如果我的问题太宽泛,很抱歉。

请尝试以下方法:

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