3

誰かが私にここでいくつかの洞察を与えることができることを願っています。

一度に複数の行をテーブルに挿入する必要がある場合、次のようなsqlを使用しました。

INSERT INTO some_names (firstName, lastName) VALUES ('Joe', 'Smith'),('Fred','Sampson'),('Lisa','Pearce')

ご覧のとおり、1つのステートメントで3つの行を挿入しています。これを行う理由は、行を挿入するために3つの異なるステートメントを実行するよりも効率的であると信じているためです。

だから私の質問はこれです:自分の値をステートメントにバインドできるようにしたい場合、これをどのように行うのですか?残念ながら、私はWeb全体を調べてきましたが、次の形式の単一ステートメントの例しか見つかりません。

$stmt = $mysqli->prepare("INSERT INTO some_names (firstName, lastName) VALUES (?, ?)");
$stmt->bind_param('ss', $firstName, $lastName);
$firstName = "Joe";
$lastName = "Smith";
$stmt->execute();
$firstName = "Fred";
$lastName = "Sampson";
$stmt->execute();

これは、個別のINSERTステートメントを実行するのと同等であり、効率が低いようです。

だから私の質問は:複数挿入ステートメントでバインドする方法はありますか?ここで私を教育してください!ありがとう

4

3 に答える 3

7

単純:

$stmt = $mysqli->prepare("INSERT INTO some_names (firstName, lastName) VALUES (?, ?),(?,?),(?,?)")
$stmt->bind_param('ssssss', 'Joe', 'Smith','Fred','Sampson','Lisa','Pearce');
于 2013-03-23T11:36:11.183 に答える
4

これは、個別のINSERTステートメントを実行するのと同等であり、効率が低いようです。

いいえ、効率は低下しません。ステートメントは1回だけ作成され(実行内容を理解するため)、その後はデータのみがデータベースに送信されるためです。

于 2013-03-22T16:52:00.217 に答える
0

あなたはこれを間違った方法で見ています。

上に示したようなことをすることはほとんどありません。ほとんどの場合、ループで行われます。また、動的に構築した(?, ?), (?, ?), (?, ?)場合でも、クエリ文字列を構築してデータをバインドするためにループする必要があります(これは、MySQLiの参照によるバインディングに対するばかげた支援のためにさらに複雑になります)。 PHPで実行する必要のある作業(ループを移動しただけです)を実行すると、読みやすさの点で多くの損失が発生します。

データベースへのラウンドトリップにはメリットがあります(常に複数の行を挿入していると仮定します)-しかし、これは、数百または数千または行を挿入する場合にのみ意味のある違いをもたらします。この場合、何らかの種類の行を実行している可能性があります。インポート操作。この場合、余分な数秒はおそらく問題ではありません(たとえば、ページの読み込みが遅くなることはありません)。

于 2013-03-22T16:42:35.810 に答える