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