mysqli::multi_query
mysqli_multi_query
データベース上でひとつ以上のクエリを実行する
説明
オブジェクト指向型
public bool mysqli::multi_query(string $query
)
bool mysqli_multi_query(mysqli $mysql
, string $query
)
警告
セキュリティ上の注意: SQLインジェクション
クエリに入力値を含める場合は、プリペアドステートメント を使うべきです。使わない場合、データを適切にフォーマットし、全ての文字列は mysqli_real_escape_string を使ってエスケープしなければいけません。
ひとつの呼び出し中に、クエリはデータベースに非同期に送信されますが、
データベースはそれらを順番に実行します。
mysqli_multi_query
は PHP に制御を戻す前に、最初のクエリの実行が完了するのを待ちます。
MySQLサーバーはその後、次のクエリを順番に実行していきます。
次の結果セットの準備が出来ると、
MySQL は PHP 側が mysqli_next_result
を実行するのを待ちます。
複数のクエリを処理するために、
do-while ループ
を使うことを推奨します。
全てのクエリの実行が完了し、結果を PHP が取得するまで、
接続はビジー状態になります。
次のクエリを順番に実行するには、
mysqli_next_result を使います。
次の結果セットの準備ができていない場合、
mysqli は MySQLサーバーからの応答を待ちます。
更に結果セットがあるかどうかを調べるには
mysqli_more_results を使います。
SELECT, SHOW, DESCRIBE
や
EXPLAIN
のように
結果セットを生成するクエリについては、
結果セットを取得するために
mysqli_use_result や
mysqli_store_result が使えます。
結果セットを生成しないクエリについては、
影響した行数のような情報を取得するために、
同じ関数が使えます。
ヒント
ストアドプロシージャを実行するために
CALL
を実行すると、
複数の結果セットが生じる場合があります。
ストアドプロシージャに
SELECT
が含まれている場合、
結果セットは実行されるプロシージャが生成する順番で返されます。
一般的には、呼び出し側はどの程度の量、
結果セットが返されるかはわからないので、
複数の結果を取得する準備をしておかなければいけません。
プロシージャの最終的な実行結果は、結果ステータスです。
結果ステータスには、結果セットが存在しないことも含みます。
この結果ステータスは、プロシージャが成功したか、
エラーが発生したかを示します。
パラメータ
-
link
-
手続き型のみ:
mysqli_connect あるいは mysqli_init が返す mysqliオブジェクト。
-
query
-
実行されるクエリを含む文字列。
複数のクエリの場合、セミコロンで区切らなければいけません。
戻り値
最初のステートメントが失敗した場合にのみ false
を返します。
その他のステートメントのエラーを取得するには、まず
mysqli_next_result をコールする必要があります。
エラー / 例外
mysqli のエラー報告 (MYSQLI_REPORT_ERROR
) が有効になっており、かつ要求された操作が失敗した場合は、警告が発生します。さらに、エラー報告のモードが MYSQLI_REPORT_STRICT
に設定されていた場合は、mysqli_sql_exception が代わりにスローされます。
例
例1 mysqli::multi_query の例
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* 複数のクエリを実行します */
$mysqli->multi_query($query);
do {
/* PHP 側に結果セットを保存します */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
}
/* 区切り線を出力します */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* 複数のクエリを実行します */
mysqli_multi_query($link, $query);
do {
/* PHP 側に結果セットを保存します */
if ($result = mysqli_store_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
}
/* 区切り線を出力します */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (mysqli_next_result($link));
my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer
参考
- mysqli_query
- mysqli_use_result
- mysqli_store_result
- mysqli_next_result
- mysqli_more_results