PDO 开始事务不让脚本执行


PDO beginTransaction Not Letting Script Execute

我有一个使用 PDO 事务的 PHP 脚本。

$PDO->beginTransaction();
$sth = $PDO->prepare("INSERT INTO tbl_last_packing_upload (folderID, subfolderID) VALUES (1, 1)");
$sth->execute();

出于某种原因,这在本地工作(INSERT运行),但当我将其推送到远程服务器时则不行。

为了让我的INSERT远程工作,我需要将其放在$PDO->beginTransaction();线上方。以下工作远程工作:

$sth = $PDO->prepare("INSERT INTO tbl_last_packing_upload (folderID, subfolderID) VALUES (1, 1)");
$sth->execute();
$PDO->beginTransaction();

为什么当我将INSERT放置在beginTransaction内时,它没有在远程服务器上触发?我在同一台远程服务器上使用事务还有许多其他PHP脚本,它们都工作正常。

有什么想法吗?

除非存在现有的打开事务($PDO->beginTransaction()之前被调用但未提交),否则发布的代码应该没有问题。 如果存在打开的事务,PDO将在尝试启动新事务时引发异常。

您已经设置了 PDO 来引发异常,而不是静默地出现错误

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

如果您的事务和INSERT语句代码包装在try/catch块中,则需要调试和检查catch块中捕获的错误。

catch (PDOException $e) {...}中捕获的错误不会自行进入 PHP 的内置错误报告机制,因此您需要强制它打印到您可以阅读的位置。在生产 Web 服务器上,您不希望将其打印到屏幕上,因此我建议使用 PHP 的 error_log() 函数将其写入 Web 服务器的错误日志。对默认日志位置的简单写入只需要将消息作为参数。

try {
  // everything posted above
} catch (PDOException $e) {
  // Caught an error, write it to the log
  error_log("Error at line " . __LINE__ . " in " . __FILE__ . ": " . $e->getMessage());
  // Whatever else you already do to handle the error...
  // etc...
}