Fungsi penyerahan automatik PDO didayakan pada MySQL dengan autokomit dimatikan
P粉011912640
2023-08-08 15:23:46
<p>Saya baru sahaja ditugaskan kepada pangkalan kod PHP lama yang hanya menggunakan PDO. </p><p>Sambungan dilakukan menggunakan corak berikut: </p><p><br /></p>
<pre class="lang-php prettyprint-override"><code>// Sambung ke pangkalan data MySQL
$con = mysqli baharu($host, $user, $password, $database);
// Semak sambungan
jika ($con->connect_error) {
die("Sambungan gagal: " . $con->connect_error);
}
$con->autocommit(true);
</code></pre>
<p>Dan menggunakan autocommit(true) itu berfungsi seperti yang diharapkan walaupun pelayan MySQL dikonfigurasikan dengan SET autocommit = 0. </p><p>Sekarang saya cuba berhijrah daripada SQL biasa kepada pernyataan yang disediakan, jadi saya menulis ini</p><p><br /></p>
<pre class="lang-php prettyprint-override"><code>$dsn = "mysql:host=$host;dbname=$database";
$pdo = PDO baharu($dsn, $pengguna, $kata laluan);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, benar);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
</code></pre>
<p>dan fungsi contoh di bawah</p>
<pre class="lang-php prettyprint-override"><code>function updateTeam($pdo, $name, $id)
{
cuba {
$data = [
'nama' => $nama,
'id' => $id
];
$sql = "KEMASKINI nama SET pasukan = :name WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
// $pdo->commit();
}
tangkap (PDOException $e) {
db::$pdo->rollback();
error_log('Gagal: ' . $e->getMessage() );
}
tangkap (Pengecualian $exc) {
db::$pdo->rollback();
error_log('Gagal: ' . $exc->getMessage());
}
}
</code></pre>
<p>Jangan serahkan. Saya perlu membatalkan ulasan $pdo->commit(); untuk menjadikannya berfungsi, yang saya tidak mahu kerana ia memaksa saya menukar setiap pernyataan pertanyaan dalam aplikasi. </p><p>Apakah yang saya terlepas dalam konfigurasi PDO? Saya mencuba var_dump($pdo->query('SELECT @@autocommit')->fetchAll()); dan hasilnya ialah </p><p><code></code>< /p>
<pre class="brush:php;toolbar:false;">array(1) { [0]=> array(2) { ["@@autocommit"]=> [0]=> rentetan(1) "0" } }</pre>
<p><br /></p>
Komit automatik PDO berbeza daripada komit automatik MySQL. Ini bermakna jika anda menetapkan nilai autocommit kepada lalai kepada 0 dalam konfigurasi MySQL anda, ia tidak akan mengubah nilai lalai PDO::ATTR_AUTOCOMMIT. Nilai lalai PDO::ATTR_AUTOCOMMIT sentiasa benar.
Menukar nilai PDO::ATTR_AUTOCOMMIT kepada nilai yang sama atau mana-mana nilai lain yang bukan boolean atau integer akan diabaikan. Ini bermakna kedua-dua operasi adalah tanpa operasi:
Anda boleh menipunya dengan melumpuhkan dan mendayakan PDO::ATTR_AUTOCOMMIT:
Ini akan membuat dua panggilan ke pelayan MySQL dan harus menetapkan nilai autokomit MySQL kepada 1