pg_query_params
(PHP 5 >= 5.1.0, PHP 7)
pg_query_params —
SQL コマンドとパラメータを分割してサーバーにを送信し、その結果を待つ
説明
resource pg_query_params
([ resource $connection
], string $query
, array $params
)
pg_query_params() は pg_query()
と似ていますが、追加の機能を有しています。それはパラメータ値が
コマンド文字列と分離しているということです。
pg_query_params() は PostgreSQL 7.4 以降の接続でのみ
サポートされます。それ以前のバージョンでは失敗します。
パラメータを使用する際は、query
文字列内で
$1、$2 のように参照されます。
query
の中で同じパラメータを何度も使えます。
その場合は、それぞれに同じ値が渡されます。
params
で
実際の値を指定します。NULL
を指定すると、SQL の NULL
とみなされます。
pg_query() に対する pg_query_params()
の最大の利点は、パラメータの値を query
文字列から
分離できることです。そのため、退屈でエラーの元となりやすいクォート・
エスケープなどをしなくてもよくなります。pg_query()
と異なり、pg_query_params() ではひとつの SQL
コマンドしか実行できません(クエリ文字列にセミコロンを含めることは
可能です。しかしそれ以降にコマンドを続けることはできません)。
パラメータ
-
connection
-
PostgreSQL データベース接続リソース。connection
が指定されていない場合はデフォルトの接続が使用されます。
デフォルトの接続は、直近の pg_connect()
あるいは pg_pconnect() によって作成されたものです。
-
query
-
パラメータ化した SQL 文。ひとつの文のみである必要があります
(複数の文をセミコロンで区切る形式は使用できません)。パラメータを
使用する際は $1、$2 などの形式で参照されます。
ユーザーから受け取った値は常にパラメータとして渡すべきです。
直接クエリ文字列に組み込んではいけません。そうしてしまうと、
SQL インジェクション
攻撃を受けてしまう可能性があります。また、クォート文字を含むデータの処理でバグの原因になります。
何らかの理由でパラメータが使えない場合は、値を
適切にエスケープするようにしましょう。
-
params
-
プリペアドステートメント中の $1、$2 などのプレースホルダを
置き換えるパラメータの配列。配列の要素数はプレースホルダの
数と一致する必要があります。
bytea フィールド用の値は、パラメータとして指定できません。
pg_escape_bytea() を使うか、ラージオブジェクト関数を使うようにしましょう。
返り値
成功した場合にクエリ結果リソース、失敗した場合に FALSE
を返します。
例
例1 pg_query_params() の使用法
<?php
// "mary"という名前のデータベースに接続
$dbconn = pg_connect("dbname=mary");
// Joe's Widgets という名前の店を探す。"Joe's Widgets" を
// エスケープする必要がないことに注意
$result = pg_query_params($dbconn, 'SELECT * FROM shops WHERE name = $1', array("Joe's Widgets"));
// pg_query を使用した場合と比較
$str = pg_escape_string("Joe's Widgets");
$result = pg_query($dbconn, "SELECT * FROM shops WHERE name = '{$str}'");
?>