MySQL では PDO の自動送信機能が有効になっており、自動コミットはオフになっています
P粉011912640
2023-08-08 15:23:46
<p>私は、PDO のみを使用する従来の PHP コードベースに割り当てられたところです。 </p><p>接続は次のパターンを使用して行われます。</p><p><br /></p>
<pre class="lang-php prettyprint-override"><code>// MySQL データベースに接続します
$con = new mysqli($host, $user, $password, $database);
// 接続を確認する
if ($con->connect_error) {
die("接続に失敗しました: " . $con->connect_error);
}
$con->autocommit(true);
</code></pre>
<p>そして、MySQL サーバーが SET autocommit = 0 で構成されている場合でも、その autocommit(true) を使用すると、期待どおりに機能します。 </p><p>今、通常の SQL からプリペアド ステートメントに移行しようとしているので、これを書きました</p><p><br /></p>
<pre class="lang-php prettyprint-override"><code>$dsn = "mysql:host=$host;dbname=$database";
$pdo = 新しい PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
</code></pre>
<p>および以下の関数例</p>
<pre class="lang-php prettyprint-override"><code>function updateTeam($pdo, $name, $id)
{
試す {
$data = [
'名前' => $name,
'id' => $id
];
$sql = "UPDATE チーム SET name = :name WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
// $pdo->commit();
}
catch (PDOException $e) {
db::$pdo->rollback();
error_log('失敗: ' . $e->getMessage() );
}
catch (例外 $exc) {
db::$pdo->rollback();
error_log('失敗: ' . $exc->getMessage());
}
}
</code></pre>
<p>送信しないでください。これを機能させるには $pdo->commit(); のコメントを解除する必要がありますが、アプリケーション内のすべてのクエリ ステートメントを変更する必要があるため、これは望ましくありません。 </p><p>PDO 設定で何を忘れましたか? var_dump($pdo->query('SELECT @@autocommit')->fetchAll()); を試してみましたが、結果は </p><p><code></code>< でした。 /p>
<pre class="brush:php;toolbar:false;">array(1) { [0]=> array(2) { ["@@autocommit"]=> string(1) "0" [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 サーバーへの呼び出しが 2 回行われ、MySQL の自動コミット値が 1 に設定されるはずです