1

これは長い間バグがありましたが、何が間違っているのかまだわかりません。コードでは、カンマ区切りの文字列で数人のユーザーを選択したいと考えています。文字列は常に正当で有効です。

最初の例では、bindParam を使用して値を$postIdSQL クエリに割り当てます。私はbindParam()他の多くの呼び出しに使用してきましたが、この特定のケースでは失敗します。

$postId = "1,2,3";

$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, "?") ORDER BY id DESC');
$stm->bindParam(1, $postId, PDO::PARAM_STR);
$stm->setFetchMode(PDO::FETCH_ASSOC);
$stm->execute();
$results = $stm->fetchAll();   
return print_r($results,true);

このコードは次を返します。

array (
)

私が本当に使いたくないこの他のコードでは、$postIdright の値を sql クエリに渡すだけです。

$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, "'.$postId.'") ORDER BY id DESC');
$stm->setFetchMode(PDO::FETCH_ASSOC);
$stm->execute();
$results = $stm->fetchAll();   
return print_r($results,true);

このコードは、取得するはずのすべての行を返します。

私の質問は; 具体的な問題は何ですか?また、これを繰り返さないようにするにはどうすればよいですか?

4

2 に答える 2

4

yout クエリのプレースホルダーを引用符で囲んではなりません。

$stm = $this->db->prepare('SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC');

ここで追加のドキュメントを参照してください。

質問とは直接関係ありませんが、名前付きパラメーターを使用するのも便利な習慣です。渡すパラメーターが 1 つしかない場合は、それほど悪くはありませんが、クエリで 5 つほどの疑問符が表示されるようになった場合、名前付きパラメーターを使用すると、実際には非常に読みやすくなります。

SELECT * FROM posts WHERE find_in_set(userId, :someID) ORDER BY id DESC

次に、それらをコード内で名前付きパラメーターとしてバインドします。

$sth->bindParam(':someID', $postId, PDO::PARAM_STR);
于 2013-10-30T21:14:32.923 に答える
1

"?"値を参照するとき に二重引用符を追加する必要はありません

'SELECT * FROM posts WHERE find_in_set(userId, "?") ORDER BY id DESC'

する必要があります

'SELECT * FROM posts WHERE find_in_set(userId, ?) ORDER BY id DESC'
于 2013-10-30T21:15:40.137 に答える