connect_error)">
私は、PDO のみを使用する従来の PHP コードベースに割り当てられたところです。
接続は次のパターンを使用して行われます。
// MySQL データベースに接続します $con = new mysqli($host, $user, $password, $database); // 接続を確認する if ($con->connect_error) { die("接続に失敗しました: " . $con->connect_error); } $con->autocommit(true);
そして、MySQL サーバーが SET autocommit = 0 で構成されている場合でも、その autocommit(true) を使用すると、期待どおりに機能します。
今、通常の SQL からプリペアド ステートメントに移行しようとしているので、これを書きました
$dsn = "mysql:host=$host;dbname=$database"; $pdo = 新しい PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, true); $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
および以下の関数例
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()); } }
送信しないでください。これを機能させるには $pdo->commit(); のコメントを解除する必要がありますが、アプリケーション内のすべてのクエリ ステートメントを変更する必要があるため、これは望ましくありません。
PDO 設定で何を忘れましたか? var_dump($pdo->query('SELECT @@autocommit')->fetchAll()); を試してみましたが、結果は
< でした。 /p>
array(1) { [0]=> array(2) { ["@@autocommit"]=> string(1) "0" [0]=> string(1) "0" } }
PDO の自動送信は、MySQL の自動送信とは異なります。これは、MySQL 構成で autocommit の値をデフォルトの 0 に設定しても、PDO::ATTR_AUTOCOMMIT のデフォルト値は変更されないことを意味します。 PDO::ATTR_AUTOCOMMIT のデフォルト値は常に true です。
PDO::ATTR_AUTOCOMMIT の値を同じ値、またはブール値や整数以外の値に変更しても無視されます。これは、両方の操作が何も行われないことを意味します:
リーリーPDO::ATTR_AUTOCOMMIT:
を無効または有効にすることで、これを騙すことができます。 リーリーこれにより、MySQL サーバーへの呼び出しが 2 回行われ、MySQL の自動コミット値が 1 に設定されるはずです