2012-02-21 11 views
1

私は3つのテーブル(正規化された)を使用するタギングシステムで作業しています。私は、 "赤いリンゴ"のようなものを検索し、 "赤い"と "リンゴ"とタグ付けされたすべてのアイテムを表示するための準備文を作成したかったのです。SQLでIN関数を使用したPHPでのプリペアドステートメントの使用

$stmt = $db->prepare("SELECT co.content_id, co.description FROM em_content AS co LEFT JOIN em_contenttags AS ct ON co.content_id = ct.content_id LEFT JOIN em_tags AS ta ON ct.tag_id = ta.tag_id WHERE ta.tag IN (?)"); 
$stmt->bind_param("s", $query); 
$stmt->execute(); 
$stmt->store_result(); 

私はのためのプレースホルダ$query配列を作り、使用してみました「?」を:

現在、私のクエリは次のようになりますクエリでは「bind_param」の「s」が返されますが、$queryを配列として渡すことはできません。それ以外の場合は、エラーがスローされます。

準備済みの文でこの作業を行う方法はありますか?

だけFYI、私は私が私の知る限りではmysqliの

+0

アレイとして送信しないでください。 – jakx

+0

私はそれを知っていますが、タグの乱数を選択できるようにするため、たとえば「赤いリンゴ」を検索する場合は、「緑のリンゴをニューヨークから」検索します。長さは毎回変わりますが、bind_paramは配列を許可していませんし、毎回動的に変数をランダムに割り当てることもできません。それは私が持っている問題ですので、文字列として送ることはできません – allanminium

答えて

1

あなたは、配列の各要素に対して1つの?を持っていますので、動的プレースホルダを構築する必要があります:、ここでは上記のMySQLiをのbindメカニズムを使用する方法が

$array = array('foo', 'bar', 'baz'); 
$placeholders = join(',', array_fill(0, count($array), '?')); 
$stmt = $db->prepare('SELECT ... WHERE IN (' . $placeholders . ')'); 
$stmt->execute($array); 

100%わかりませんPDOのために働きます。

+0

私はどこかでstackoverflowのような何かを見ましたが、それはすべてPDO用でmysqli用ではありません。 PDOこれまでのプロジェクトの中で:(* sigh *はmysqL_escape_stringルートを下る必要があるかもしれません。 – allanminium

+0

str_repeat()を追加してwを使うための "sss"文字列を作成してくださいi mysqliバインド –

+0

しかし、どのように変数に追加するのですか?この場合、$ query変数には未知数のタグが含まれています。私は$ stmt-> execute($ array)を実行できません。 mysqliではexecute関数で渡される変数は許可されていないため – allanminium

0

を使用しています、PDOを使用していないよ、あなたは「IN()」内のプレースホルダを使用することはできません。クエリのその部分を連結する必要があります。

+0

IN部分のプレースホルダを取得するための回避策がありますが、 "$ stmt-> bind_param( "s"、$ query); " – allanminium

+0

私はこのような意味を持っていました: $ sql = "SELECT * FROM your_table WHERE id IN("。implode( "、"、$ idList ) ")"; しかし、あなたがmysqli_ * –

+0

で動作するようになったら、@decezeによって提案された解決策が良いかどうかチェックするべきです、それでも準備文になりますか? – allanminium

関連する問題