cari

Rumah  >  Soal Jawab  >  teks badan

Fungsi penyerahan automatik PDO didayakan pada MySQL dengan autokomit dimatikan

<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>
P粉011912640P粉011912640504 hari yang lalu505

membalas semua(1)saya akan balas

  • P粉799885311

    P粉7998853112023-08-09 13:03:32

    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:

    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true); // 因为默认值是true
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); // 转换为布尔值true,与默认值相同

    Anda boleh menipunya dengan melumpuhkan dan mendayakan PDO::ATTR_AUTOCOMMIT:

    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);

    Ini akan membuat dua panggilan ke pelayan MySQL dan harus menetapkan nilai autokomit MySQL kepada 1

    balas
    0
  • Batalbalas