mysqli_stmt::prepare
mysqli_stmt_prepare
SQL ステートメントを実行するために準備する
説明
オブジェクト指向型
public bool mysqli_stmt::prepare(string $query
)
bool mysqli_stmt_prepare(mysqli_stmt $statement
, string $query
)
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_execute
- mysqli_stmt_fetch
- mysqli_stmt_bind_param
- mysqli_stmt_bind_result
- mysqli_stmt_get_result
- mysqli_stmt_close