2011-12-25 7 views
3

DBIが@bind_valuesを許可する名前付きプレースホルダを使用することはどういうことですか?例えば、私は以下のような発言をしたいと思う:DBIのselectcol_arrayref&Co.で名前付きプレースホルダを使用できますか?

my $s = $DB->selectcol_arrayref ("SELECT a FROM b 
            WHERE c = ? OR d = ? OR e = ?;", 
            {}, 
            $par1, $par2, $par1) or 
     die ($DB->errstr()); 

間違いが起こりにくい。私はDBD :: PgとDBD :: SQLiteを使用しています。 depends on the driverをサポートしているプレースホルダのどのような種類(もしあれば)

+2

プレースホルダのサポート(およびサポートされているプレースホルダの種類)はドライバによって異なるため、いくつかのタグを追加しました。 –

+2

できないと思われる理由はありますか? DBIは '$ ary_ref = $ dbh-> selectcol_arrayref($ステートメント、\%attr、@bind_values)'と言っています。空のハッシュを作成する代わりに、2番目の引数に 'undef'を渡すことができることに注意してください。 – ikegami

+1

@ikegami:DBIメソッドの@bind_values'引数に* named *プレースホルダを使う方法を説明できますか? 'prepare' /' bind_param'/'execute'を使っているのなら、それは簡単ですが、明示的な' bind_param'呼び出しのせずにそれを行う方法を決して分かっていません。 –

答えて

6

プレースホルダとバインドは、値が

一部のドライバはプレースホルダとバインド値をサポートしています。
[...]
一部のドライバは、ようなプレースホルダをも可能にする:に加えて、N(2など、例えば、:::1の名前は?ですが、その使用は移植性がありません。

しかし、あなたは運がいい、パラメータを名前付きまたは番号PostgreSQL driverサポート:

DBDで使用可能なプレースホルダの3種類:: Pgがあります。最初は "疑問符"タイプで、各プレースホルダは単一の疑問符文字で表されます。
[...]
方法2番目のプレースホルダは「ドル記号の数字」です。
[...]
最後のプレースホルダタイプは、 ":foo"という形式の "名前付きパラメータ"です。

そしてSQLite driverはまた、それらをサポートしています。

SQLiteは含めて、いくつかのプレースホルダ式をサポートしていますか?と:AAAA。

欠点は、あなたがselectcol_arrayref$sth->execute(1,2,3)ノートのような便利に使用することはできませんので、あなたが名前付きパラメータでbind_param多くを使用して終わるだろうということです。誰もが名前のプレースホルダを使用する方法を知っている場合はexecute私はコメントの中のいくつかのポインタに感謝したい、私はそれを行う方法を決して考えていない)。ただし、数値プレースホルダのさまざまな形式(PostgreSQLの場合はselect c from t where x = $1、SQLiteの場合はselect c from t where x = ?1など)を使用できます。

また、PostgreSQLではアレイスライスと疑問符のコロンを一部の演算子に使用することがあるので、時には標準プレースホルダと:プレースホルダという名前ので問題が発生する可能性があります。私はで何の問題も経験したことがありませんか?しかし、私はgeometric operatorsのどちらも使用していません。空白を賢明に使用すると、の問題を回避できますか?。 PostgreSQL配列を使用していない場合は、:nameという名前のプレースホルダとarray slicesが戦う心配はありません。


エグゼクティブサマリー:あなたは@bind_paramsで作業selectcol_arrayrefまたは同様の方法で名前つきプレースホルダを使用することはできません。しかし、SQLiteのとPostgreSQLで、あなたは、番号プレースホルダを使用することができます($1$2、... PostgreSQLや?1?2、用を... SQLiteのため)@bind_paramsで動作する方法でか、名前のプレースホルダを使用することができます(両方のため:name PostgreSQLとSQLite)を使用している場合は、prepare/bind_param/execute/fetchの順番の配列を使用してください。PostgreSQL配列をクエリに使用する場合は注意が必要です。

+0

ありがとうございます。 'selectcol_arrayref'で" $ 1 "&Co.を使うのはそれほど馬鹿ではないので、おそらく' prepare'/'bind_param' /' execute'/'fetch'を使うといいでしょう。 –

+0

@Tim:SQL文字列とハッシュリファレンスを取った独自のユーティリティ関数を書くことができます。その後、 '' bind_param''/'' execute''/'fetch''を' prepare 'して要約結果を返すことができます。そのようなことは合理的な妥協であろう。 –

+0

しかし、それは私が「開発」して維持しなければならない別のコグです。一般的に、他の人の頭脳の製品にできるだけ多くのことをぶつけています。私の想像しているよりも遭遇する可能性のあるコーナーケースについてもっと多くのことを考えていました。 –

関連する問題