mysqli_stmt::prepare

mysqli_stmt_prepare

(PHP 5, PHP 7, PHP 8)

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

説明

オブジェクト指向型

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

手続き型

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 句で列のデータと比較する値などが適切な位置の例です。

しかし、識別子 (テーブルやカラムの名前) や SELECT 文で選択する 項目の名前に指定したり、(等号 = のような) 二項演算子の両側にパラメータを指定したりすることはできません。 後者の制限は、パラメータの型が判断できなくなることによるものです。 一般に、パラメータが使用可能なのはデータ操作言語 (DML) ステートメントであり、データ定義言語 (DDL) ステートメントでは 使用できません。

戻り値

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

例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() - プリペアドステートメントを閉じる

関連キーワード:  stmt, mysqli, ステートメント, パラメータ, 実行, prepare, 準備, プリペアドステートメント, マーカ, エラーコード