Php/docs/mysqli-stmt.prepare

提供:Dev Guides
< Php
移動先:案内検索

mysqli_stmt::prepare

mysqli_stmt_prepare

(PHP 5, PHP 7)

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


説明

オブジェクト指向型

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 than max_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

参考