php - mysqli准备好的语句和事务可以一起使用吗?

标签 php mysqli prepared-statement rollback execute

我想知道的是mysqli的prepareexecuterollback能不能一起使用?

$m = new mysqli($dbhost,$dbuser,$dbpassword,$dbname);

$m->autocommit(FALSE);
$stmt = $m->prepare("INSERT `table` (`name`,`gender`,`age`) VALUES (?,?,?)");
$stmt->bind_param("ssi", $name, $gender, $age);
$query_ok = $stmt->execute();

$stmt = $m->prepare("INSERT `table` (`name`,`gender`,`age`) VALUES (?,?,?)");
$stmt->bind_param("ssi", $name, $gender, $age);
if ($query_ok) {$query_ok = $stmt->execute();}

if (!$query_ok) {$m->rollback();} else {$m->commit();}

你能做到吗?让我们假设上面的代码有一个循环和/或变量在其中获取新数据。

最佳答案

处理此问题的最佳方法是处理异常(一如既往,该死的 PHP 错误/警告内容)。仅仅是因为我们的 commit() 调用也可能会失败。请注意,finally 仅在较新的 PHP 版本中可用。

<?php

// Transform all errors to exceptions!
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
  $connection = new \mysqli($dbhost, $dbuser, $dbpassword, $dbname);
  $connection->autocommit(false);

  $stmt = $connection->prepare("INSERT `table` (`name`, `gender`, `age`) VALUES (?, ?, ?)");
  $stmt->bind_param("ssi", $name, $gender, $age);
  $stmt->execute();

  // We can simply reuse the prepared statement if it's the same query.
  //$stmt = $connection->prepare("INSERT `table` (`name`, `gender`, `age`) VALUES (?, ?, ?)");

  // We can even reuse the bound parameters.
  //$stmt->bind_param("ssi", $name, $gender, $age);

  // Yet it would be better to write it like this:
  /*
  $stmt = $connection->prepare("INSERT `table` (`name`, `gender`, `age`) VALUES (?, ?, ?), (?, ?, ?)");
  $stmt->bind_param("ssissi", $name, $gender, $age, $name, $gender, $age);
   */

  $stmt->execute();
  $connection->commit();
}
catch (\mysqli_sql_exception $exception) {
  $connection->rollback();
  throw $exception;
}
finally {
  isset($stmt) && $stmt->close();
  $connection->autocommit(true);
}

关于php - mysqli准备好的语句和事务可以一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12807555/

相关文章:

php - 使用 Silex 和 Symfony 3 配置 LDAP 身份验证

php - Codeception多项测试,1个脚本

php - rove.io 的 vagrant lamp 配置精确 64 不起作用?

javascript - 来自 php 的 mysql 查询不起作用,但它在不同的 php 文件中工作

php - PHP准备好的语句未执行

php - 限制字符数并放置阅读更多链接

php - 尝试从数据库打印结果时出现未定义的错误

php - mySQL UPDATE 查询本地文件路径

php - PDO 自定义类和安全性

mysql - 如何传递逗号分隔的输入参数以从另一个存储过程调用存储过程