db2_prepare
(PECL ibm_db2 >= 1.0.0)
db2_prepare — 実行する SQL 文を準備する
説明
db2_prepare() は、プリペアドステートメントを作成します。
このプリペアドステートメントには、入力パラメータ・出力パラメータ
あるいは入出力パラメータを表すパラメータマーカ (?
)
を含めることができます。プリペアドステートメントにパラメータを渡すには
db2_bind_param() を使用します。
入力パラメータの場合についてのみ、db2_execute()
に渡す配列で指定することも可能です。
アプリケーション内でプリペアドステートメントを使用する利点は、 以下の 3 つです。
-
パフォーマンス: 事前に文を準備しておくと、 その文によってデータを取得するための実行計画をデータベースサーバーが 最適化します。その後 db2_execute() でプリペアドステートメントを実行する際にはこの実行計画が再利用され、 実行時に実行計画を毎回作成することによるオーバーヘッドを避けられます。
-
セキュリティ: 事前に文を準備する際に、 入力値にパラメータマーカを含めることができます。 入力値にプレースホルダを使用してプリペアドステートメントを実行すると、 入力値の型がカラム定義あるいはパラメータ定義と一致することを データベースサーバーがチェックします。
-
高機能: パラメータマーカの機能は、 単に入力値をプリペアドステートメントに渡すだけではありません。 db2_bind_param() を使用すると、 ストアドプロシージャの OUT パラメータおよび INOUT パラメータから 値を取得することも可能です。
パラメータ
connection
-
db2_connect() あるいは db2_pconnect() が返した有効なデータベース接続リソース。
statement
-
ひとつ以上のパラメータマーカを含む SQL 文。
options
-
文のオプションを含む連想配列。 データベースサーバーがその機能をサポートしている場合に、 このパラメータを使用してスクロール可能なカーソルの使用を 要求することができます。
オプションについての説明は db2_set_option() を参照ください。
戻り値
SQL 文のパースに成功し、データベースサーバー内で正しく準備された場合に
ステートメントリソースを返します。データベースサーバーがエラーを返した場合に
false
を返します。返されたエラーの詳細を調べるには、
db2_stmt_error() あるいは db2_stmt_errormsg()
をコールします。
例
例1 パラメータマーカを使用した SQL 文の準備と実行
以下の例では、4 つのパラメータマーカを含む INSERT 文を準備し、 入力値の配列を含む配列を順に処理しながら db2_execute() に値を渡します。
<?php
$animals = array(
array(0, 'cat', 'Pook', 3.2),
array(1, 'dog', 'Peaches', 12.3),
array(2, 'horse', 'Smarty', 350.0),
);
$insert = 'INSERT INTO animals (id, breed, name, weight)
VALUES (?, ?, ?, ?)';
$stmt = db2_prepare($conn, $insert);
if ($stmt) {
foreach ($animals as $animal) {
$result = db2_execute($stmt, $animal);
}
}
?>
参考
- db2_bind_param() - PHP 変数を SQL 文のパラメータにバインドする
- db2_execute() - プリペアドステートメントを実行する
- db2_stmt_error() - SQL 文が返す SQLSTATE を含む文字列を返す
- db2_stmt_errormsg() - 直近の SQL 文のエラーメッセージを含む文字列を返す
User Contributed Notes 3 notes
A simple select example.
$pr_stmt = db2_prepare ($this->conn,"select count(*) from note where city=? and year= ?");
db2_execute($pr_stmt,array('test',2016));
$count_res = db2_fetch_array($pr_stmt);
echo "Count =".$count_res[0]
If you are having problems with scrollable cursors and the prepare statement, I've found that you cant set the scrollable option on the connection. The following code (which tries to get the 2nd record):
<?php
$sql = "SELECT * FROM SCHEMA.TABLENAME";
$options = array('cursor' => DB2_SCROLLABLE);
$conn = db2_connect($database, $user, $password,$options);
$stmt = db2_prepare($conn, $sql);
$result = db2_execute($stmt);
$row = db2_fetch_both($stmt, 2);
$conn = db2_connect($database, $user, $password);
$stmt = db2_prepare($conn, $sql, $options);
$result = db2_execute($stmt);
$row = db2_fetch_both($stmt, 2);
?>
Will result in the following error:
Warning: db2_fetch_both() [function.db2-fetch-both]: Fetch Failure in dbtest.php on line 7
In fact, even if you set the options on both the connection and the prepare your fetch will not work. You must only set that option on the prepare.
if you have the error message : PHP Warning: db2_prepare() [<a href='function.db2-prepare'>function.db2-prepare</a>]: Statement Prepare Failed in (....)
and cannot display the error message using db2_stmt_errormsg() , then check if your database connection handle is (still) valid