我刚刚被分配到一个无需 PDO 即可工作的旧 PHP 代码库。
使用此模式完成连接:
// Connect to MySQL Database
$con = new mysqli($host, $user, $password, $database);
// Check connection
if ($con->connect_error) {
die("Connection failed: " . $con->connect_error);
}
$con->autocommit(true);
使用该 autocommit(true)
,即使 MySQL 服务器配置为 SET autocommit = 0
,也能按预期工作。
现在我正在尝试将查询从普通 SQL 迁移到准备好的语句,所以我写了这个
$dsn = "mysql:host=$host;dbname=$database";
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
以及以下示例函数
function updateTeam($pdo, $name, $id)
{
try {
$data = [
'name' => $name,
'id' => $id
];
$sql = "UPDATE teams SET name = :name WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
// $pdo->commit();
}
catch (PDOException $e) {
db::$pdo->rollback();
error_log('Failed: ' . $e->getMessage() );
}
catch (Exception $exc) {
db::$pdo->rollback();
error_log('Failed: ' . $exc->getMessage());
}
}
不提交。我必须取消注释 $pdo->commit();
才能使其工作,这是我不想要的,因为这将迫使我更改应用程序中的每个查询。
我在 PDO 配置中缺少什么?
我尝试了 var_dump($pdo->query('SELECT @@autocommit')->fetchAll());
结果是
array(1) { [0]=> array(2) { ["@@autocommit"]=> string(1) "0" [0]=> string(1) "0" } }
最佳答案
PDO 的自动提交与 MySQL 的自动提交不同。这意味着,如果您的 MySQL 配置中将 autocommit
的值设置为默认值 0
,则不会更改 PDO::ATTR_AUTOCOMMIT< 的默认值
。 PDO::ATTR_AUTOCOMMIT
的默认值始终为 true
。
将 PDO::ATTR_AUTOCOMMIT
的值更改为相同值或除 bool 或 int 之外的任何值都会被忽略。这意味着这两个操作都是空操作:
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true); // because the value by default is true
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); // converted to bool true, which is the same as the default
您可以通过禁用和启用 PDO::ATTR_AUTOCOMMIT
来欺骗它:
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
这将对 MySQL 服务器进行两次调用,这应将 MySQL 的 autocommit
值设置为 1
。
或者,您可以只执行SET autocommit = 1
来将MySQL值与PDO的值对齐。
$pdo = new PDO($dsn, $user, $password);
$pdo->exec('SET autocommit = 1');
关于php - 在 mysql 上的 PDO 中启用自动提交并将自动提交设置为关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76820020/