【问题标题】:Using PHP functions with MySQL database在 MySQL 数据库中使用 PHP 函数
【发布时间】:2021-11-06 07:05:14
【问题描述】:

我有一个 PHP 函数,例如:

function insert_data($key, $value) {
  $stmt = $dbh->prepare('INSERT INTO table (key, value) VALUES (:key, :value)');
  $params = [
     ':key' => $key,
     ':value' => $value
  ];
  $stmt->execute($params);
}

然后我在我的代码中多次调用这个函数:

$name = insert_data('Name', 'Joe');
$email = insert_data('Email', 'example@example.com');

但是,我想确保如果一个事务失败,它不会提交其他所有事务。将放置 $dbh->beginTransaction();在我调用函数和 $dbh->commit();功能工作后,还是我需要做其他事情?

【问题讨论】:

  • 作为旁注:考虑在另一个函数中准备你的语句,然后将它传递给insert_data。这是准备好的语句的一部分 - 你只需要准备一次,然后你可以用不同的参数多次运行它们。它也会保存传递给 SQL 服务器的查询。

标签: php mysql pdo mariadb


【解决方案1】:

启用异常,如果失败则使用try/catch回滚事务。

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $dbh->beginTransaction();
    $name = insert_data('Name', 'Joe');
    $email = insert_data('Email', 'example@example.com');
    $dbh->commit();
} except (Exception $e) {
    if ($dbh->inTransaction()) {
        $dbh->rollBack();
    }
}

【讨论】:

  • 这并不完全适合我。因此,虽然数据库中的数据没有改变,但我不会抛出任何异常。我添加了一个回显“事务失败”;看看它是否会显示它,但它也没有。
  • 我相信这可能是因为我的函数没有返回成功。
  • 这不关心函数返回什么。
  • 我在setAttribute 行中有一个错误。立即尝试。
  • 还是不行。看起来回滚也不起作用,因为我可以插入一个,但第二个不能插入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2015-09-09
  • 2016-06-17
  • 2016-12-08
  • 1970-01-01
相关资源
最近更新 更多