我刚刚被分配到一个遗留的PHP代码库,该代码库在没有PDO的情况下工作.

连接使用以下模式完成:

// 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);

而且,即使MySQL服务器配置了SET autocommit = 0,使用这autocommit(true)也能正常工作.

现在,我正在try 将查询从纯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());
    }
}

这并不意味着promise .我不得不取消对$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的值更改为相同的值或布尔值或整型值以外的任何值都将被忽略.这意味着这两个操作都是无操作的:

$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相关问答推荐

启用额外的WooCommerce产品库存位置

PHP FFI—将PHP数组转换为C指针数组

以编程方式更新现有Yith WooCommerce Booking的状态

ForHumans函数中的月当量与单位限制

PHP空数组定义与开始或结束逗号

PHP MySQL求和子树并与父树累加

Laravel Nova不使用数组键作为筛选器中的选项值

WooCommerce在购买后多次重定向

为什么只有最后一次点击的点赞/心形会按预期改变 colored颜色 ,而其他的保持正常 colored颜色 ?

根据WooCommerce中的自定义用户元数据值更改用户角色

Laravel 在数据库上显示加密列

如何在 PHP 中以 hh:mm:ss 格式获取两个 strtotime datetime/s 之间的时间差

调用未定义的方法 mysqli::execute_query()

如何显示所有数组数据而不仅仅是最后的结果

使用 wp_footer 挂钩添加一些 CSS 不起作用

如何为自定义帖子类型的自定义角色提供功能

在 vue 自定义渲染器中访问变量

从 laravel 中的日期类型中删除时间

PHP 自动函数参数和变量

如何简化 php API 中的格式化数组列表数据以提供 React Native 部分列表