mysqli_stmt::prepare
mysqli_stmt_prepare
(PHP 5, PHP 7)
mysqli_stmt::prepare -- mysqli_stmt_prepare — SQL ステートメントを実行するために準備する
説明
オブジェクト指向型
public mysqli_stmt::prepare
( string $query
) : mixed
手続き型
mysqli_stmt_prepare
( mysqli_stmt $stmt
, string $query
) : bool
null で終わる文字列で指定した SQL クエリを準備します。
パラメータマーカは、ステートメントの実行や行の取得の前に mysqli_stmt_bind_param() や mysqli_stmt_bind_result() を使用して アプリケーション変数にバインドする必要があります。
注意:
サーバーの
max_allowed_packet
よりも長いステートメントを mysqli_stmt_prepare() に渡した場合、 返ってくるエラーコードは MySQL Native Driver (mysqlnd
) を使っているか MySQL Client Library (libmysqlclient
) を使っているかで異なります。 それぞれ、次のように振る舞います。
- Linux 上の
mysqlnd
では、エラーコード 1153 を返します。 エラーメッセージは “got a packet bigger thanmax_allowed_packet
bytes” です。- Windows 上の
mysqlnd
では、エラーコード 2006 を返します。 エラーメッセージは “server has gone away” です。- すべてのプラットフォームの
libmysqlclient
では、エラーコード 2006 を返します。エラーメッセージは “server has gone away” です。
パラメータ
stmt
手続き型のみ: mysqli_stmt_init() が返すステートメント ID。
query
クエリを表す文字列。単一の SQL 文で構成されている必要があります。
ひとつまたは複数のパラメータを SQL 文に含めることができます。 そのためには、適切な位置にクエスチョンマーク (
?
) を埋め込みます。注意:
ステートメントの最後にセミコロンや
\g
を追加してはいけません。注意:
パラメータのマーカは、それが SQL 文の適切な位置にある場合のみ 有効です。例えば INSERT 文の VALUES() リストの中 (行に登録するカラム値を指定する) や WHERE 句で列のデータと比較する値などが適切な位置の例です。
しかし、識別子 (テーブルやカラムの名前) や SELECT 文で選択する 項目の名前に指定したり、(等号
=
のような) 二項演算子の両側にパラメータを指定したりすることはできません。 後者の制限は、パラメータの型が判断できなくなることによるものです。 また、パラメータのマーカをNULL
と比較して? IS NULL
のようにすることもできません。 一般に、パラメータが使用可能なのはデータ操作言語 (DML) ステートメントであり、データ定義言語 (DDL) ステートメントでは 使用できません。
返り値
成功した場合に true
を、失敗した場合に false
を返します。
例
例1 オブジェクト指向型
<?php$mysqli = new mysqli("localhost", "my_user", "my_password", "world");/* 接続状況をチェックします */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}$city = "Amersfoort";/* プリペアドステートメントを作成します */$stmt = $mysqli->stmt_init();if ($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); /* ステートメントを閉じます */ $stmt->close();}/* 接続を閉じます */$mysqli->close();?>
例2 手続き型
<?php$link = mysqli_connect("localhost", "my_user", "my_password", "world");/* 接続状況をチェックします */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}$city = "Amersfoort";/* プリペアドステートメントを作成します */$stmt = mysqli_stmt_init($link);if (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); /* ステートメントを閉じます */ mysqli_stmt_close($stmt);}/* 接続を閉じます */mysqli_close($link);?>
上の例の出力は以下となります。
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_stmt_close() - プリペアドステートメントを閉じる