PDO beginTransaction 不允许脚本执行

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 中时,我的 INSERT 没有在我的远程服务器上启动?我在使用事务的同一个远程服务器上还有许多其他 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() function 将其写入 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...
}