PHP 8.4.0 RC4 available for testing

db2_prepare

(PECL ibm_db2 >= 1.0.0)

db2_prepare 実行する SQL 文を準備する

説明

db2_prepare(resource $connection, string $statement, array $options = []): resource|false

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);
}
}
?>

参考

add a note

User Contributed Notes 3 notes

up
0
NormInNorman
14 years ago
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.
up
-1
agr dot valayam at gmail dot com
8 years ago
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]
up
-2
ndt.db2 at google mail
18 years ago
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
To Top