2

私の準備されたクエリは次のようになります。

   $sql = "SELECT $t1.id FROM $t1 WHERE $t1.name IN (?)";

私がしようとすると:

   $stmt = Sql::$select->prepare($sql);
   $string="'aaa','bbb','ccc'";
   $stmt->bind_param('s', $string);

...期待される結果が返されません。文字列を 1 つの名前として扱い、個別の名前は多くありません。どうすれば解決できますか?

関数の残りの部分:

   $stmt->execute();
   $stmt->store_result();
   return $stmt;
4

2 に答える 2

0

このようにクエリを変更してみてください

$sql = "SELECT $t1.id FROM $t1 WHERE FIND_IN_SET($t1.name, ?)>0";
$stmt = Sql::$select->prepare($sql);
$string='aaa,bbb,ccc';
$stmt->bind_param('s', $string);

そして、この解決策は信頼できません。FIND_IN_SET(str,strlist)を参照してください

正しい方法は、IN ステートメントの各要素に個別のプレースホルダーを使用することです。

別の提案として、IN ステートメントを削除し、php でループを実行してクエリを生成し、パラメーターをバインドします。

于 2012-11-12T10:10:20.083 に答える
-2

問題は、「s」を使用した bind_param 関数がパラメーターを単一の文字列として脅かすため、基本的にクエリを次のように変換することです。

"SELECT $t1.id FROM $t1 WHERE $t1.name IN (''aaa','bbb','ccc'')";

簡単な修正は、文字列変数を次のように変更することです。

$string="aaa','bbb','ccc";

注:先頭/末尾の引用符なしで(これを使用して作成できますtrim($string, "'")

引用符を逆にしてみてもよいでしょう: if"の代わりに'使用してもうまくいきません。

より信頼性が高く堅牢な解決策は、クエリを変更して各文字列に a を含めることです ( php 関数?で配列を使用します) 。expolode() / implode()

于 2012-11-12T10:19:15.727 に答える