PHP MySQL 複数データの挿入


MySQLi と PDO を使用して MySQL に複数のデータを挿入する

mysqli_multi_query() 関数は複数の SQL 文を実行するために使用できます。

次の例では、"MyGuests" テーブルに3つの新しいレコードを追加します:

例 (MySQLi - オブジェクト指向)

<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; //接続を作成 $conn = new mysqli($servername, $username, $password, $dbname); //接続を確認 if ($conn->connect_error) { die("接続失敗:" . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', '[email protected]');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', '[email protected]')"; if ($conn->multi_query($sql) === TRUE) { echo "新しいレコードの挿入に成功しました"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>


Note 各 SQL 文はセミコロンで区切る必要があることに注意してください。

例 (MySQLi - 手続き型)

<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; //接続を作成 $conn = mysqli_connect($servername, $username, $password, $dbname); //接続を確認 if (!$conn) { die("接続失敗:" . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', '[email protected]');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', '[email protected]')"; if (mysqli_multi_query($conn, $sql)) { echo "新しいレコードの挿入に成功しました"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>


例 (PDO)

<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //トランザクションを開始 $conn->beginTransaction(); //SQL 文 $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]')"); $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', '[email protected]')"); $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', '[email protected]')"); //トランザクションをコミット $conn->commit(); echo "新しいレコードの挿入に成功しました"; } catch(PDOException $e) { //実行に失敗した場合はロールバック $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>



プリペアドステートメントを使用する

mysqli 拡張機能は、挿入ステートメントに2番目の方法を提供します。

プリペアドステートメントとパラメータのバインドを使用できます。

mysql 拡張機能は、データなしでステートメントやクエリを MySQL データベースに送信できます。 列に関連付ける、つまり変数を「バインド」することができます。

例 (MySQLi でプリペアドステートメントを使用)

<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; //接続を作成 $conn = new mysqli($servername, $username, $password, $dbname); //接続をチェック if ($conn->connect_error) { die("接続失敗:" . $conn->connect_error); } else { $sql = "INSERT INTO MyGuests(firstname, lastname, email) VALUES(?, ?, ?)"; //mysqli_stmt_prepare() のために statement オブジェクトを初期化 $stmt = mysqli_stmt_init($conn); //プリペアドステートメント if (mysqli_stmt_prepare($stmt, $sql)) { //パラメータをバインド mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email); //パラメータを設定して実行 $firstname = 'John'; $lastname = 'Doe'; $email = '[email protected]'; mysqli_stmt_execute($stmt); $firstname = 'Mary'; $lastname = 'Moe'; $email = '[email protected]'; mysqli_stmt_execute($stmt); $firstname = 'Julie'; $lastname = 'Dooley'; $email = '[email protected]'; mysqli_stmt_execute($stmt); } } ?>

上記の例では、モジュール化を使用して問題を処理していることがわかります。コードブロックを作成することで、より簡単に読み取りと管理を実現できます。

パラメータのバインドに注意してください。mysqli_stmt_bind_param() のコードを見てみましょう:

mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);

この関数はパラメータをクエリにバインドし、データベースにパラメータを渡します。2番目のパラメータは "sss" です。以下のリストはパラメータのタイプを示しています。s 文字は、パラメータが文字列であることを MySQL に伝えます。

次の4つのパラメータを使用できます:

  • i - 整数
  • d - 倍精度浮動小数点数
  • s - 文字列
  • b - バイナリ BLOB ストレージオブジェクト

各パラメータに型を指定して、データの安全性を保証する必要があります。型を判断することで、SQL インジェクションの脆弱性によるリスクを減らすことができます。

その他の拡張機能