我有一个使用PDO Transactions的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
内时,我的远程服务器上的{{1}}无法启动?我在使用事务的同一远程服务器上有许多其他PHP脚本,它们都可以正常工作。
有什么想法吗?
答案 0 :(得分:1)
除非存在现有的开放事务($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...
}