現在の位置: ホーム> 最新記事一覧> STMT_INIT(準備されたステートメントループ実行)を使用して複数のステートメントを実行する方法

STMT_INIT(準備されたステートメントループ実行)を使用して複数のステートメントを実行する方法

M66 2025-05-29

PHPでは、MySQLI拡張機能を使用してSQLステートメントを実行するとき、 STMT_INITは非常に有用な機能であり、 MySQLI_STMTオブジェクトを初期化できるため、プレセシングステートメントを実行できます。前処理ステートメントを使用すると、データベースクエリでプレースホルダーを使用して、SQL注入攻撃を防ぐことができます。

時には、実行するたびに異なるパラメーターを使用して、同じ前処理ステートメントを複数回実行する必要がある場合があります。この場合、 STMT_INITを使用して、プリプロセシングステートメントを複数回実行する機能を実装できます。 PHPでSTMT_INITを使用して複数のSQLステートメントを実行する方法を示す例を以下に示します。

 <?php
// 1. データベース接続を作成します
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test_database";

// 接続を作成します
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続が成功しているかどうかを確認してください
if ($conn->connect_error) {
    die("接続に失敗しました: " . $conn->connect_error);
}

// 2. 使用stmt_init前処理ステートメントを初期化します
$stmt = $conn->stmt_init();

// 準備ステートメントが成功しているかどうかを確認してください
if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {

    // 3. 一連のデータをシミュレートします,これらのデータは複数回挿入されます
    $users = [
        ['john_doe', 'john@m66.net'],
        ['jane_doe', 'jane@m66.net'],
        ['alice_smith', 'alice@m66.net'],
    ];

    // 4. 前処理ステートメントのループ実行,ユーザーデータを1つずつ挿入します
    foreach ($users as $user) {
        $username = $user[0];
        $email = $user[1];

        // 前処理ステートメントにパラメーターをバインドします
        $stmt->bind_param("ss", $username, $email);

        // 実行ステートメント
        if ($stmt->execute()) {
            echo "正常に挿入されたユーザー: $username, $email\n";
        } else {
            echo "挿入障害: " . $stmt->error . "\n";
        }
    }

    // 5. 緊密な声明
    $stmt->close();
} else {
    echo "前処理ステートメントの準備に失敗しました: " . $conn->error;
}

// 6. データベース接続を閉じます
$conn->close();
?>

コード説明:

  1. データベース接続を確立する:まず、MySQLデータベースに接続する必要があります。この例では、 LocalHostがサーバーとして使用されているため、実際の状況に応じて接続パラメーターを調整する必要があります。

  2. 初期化ステートメント$ conn-> stmt_init()を使用して、実行する準備ができたステートメントオブジェクトを初期化します。次に、準備方法を介して前処理されたSQLステートメントを設定します。この例では、ユーザーテーブルにユーザー名電子メールフィールドを挿入するステートメントに挿入を準備しています。

  3. バインドパラメーターBIND_PARAMメソッドを介して、PHP変数をプレースホルダーにプリセシングステートメントのプレースホルダーにバインドします。 「SS」パラメーターは、2つの文字列型パラメーターにバインドされることを意味します。

  4. ループ実行foreachループでは、複数のユーザーデータセットを含む配列を渡します。各ループ、実行方法を実行してデータの行を挿入します。

  5. クローズステートメントと接続:操作が完了した後、 close()メソッドを介してSTMTとデータベース接続を閉じます。

アドバンテージ:

  1. SQL注入の防止:前処理ステートメントとパラメーターバインディングを使用するため、このプロセスはSQL注入攻撃を効果的に防ぐことができます。

  2. 高効率:同じクエリステートメントについて、ループすることで異なるパラメーターが実行され、新しいSQLステートメントの繰り返しの作成を回避し、効率を向上させます。

注:

  1. ループを実行するたびに、 bind_param実行メソッドが異なる入力データを正しく処理できることを確認してください。

  2. 大量のデータを処理する必要がある場合は、データベースの接続構成が同時リクエストを処理し、パフォーマンスボトルネックを避けてください。

このようにして、PHPのSTMT_INITを使用してSQLステートメントを効果的に実行し、異なるパラメーターを動的に渡すことができます。この例が、PHPで複数の前処理ステートメントを実行する方法をよりよく理解するのに役立つことを願っています!