我有一个使用 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...
}