我刚刚被分配到一个遗留的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" } }