現在の位置: ホーム> 最新記事一覧> bind_paramを使用してstmt_initを使用して、バッチ挿入操作を実行します

bind_paramを使用してstmt_initを使用して、バッチ挿入操作を実行します

M66 2025-05-29

大量のデータ挿入操作を処理する場合、 INSERTステートメントをループする効率が低くなります。パフォーマンスを改善するために、 mysqli :: stmt_initbind_param()を使用して、プリプロセッスされたステートメントのバッチ実行を実装できます。この記事では、この操作を例で効率的に実行する方法について説明します。

1.なぜ前処理ステートメントを使用するのですか?

prepare + bind_paramの使用は、従来の文字列スプライシング方法よりも安全であり、より動的なパラメーターを備えた状況に特に適しています。その利点は次のとおりです。

  • SQL注入は避けてください。

  • 実行効率を改善するために、SQLの繰り返しの編集を避けてください。

  • 優れた読みやすさと明確な構造。

2。mysqli :: stmt_initおよびbind_paramを使用する基本的なプロセス

単純なユーザー情報テーブルユーザーを例として受け取ります。その構造は次のとおりです。

 CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

複数のユーザーレコードを挿入する必要があると仮定します。以下は完全なPHP実装です。

 <?php
// データベース接続構成
$mysqli = new mysqli("localhost", "db_user", "db_pass", "db_name");

// 接続を確認してください
if ($mysqli->connect_errno) {
    die("接続に失敗しました: " . $mysqli->connect_error);
}

// ステートメントオブジェクトを初期化します
$stmt = $mysqli->stmt_init();

// 準備する SQL 声明
$sql = "INSERT INTO users (username, email) VALUES (?, ?)";
if (!$stmt->prepare($sql)) {
    die("前処理に失敗しました: " . $stmt->error);
}

// バインドパラメーター(変数が参照されることに注意してください)
$stmt->bind_param("ss", $username, $email);

// 挿入するデータをシミュレートします
$data = [
    ["alice", "alice@m66.net"],
    ["bob", "bob@m66.net"],
    ["charlie", "charlie@m66.net"]
];

// バッチ挿入を実行します
foreach ($data as $row) {
    $username = $row[0];
    $email = $row[1];
    if (!$stmt->execute()) {
        echo "挿入障害: " . $stmt->error . "<br>";
    }
}

$stmt->close();
$mysqli->close();
?>

3。キーポイントの分析

1。STMT_INIT準備の組み合わせ

$ mysqli-> prepare()略語を直接使用できますが、 STMT_INITを使用して、複雑なプロジェクトや大規模プロジェクトにより適したプロセスを明示的に表現できます。

2。パラメーターバインディングは、ループの外側で完了する必要があります

bind_paramは変数への参照をバインドするため、変数の値をループ内で変更でき、毎回再バインドする必要はありません。

3。エラー処理

execution()の後に返品値を確認すると、挿入に失敗したレコードをすばやく見つけることができます。

4。パフォーマンス最適化の提案

  • バッチの提出:大量のデータ挿入の場合、バッチ(1,000アイテムごとに1つのグループなど)で処理できます。

  • 自動コミット( $ mysqli-> autocommit(false) )をオフにし、バッチが処理された後に均一にトランザクションを送信します。

  • 多値の挿入構文(挿入...値(...)、(...)、...)を使用して、テストパフォーマンスの違いを比較します。

V.結論

mysqli :: stmt_initおよびbind_param()を使用すると、バッチ挿入の効率を改善するだけでなく、アプリケーションのセキュリティと保守性も向上させます。この方法は、大量のユーザーデータやロギングなどのシナリオを扱う場合に特にお勧めします。