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

# mysqli::multi_query

# mysqli_multi_query

(PHP 5, PHP 7, PHP 8)

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

### 説明

オブジェクト指向型

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

手続き型

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

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

警告

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

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

クエリはひとつの呼び出しでデータベースに送信され、順番に処理されます。 mysqli_multi_query() は PHP に制御を戻す前に、最初のクエリの実行が完了するのを待ちます。 その間、MySQL サーバーは PHP とは非同期に残りのクエリの処理を続け、 結果を取得できる状態にします。

複数のクエリを処理するために、 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() - multi_query の、次の結果を準備する
- mysqli_more_results() - マルチクエリからの結果がまだ残っているかどうかを調べる

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open