3

設定されたパラメーターに基づいて限定された結果を選択するクエリがあります。

$query = $this->db->query ("
    SELECT 
        p.product_id, 
        p.quantity 
    FROM {$this->prefix}product p 
    LEFT JOIN {$this->prefix}product_to_category pc 
        ON (p.product_id = pc.product_id) 
    WHERE pc.category_id = '3' 
    AND p.status = '1' 
    ORDER BY p.quantity DESC 
    LIMIT 0, 4");

category_idこれは、製品の= 3で、在庫数が最も多い 4 つの製品を返します。

静的なものではなく、カテゴリ ID の配列を使用するようにしたいと思います。すなわち:

$categories = array(2, 6, 22, 33, 34, 83, 220, 222, 886, 897);

これは可能ですか?

4

4 に答える 4

7

配列を文字列に変換し、それをクエリで使用できます。以下では、$categories がすでに安全であり、悪意のある入力が含まれていないことを前提としていることにご注意ください。そうでない場合は、入力をきれいにする必要があります。

$categoriesClause = implode(",",$categories);

$query = $this->db->query ("
    SELECT 
        p.product_id, 
        p.quantity 
    FROM {$this->prefix}product p 
    LEFT JOIN {$this->prefix}product_to_category pc 
        ON (p.product_id = pc.product_id) 
    WHERE pc.category_id IN ($categoriesClause)
    AND p.status = '1' 
    ORDER BY p.quantity DESC 
    LIMIT 0, 4");
于 2013-09-20T12:55:05.833 に答える
1

カテゴリが数値ではなくテキストの場合、クエリに入る前に最初に引用する必要があります。

array_walkPHP 5.3 以降では、これと匿名コールバック関数を使用して実行できます。また、ループ中に値をエスケープして安全にすることもできます。

$categories = array(2, 6, 22, 33, 34, 83, 220, 222, 886, 897);

array_walk($categories, function( &$category ) { 
     $category = $this->db->escape_string($category);
     $category = "'{$category}'";
 });

$categories_inclause = implode(",", $categories);

$this->db->query = "SELECT blah WHERE pc.category_id IN ($categories_inclause)";
于 2013-09-20T13:09:53.010 に答える
0

IN()と組み合わせて使用implode()​​:

$query = $this->db->query ("
SELECT 
    p.product_id, 
    p.quantity 
FROM {$this->prefix}product p 
LEFT JOIN {$this->prefix}product_to_category pc 
    ON (p.product_id = pc.product_id) 
WHERE pc.category_id = IN(" . implode(',', $categories) . ") 
AND p.status = '1' 
ORDER BY p.quantity DESC 
LIMIT 0, 4");
于 2013-09-20T13:03:32.717 に答える