Die automatische Übermittlungsfunktion von PDO ist auf MySQL aktiviert, wenn Autocommit deaktiviert ist
P粉011912640
2023-08-08 15:23:46
<p>Ich wurde gerade einer alten PHP-Codebasis zugewiesen, die nur PDO verwendete. </p><p>Die Verbindung erfolgt nach folgendem Muster: </p><p><br /></p>
<pre class="lang-php Prettyprint-override"><code>// Mit MySQL-Datenbank verbinden
$con = new mysqli($host, $user, $password, $database);
// Verbindung prüfen
if ($con->connect_error) {
die("Verbindung fehlgeschlagen: " . $con->connect_error);
}
$con->autocommit(true);
</code></pre>
<p>Und die Verwendung von autocommit(true) funktioniert wie erwartet, selbst wenn der MySQL-Server mit SET autocommit = 0 konfiguriert ist. </p><p>Jetzt versuche ich, von normalem SQL auf vorbereitete Anweisungen umzusteigen, also habe ich Folgendes geschrieben</p><p><br /></p>
<pre class="lang-php Prettyprint-override"><code>$dsn = "mysql:host=$host;dbname=$database";
$pdo = neues PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
</code></pre>
<p>und die Beispielfunktion unten</p>
<pre class="lang-php Prettyprint-override"><code>function updateTeam($pdo, $name, $id)
{
versuchen {
$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('Fehlgeschlagen: ' . $e->getMessage() );
}
Catch (Ausnahme $exc) {
db::$pdo->rollback();
error_log('Fehlgeschlagen: ' . $exc->getMessage());
}
}
</code></pre>
<p>Nicht einreichen. Ich muss $pdo->commit(); auskommentieren, damit es funktioniert, was ich nicht möchte, weil es mich zwingt, jede Abfrageanweisung in der Anwendung zu ändern. </p><p>Was habe ich bei der PDO-Konfiguration übersehen? Ich habe var_dump($pdo->query('SELECT @@autocommit')->fetchAll()); ausprobiert und das Ergebnis war </p><p><code></code>< /p>
<pre class="brush:php;toolbar:false;">array(1) { [0]=> array(2) { ["@@autocommit"]=> [0]=> string(1) "0" } }</pre>
<p><br /></p>
PDO的自动提交与MySQL的自动提交不相同。这意味着,如果在您的MySQL配置中将autocommit的值默认设置为0,它不会改变PDO::ATTR_AUTOCOMMIT的默认值。PDO::ATTR_AUTOCOMMIT的默认值始终为true。
将PDO::ATTR_AUTOCOMMIT的值更改为与之相同的值或其他任何不是布尔值或整数的值将被忽略。这意味着这两个操作都是无操作:
你可以通过禁用和启用PDO::ATTR_AUTOCOMMIT来欺骗它:
这将对MySQL服务器进行两次调用,应该会将MySQL的自动提交值设置为1