MySQL では PDO の自動送信機能が有効になっており、自動コミットはオフになっています
<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>