2011-01-18 12 views
4

PHP PDO MySQLクエリのIN操作に渡すコンマ区切りの文字列を返すフォームフィールドがありますが、IN操作では、値がカンマ区切りである必要があります(文字列区切られた値の)。PDO準備文でMySQL IN操作に値を渡す?

どうすればよいですか?

$values = $_POST['values']; # '10,5,4,3' (string) 
$query = "SELECT * FROM table WHERE id IN (:values)"; 
$data = array(':values' => $values); 

答えて

9

複数の値を1つのプレースホルダに渡すことはできません。 IN()に渡す値ごとに異なるプレースホルダを入力する必要があります。何個あるかわからないので、名前付きパラメータの代わりに?を使用してください。

$values = explode(',', $values) ; 

$placeholders = rtrim(str_repeat('?, ', count($values)), ', ') ; 
$query = "SELECT * FROM table WHERE id IN ($placeholders)"; 

$stm = $db->prepare($query) ; 
$stm->execute($values) ; 
+0

+1ニース、しかし私は、次の操作を行います: '$値= array_filter(array_mapをを( 'トリム'、 ''($の値を爆発します) )、 'is_numeric'); '、あなたはユーザーの入力から何が来るのかわかりません... –

+0

あなたの構文は' rtrim'と逆です: 'rtrim(str_repeat( '?、'、count($ values))、 '、'); '。しかし、そうでなければこれは私が行った解決策です。ありがとう! – neezer

+0

@neezer ack、歓声。矛盾したパラメータの順序と愚かなPHP: – Fanis

0

PDO単独ではアレイを:parameterに結合できません。それにはヘルパー機能が必要です。

リテラル文字列'10,5,4,3'も1つの値として受信されます。パラメータのバインディングでは、リストの比較ではなく、.. id IN ('10,5,4,3')になります。

あなたの場合の回避策は、動的SQLを使用してエスケープすることです。

$values = preg_replace('/[^\d,]/', "", $_POST['values']); 
$query = "SELECT * FROM table WHERE id IN ($values)"; 

私は個人的に(しかし、あなたが実際に開始するものを持っていないので、それは二重の問題を回避するだろう)アレイのための特別な構文を持つラッパー/ヘルパーfunctionを使用しています:

db("SELECT * FROM table WHERE id IN (??)", explode(",",$values)); 
0

トリックは$valuesは、個々の値の束であることを認識し、これを念頭において、あなたのクエリを設定することです。名前付きプレースホルダの代わりに?プレースホルダを使用すると、これは簡単です。たとえば、次のような何かができます:

$values = explode(',', $_POST['values']); //array(10,5,4,3) 
$placeholder_string = implode(',', array_fill(0, count($values), '?')); // string '?,?,?,?' 
$query = "SELECT * FROM table WHERE id IN ($placeholder_string)"; 

$statement = $db->prepare($query); 
$statement->execute($values); 
+1

あなたの' array_fill'が表示されていますあなたは 'str_repeat' :) – Fanis

+0

私は自分自身が機会にこれをやっていることを完全に正直に言うと。それは理由がない配列を作成しているかもしれませんが、文字列を作成して余分な文字を切り捨てるよりもちょっとエレガントです:) – Fanis

+1

@Fanis意味論的には意味をなさないと思います - あなたは正しい文字列を最初の場所。しかし、 '$ str = str_repeat( '?,'、$ count - 1)のようなものです。 '?' ;;おそらく最も理想的な方法ですが、今考えてみましょう。 – mfonda

関連する問題