2016-12-23 13 views
1

は私のコードです:他のプレースホルダがある場合にIN()句でプレースホルダを使用する方法はありますか?ここ

$selected_tags_arr = ["PHP", "CSS", "JAVA"]; 
$part_of_tag = "MyS"; 
$in = str_repeat('?,', count($selected_tags_arr) - 1) . '?'; 
$stmt = $dbh_conn->prepare("SELECT name, usage_guidance, total_used_num 
          FROM tags 
          WHERE 
          (name LIKE CONCAT('%', ?, '%') OR 
          usage_guidance LIKE CONCAT(?, '%')) AND 
          name NOT IN ($in)"); 
$stmt->execute(array($part_of_tag, $part_of_tag, $selected_tags_arr)); 
$result = $stmt->fetchAll(); 

それは構文エラーのために動作しません。どうすれば修正できますか?

ご覧のとおり、いくつかのパラメータがあります。$selected_tags_arrアレイを除く)私はそれらを渡す必要があります。それは問題が発生したときです。

注:場合によっては$selected_tags_arrアレイが空の配列になることがあります。

+2

構文エラー*を投稿する必要があります。コードには他にも問題があります。 'execute'は行列ではなくフラットな配列を求めます。 –

+3

配列内に配列を送信しています。 '$ selected_tags_arr'を最初に他の変数の配列にマージしてみてください。 – aynber

+0

'IN(list)'は、gasp、ColdFusion以外のすべての言語でパラメータ化することはできません。 –

答えて

2

いいえ、誰も例を提供することを心配していませんでした。 aynberが言ったように、配列をマージする必要があります。だから、次のコードは問題ないはずです:あなたが言ったように、$のselected_tags_arrが空である可能性があり、場合

$stmt->execute(array_merge([$part_of_tag,$part_of_tag], $selected_tags_arr)); 

は、しかし、問題がある可能性があります。構文エラーが発生します。

解決方法は、必要な結果によって異なります。配列が空の場合にクエリで何も見つからないようにするには、次のようにコードを変更します。

$in = $selected_tags_arr ? str_repeat('?,', count($selected_tags_arr) - 1) . '?' : 'NULL'; 
+0

Thx +1、 '$]のような' $ selected_tags_arr'配列が '[]'のように空でない場合を除いて、たいていは完全にうまくいきます。この場合は動作しません。どうすれば修正できますか? – stack

+0

実際に私は考えました..しかし、あなたが言ったように、 'NULL'を設定すると、クエリは何も見つかりません。クエリのこの部分だけを無効にしたいときに' AND NOT IN($ in ) 'その配列が空のとき..だからあなたは' NULL'の代わりに何を設定すべきか知っていますか? – stack

+0

@stackこの場合、INで全体を取り出す必要があります。あるいは、条件付きで追加する –

関連する問題