MySQL では PDO の自動送信機能が有効になっており、自動コミットはオフになっています
P粉011912640
P粉011912640 2023-08-08 15:23:46
0
1
504
<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>
P粉011912640
P粉011912640

全員に返信(1)
P粉799885311

PDO の自動送信は、MySQL の自動送信とは異なります。これは、MySQL 構成で autocommit の値をデフォルトの 0 に設定しても、PDO::ATTR_AUTOCOMMIT のデフォルト値は変更されないことを意味します。 PDO::ATTR_AUTOCOMMIT のデフォルト値は常に true です。

PDO::ATTR_AUTOCOMMIT の値を同じ値、またはブール値や整数以外の値に変更しても無視されます。これは、両方の操作が何も行われないことを意味します:

リーリー

PDO::ATTR_AUTOCOMMIT:

を無効または有効にすることで、これを騙すことができます。 リーリー

これにより、MySQL サーバーへの呼び出しが 2 回行われ、MySQL の自動コミット値が 1 に設定されるはずです

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート