PDO beginTransaction不让脚本执行

时间:2015-01-22 21:02:20

标签: php pdo transactions

我有一个使用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脚本,它们都可以正常工作。

有什么想法吗?

1 个答案:

答案 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...
}