SQL ステートメントを実行するために準備する

# mysqli_stmt::prepare

# mysqli_stmt_prepare

(PHP 5, PHP 7, PHP 8)

mysqli_stmt::prepare -- mysqli_stmt_prepare — SQL ステートメントを実行するために準備する

### 説明

オブジェクト指向型

public function mysqli_stmt::prepare(string `$query`): bool

手続き型

function mysqli_stmt_prepare(mysqli_stmt `$statement`, string `$query`): bool

実行する前にSQL文を準備します。 指定するクエリは、単一のSQL文でなければいけません。

SQL文のテンプレートには、ゼロ個以上のパラメータマーカ (`?`) を含めることができます。 パラメータマーカは、プレースホルダとも呼ばれています。 パラメータマーカは、ステートメントを実行する前に mysqli_stmt_bind_param() を使用して アプリケーション変数にバインドする必要があります。

> 注意:

> サーバーの `max_allowed_packet` よりも長いステートメントを mysqli_stmt_prepare() に渡した場合、 返ってくるエラーコードは MySQL Native Driver (`mysqlnd`) を使っているか MySQL Client Library (`libmysqlclient`) を使っているかで異なります。 それぞれ、次のように振る舞います。

> - Linux 上の `mysqlnd` では、エラーコード 1153 を返します。 エラーメッセージは got a packet bigger than `max_allowed_packet` bytes です。

> - Windows 上の `mysqlnd` では、エラーコード 2006 を返します。 エラーメッセージは server has gone away です。

> - すべてのプラットフォームの `libmysqlclient` では、エラーコード 2006 を返します。エラーメッセージは server has gone away です。

### パラメータ

`stmt`
  手続き型のみ: mysqli_stmt_init() が返す mysqli_stmt オブジェクト。
`query`

  クエリを表す文字列。単一の SQL 文で構成されている必要があります。

  SQL文には、適切な位置にゼロ個以上のパラメータマーカを含めることができます。 パラメータマーカは、クエスチョンマーク(`?`)で表します。

  > 注意:

  > パラメータのマーカは、それが SQL 文の適切な位置にある場合のみ 有効です。例えば INSERT 文の VALUES() リストの中 (行に登録するカラムの値を指定する) や `WHERE` 句でカラムのデータと比較する値などが適切な位置の例です。 しかし、識別子 (テーブルやカラムの名前) には使用できません。

### 戻り値

成功した場合に `true` を、失敗した場合に `false` を返します。

### エラー / 例外

mysqli のエラー報告 (`MYSQLI_REPORT_ERROR`) が有効になっており、かつ要求された操作が失敗した場合は、警告が発生します。さらに、エラー報告のモードが `MYSQLI_REPORT_STRICT` に設定されていた場合は、mysqli_sql_exception が代わりにスローされます。

### 例

例1 mysqli_stmt::prepare() の例

オブジェクト指向型

    <?php

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");

    $city = "Amersfoort";

    /* プリペアドステートメントを作成します */
    $stmt = $mysqli->stmt_init();
    $stmt->prepare("SELECT District FROM City WHERE Name=?");

    /* マーカにパラメータをバインドします */
    $stmt->bind_param("s", $city);

    /* クエリを実行します */
    $stmt->execute();

    /* 結果変数をバインドします */
    $stmt->bind_result($district);

    /* 値を取得します */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

手続き型

    <?php

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect("localhost", "my_user", "my_password", "world");

    $city = "Amersfoort";

    /* プリペアドステートメントを作成します */
    $stmt = mysqli_stmt_init($link);
    mysqli_stmt_prepare($stmt, "SELECT District FROM City WHERE Name=?");

    /* マーカにパラメータをバインドします */
    mysqli_stmt_bind_param($stmt, "s", $city);

    /* クエリを実行します */
    mysqli_stmt_execute($stmt);

    /* 結果変数をバインドします */
    mysqli_stmt_bind_result($stmt, $district);

    /* 値を取得します */
    mysqli_stmt_fetch($stmt);

    printf("%s is in district %s\n", $city, $district);

上の例の出力は以下となります。

    Amersfoort is in district Utrecht

### 参考

- mysqli_stmt_init() - ステートメントを初期化し、mysqli_stmt_prepare で使用するオブジェクトを返す
- mysqli_stmt_execute() - プリペアドステートメントを実行する
- mysqli_stmt_fetch() - プリペアドステートメントから結果を取得し、バインド変数に格納する
- mysqli_stmt_bind_param() - プリペアドステートメントのパラメータに変数をバインドする
- mysqli_stmt_bind_result() - 結果を保存するため、プリペアドステートメントに変数をバインドする
- mysqli_stmt_get_result() - プリペアドステートメントから結果を mysqli_result オブジェクトとして取得する
- mysqli_stmt_close() - プリペアドステートメントを閉じる

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