0

皆様に質問です...

テーブルに配列がある配列でテーブルを検索する最良の方法は何でしょうか。

例えば:

$var = (1,4,7,9,14)

$Query = "SELECT * FROM business_listings WHERE category IN ($var)";

'category'しただろう4,27,89,101

$varの数字の 1 つがテーブルの数字の 1つと一致する場合、これを一致させるにはどうすればよいですか。

4

1 に答える 1

0

データベースの列がカンマ区切りの値のリストで、そのリスト内の 1 つの値を検索している場合は、状況が異なります。

以下にコメントしたように、列categoryにテキスト値が含まれていて、を含むフィールドを検索している場合は、MySQL の関数を使用する必要があります。410,406,149,152category152FIND_IN_SET()

複数の値をチェックする必要がある場合は、複数の を使用する必要がありますFIND_IN_SETFIND_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 接続であると仮定します。

お役に立てれば!

于 2013-09-25T16:37:30.497 に答える