MDB2でプリペアドステートメントやプレースホルダを使用して

IN句の中にクォートした値を用いることは可能でしょうか。

イメージだと
$array = array('a','b','c');
$mdb2->extended->getRow("SELECT * FROM table WHERE column IN (?)", null, $array);
ってやると
SELECT * FROM table WHERE column IN ('a','b','c')
ってなるような感じです。arrayの数は可変で。

環境はPHP5+MDB2でDBはMySQL5です。

回答の条件
  • 1人2回まで
  • 登録:2007/11/22 18:38:38
  • 終了:2007/11/29 18:40:03

回答(2件)

id:sunaoka No.2

sunaoka回答回数5ベストアンサー獲得回数12007/11/28 16:49:10

ポイント35pt

ぜんぜんスマートではないですが、先にプレースホルダを作ってしまえば大丈夫そうです。

<?php

$array = array('a', 'b', 'c');
$holder = implode(',', array_fill(0, count($array), '?'));
$mdb2->extended->getRow("SELECT * FROM `table` WHERE `column` IN ($holder)", null, $array);

上記の場合は

SELECT * FROM `table` WHERE `column` IN (?,?,?)

をあらかじめ作ってしまうという感じですね。

これでとりあえず取得はできます。


ちなみに、mysql のログには以下のように表示されます (正常ですね)。

32 Query       PREPARE MDB2_STATEMENT_mysql_6e51ad0f4d6642dea3fcf10d006c84ce FROM 'SELECT * FROM `table` WHERE `column` IN (?,?,?)'
32 Prepare     [1] SELECT * FROM `table` WHERE `column` IN (?,?,?)
32 Query       SET @0 = 'a'
32 Query       SET @1 = 'b'
32 Query       SET @2 = 'c'
32 Query       EXECUTE MDB2_STATEMENT_mysql_6e51ad0f4d6642dea3fcf10d006c84ce USING @0, @1, @2
32 Execute     [1] SELECT * FROM `table` WHERE `column` IN (@'0',@'1',@'2')
32 Query       DEALLOCATE PREPARE MDB2_STATEMENT_mysql_6e51ad0f4d6642dea3fcf10d006c84ce
32 Quit
id:krese

なるほど!

こんなやり方あったんですねー。

若干バッドっぽいですが、使わせていただきます。

2007/11/29 17:07:29

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません