PHPでデータベース操作を実行するとき、 MySQLIはオブジェクト指向の手続き型インターフェイスを提供する非常に一般的な拡張機能です。今日は、MySQLI :: STMT_INIT機能とトランザクションコントロール( begin_transaction 、 commit 、 lollback )を組み合わせて、データベース操作の安定性と効率を改善する方法について説明します。
mysqli :: stmt_initは、preprocessingステートメントの初期化に使用されるmysqliクラスのメソッドです。準備されたステートメントは、SQLインジェクション攻撃を防ぐだけでなく、データベースクエリの実行効率を改善することもできます。前処理ステートメントを使用すると、クエリステートメントが1回解析され、実行中に異なるパラメーターを渡すことができるため、SQLステートメントの繰り返し解析のオーバーヘッドが減少します。
データベースでは、トランザクションとは、成功または失敗のいずれかのデータベース操作のセットを指します。トランザクションは、データの一貫性と信頼性を確保します。トランザクションの基本操作には次のものがあります。
begin_transaction :トランザクションを開始します。
コミット:データベースの変更が有効になるようにトランザクションをコミットします。
ロールバック:ロールバックトランザクションとトランザクションのすべての操作を取り消します。
複数のデータベース操作を実行している場合、これらの操作が成功するか失敗するかを確認する必要がある場合があります。これを実現するには、トランザクションコントロールを使用できます。
mysqli :: stmt_initを使用すると、トランザクション制御が複数のデータベース操作の安定性を確保できます。実行中に操作が失敗した場合、トランザクションをロールバックして実行されたすべての操作を取り消すことができ、データベースの一貫性を確保できます。
MySqli :: STMT_INITとトランザクションコントロールを組み合わせたPHPコードの例を次に示します。
<?php
// データベース接続を作成します
$mysqli = new mysqli("localhost", "username", "password", "database_name");
// 接続が成功しているかどうかを確認してください
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// トランザクションを開始します
$mysqli->begin_transaction();
try {
// 前処理ステートメントを初期化します
$stmt = $mysqli->stmt_init();
// 最初の挿入操作
if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {
$username = 'user1';
$email = 'user1@m66.net';
$stmt->bind_param("ss", $username, $email);
$stmt->execute();
} else {
throw new Exception("声明の作成に失敗しました");
}
// 2番目の挿入操作
if ($stmt->prepare("INSERT INTO orders (user_id, product) VALUES (?, ?)")) {
$user_id = 1; // ユーザーを仮定しますIDのために1
$product = 'Product A';
$stmt->bind_param("is", $user_id, $product);
$stmt->execute();
} else {
throw new Exception("声明の作成に失敗しました");
}
// トランザクションを送信します
$mysqli->commit();
echo "トランザクションは正常に送信されました!";
} catch (Exception $e) {
// エラーが発生したときにトランザクションをロールバックします
$mysqli->rollback();
echo "トランザクションロールバック: " . $e->getMessage();
}
// 接続を閉じます
$mysqli->close();
?>
データベース接続を確立する:新しいmysqli()関数を使用して、mysqlデータベースに接続します。接続が失敗した場合、プログラムはエラーメッセージを出力し、実行を停止します。
トランザクションの開始: $ mysqli-> begin_transaction()を使用してトランザクションを開始します。トランザクションが開始された後、トランザクションがコミットまたはロールバックされるまで、すべてのデータベース操作がトランザクションで実行されます。
前処理ステートメントを初期化して準備する: $ mysqli-> stmt_init()メソッドを使用して、プリプロセシングステートメントオブジェクトを初期化します。次に、 $ stmt-> prepare()メソッドを使用して、SQLクエリを準備します。
バインドパラメーターと実行: $ stmt-> bind_param()メソッドを使用して、SQLステートメントにパラメーターをバインドして、データが安全に挿入されるようにします。次に、 $ stmt-> execute()を使用して、プリプロセシングステートメントを実行します。
コミットまたはロールバックトランザクション:すべての操作が成功した場合、 $ mysqli-> commit()を使用してトランザクションをコミットし、すべての変更をデータベースに保存します。実行中にエラーが発生した場合、例外がスローされ、 Catchステートメントブロックで$ mysqli-> rollback()を使用してトランザクションがロールバックされ、以前のすべての操作を取り消します。
接続の接続:操作が完了したら、 $ mysqli-> close()を介してデータベース接続を閉じます。
mysqli :: stmt_initとトランザクションコントロールを組み合わせることで、次の利点を享受できます。
SQL注入の防止:前処理ステートメントを使用すると、SQL注入攻撃を効果的に防ぐことができます。
効率の向上:前処理ステートメントは、実行時にSQLを繰り返し解析する必要はありません。データベースの負担が軽減されます。
データの一貫性を確保する:トランザクション制御により、データベース操作の原子性が確保されます。
例外処理:操作中にエラーが発生した場合、トランザクションをロールバックして、データベースが破損していないことを確認できます。
MySQLI :: STMT_INIT関数とトランザクションコントロール( begin_transaction 、 commit 、 lollback )を組み合わせることで、データベース操作のPHPプログラムの安定性と効率を改善できます。これにより、SQLインジェクションの問題を効果的に回避するだけでなく、複数のデータベース操作が失敗し、データの破損を回避すると、データの一貫性が保証されます。