mysqli::multi_query

mysqli_multi_query

(PHP 5, PHP 7, PHP 8)

mysqli::multi_query -- mysqli_multi_queryデータベース上でひとつ以上のクエリを実行する

説明

オブジェクト指向型

public mysqli::multi_query(string $query): bool

手続き型

mysqli_multi_query(mysqli $mysql, string $query): bool

セミコロンで連結されたひとつまたは複数のクエリを実行します。

ひとつの呼び出し中に、クエリはデータベースに非同期に送信されますが、 データベースはそれらを順番に実行します。 mysqli_multi_query() は PHP に制御を戻す前に、最初のクエリの実行が完了するのを待ちます。 MySQLサーバはその後、次のクエリを順番に実行していきます。 次の結果セットの準備が出来ると、 MySQL は PHP 側が mysqli_next_result() を実行するのを待ちます。

複数のクエリを処理するために、 do-while ループ を使うことを推奨します。 全てのクエリの実行が完了し、結果を PHP が取得するまで、 接続はビジー状態になります。 次のクエリを順番に実行するには、 mysqli_next_result() を使います。 次の結果セットの準備ができていない場合、 mysqli は MySQLサーバからの応答を待ちます。 更に結果セットがあるかどうかを調べるには mysqli_more_results() を使います。

SELECT, SHOW, DESCRIBEEXPLAIN のように 結果セットを生成するクエリについては、 結果セットを取得するために mysqli_use_result()mysqli_store_result() が使えます。 結果セットを生成しないクエリについては、 影響した行数のような情報を取得するために、 同じ関数が使えます。

ヒント

ストアドプロシージャを実行するために CALL を実行すると、 複数の結果セットが生じる場合があります。 ストアドプロシージャに SELECT が含まれている場合、 結果セットは実行されるプロシージャが生成する順番で返されます。 一般的には、呼び出し側はどの程度の量、 結果セットが返されるかはわからないので、 複数の結果を取得する準備をしておかなければいけません。 プロシージャの最終的な実行結果は、結果ステータスです。 結果ステータスには、結果セットが存在しないことも含みます。 この結果ステータスは、プロシージャが成功したか、 エラーが発生したかを示します。

パラメータ

link

手続き型のみ: mysqli_connect() あるいは mysqli_init() が返す mysqliオブジェクト。

query

実行されるクエリを含む文字列。 複数のクエリの場合、セミコロンで区切らなければいけません。

警告

セキュリティ上の注意: SQLインジェクション

クエリに入力値を含める場合は、プリペアドステートメント を使うべきです。使わない場合、データを適切にフォーマットし、全ての文字列は mysqli_real_escape_string() を使ってエスケープしなければいけません。

戻り値

最初のステートメントが失敗した場合にのみ false を返します。 その他のステートメントのエラーを取得するには、まず mysqli_next_result() をコールする必要があります。

例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, セット, データベース, result, multi, 取得, next, 複数