皆様に質問です...
テーブルに配列がある配列でテーブルを検索する最良の方法は何でしょうか。
例えば:
$var = (1,4,7,9,14)
$Query = "SELECT * FROM business_listings WHERE category IN ($var)";
'category'
しただろう4,27,89,101
$var
の数字の 1 つがテーブルの数字の 1つと一致する場合、これを一致させるにはどうすればよいですか。
データベースの列がカンマ区切りの値のリストで、そのリスト内の 1 つの値を検索している場合は、状況が異なります。
以下にコメントしたように、列category
にテキスト値が含まれていて、を含むフィールドを検索している場合は、MySQL の関数を使用する必要があります。410,406,149,152
category
152
FIND_IN_SET()
複数の値をチェックする必要がある場合は、複数の を使用する必要がありますFIND_IN_SET
。FIND_IN_SET
ドキュメントを読むと、 の最初の引数は文字列リストではなく、単一の文字列でなければならないことがわかります(コンマを含めることはできません)。代わりに次を使用します。
$var = "401,320,152";
$items = explode(",", $var);
foreach ($items as &$i) {
$i = "FIND_IN_SET('" . $i . "', `category`)";
}
$search = implode(" OR ", $items);
unset($i);
$query = "SELECT * FROM business_listings WHERE " . $items;
これは出力されます:
SELECT * FROM business_listings WHERE
FIND_IN_SET('401', `category`) OR
FIND_IN_SET('320', `category`) OR
FIND_IN_SET('152', `category`)
上記のスクリプトは、$var
値が 1 つしか含まれていない場合でも機能します。
最後に、tadmanが述べたように、準備されたステートメントを使用して作成するのが難しい可能性があるクエリに取り組んでいるため、入力を適切にエスケープしてサニタイズしていることを確認する必要があります。たとえば、$var
が何らかの方法でユーザーから取得されている場合、何らかの方法で変更する前に、次のようにエスケープする必要がありますmysqli_real_escape_string()
。
$var = $mysqli->real_escape_string($var);
$mysqli
それが開いている MySQLi 接続であると仮定します。
お役に立てれば!