php - 在 mysql 上的 PDO 中启用自动提交并将自动提交设置为关闭

标签 php mysql pdo

我刚刚被分配到一个无需 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/

相关文章:

php - 如何查询 Cookie 变量

php - 过滤多对多关系 - Laravel

php - crontab 没有正确运行 php 脚本

php - 无限循环?遗漏了什么?我不知道发生了什么错误: 500 time out (Shouldn't be happening)

php - zend框架中的部分循环

php - 如何检查字符串是否已经存在以及是否在末尾添加 +1?

php - 是否有通过匹配多个条件来排序的 SQL 技术?

php - 我正在尝试结合 PDO 和 OOP,但无法正常工作

php PDO fetchAll(),简单的结果

php - 仅应通过引用传递变量 - 当将 LIMIT 与 bindParam 一起使用时