2011-08-04 14 views
3

私が取り組んでいるシステムでは、データベースを処理するためにPropelを使用していますが、さまざまなWHERE IN条件を受け入れる必要のある生のクエリを準備しています。これは私のために働いていない、明らかにPropelで準備済みのSQL文をWHERE INで使用する

$c = Propel::getConnection(); 
$q = $c->prepare("SELECT foo FROM bar WHERE blah IN(:ids)"); 
$q->execute(array(':ids' => array(1, 2, 3, 4, 5))); 

私が何をしようとしている単純な例はこれです。また、私の ':ids'パラメータとしてimplode( '、' array(1,2,3,4,5))を使ってみましたが、これもうまくいきません。最初のメソッドは配列を受け入れる必要があり、2番目のメソッドは文字列を整数と比較するという不満があります。

WHERE INのクエリに値の配列を渡す適切な方法はありますか?ハードコーディングする必要はありません。ループの繰り返しごとに準備するという意味です。

基準を作成して代わりにdoSelectを使用するオプションがないことに注意してください。ここで示した例よりもクエリが実際ははるかに複雑であり、私はそれをそのように構築することができないと真剣に考えています。

多くの感謝!

+0

どのようなDBエンジンですか? – ain

+0

申し訳ありません - postgresql。すべての回答の皆さんありがとう!それが正しい方向に私を導いた。 –

答えて

0

プリペアドステートメントで同じ名前の名前付きパラメーターマーカーを2回使用することはできません。たとえば、SQL文のIN()句では、複数の値を単一の名前付きパラメータにバインドすることはできません。

PDO::prepare

PropelはこれはPDO回避策であるPDO

Propel site

1

を使用する:

$yourListOfIDs = array(1, 2, 3, 4, 5); 

$q = $c->prepare("SELECT foo FROM bar WHERE blah IN(".rtrim(str_repeat('?,', count($yourListOfIDs)), ',').")"); 

// bindValue starts at 1 (not 0) 
foreach ($yourListOfIDs as $key => $val) 
{ 
    $q->bindValue(($key+1), $val); 
} 

$q->execute(); 

は注意:無記号

SELECT foo FROM bar WHERE FIND_IN_SET(blah, :ids) > 0 

動作します:あなたが使用DBはMySQLは、おそらくのようなクエリを使用している場合はtが

1

をテストしました。この場合、パラメータ値としてimplode(',', array(1, 2, 3, 4, 5))を使用する必要があります。 blahintの場合、charなどにキャストする必要があります。FIND_IN_SET(CAST(blah AS CHAR), :ids)

+0

あなたはコンマがないので、私はそれを修正しました。 – NobleUplift

関連する問題