0

重複の可能性:
「WHERE…IN」クエリを使用したPDO

私の検索フォームには、たくさんのチェックボックスとフィールドがあります。
一部のチェックボックスはグループに属しています。
グループの例、都市。
次のようにクエリします

SELECT id, city_id, area, city FROM an_objects  
                WHERE livedays > 0 AND type_id = :typeoffer AND rubric_id = :typerelaty 
                AND CASE 
                    WHEN :1r = '' THEN true 
                    ELSE city_id IN (:1r, :2r, :99r, :100r)
                END
                GROUP BY id ORDER BY date ASC

この例では、4つのパラメーター、つまり100を入力する必要があります。
でもやりたい

SELECT id, city_id, area, city FROM an_objects  
            WHERE livedays > 0 AND type_id = :typeoffer AND rubric_id = :typerelaty 
            AND CASE 
                WHEN :1r = '' THEN true 
                ELSE city_id IN (:arrCity)
            END
            GROUP BY id ORDER BY date ASC

文字列はそう

if(isset($param['city']))
{
    for($i=0; $i < 9; $i++)
    {
        if(isset($param['city'][$i]))
            $raion .= $param['city'][$i] . ",";
        else
            break;
    }
    $arrCity = substr($city, 0, -1);        
}

次の
(:arrCity)を( "1,2,3,4,5,6")に置き換えています。 これは単一の文字列として取得されますが、次の方法
(:arrCity)(1,2,3,4,5,6)

4

1 に答える 1

1

これは興味深い質問です。これは、PDOが古いmysql_ *よりもはるかに面倒であり、実際のクエリの広い範囲に適切なセキュリティを提供しないという事実を明確に示しています。

このようなタスクを簡単にするために、データベースアクセスライブラリは2つの主要なことを許可する必要があります。

  • 内部で処理される複雑なデータ型の追加のプレースホルダー。
  • クエリ全体ではなく、任意のクエリ部分でプレースホルダーを処理します

そして、PDOは両方で失敗します。
したがって、プログラマーは自分でそれらの世話をする必要があります。

したがって、そのような原則を実装するライブラリを使用することにより、コードは短く安全になります。

if(isset($param['city']))
{
    $raion = $db->parse("AND (city_id IN (?a)", $param['city']);
}
//  you can add any number of such conditions making your search flexible
// the only thing you have to keep in mind: add a value ONLY via placeholder

$sql = "SELECT id, city_id, area, city FROM an_objects  
       WHERE livedays > 0 AND type_id = ?i AND rubric_id = ?i
       ?p
       GROUP BY id ORDER BY date ASC";
$data = $db->getAll($sql, $typeoffer, $typerelaty, $raion);

はい、簡潔で読みやすいコードのこれらの数行だけです!

私があなたの条件を誤解した場合は、クエリを構築するための正確なロジックを提供して、詳細をお気軽にお問い合わせください。私が話しているライブラリの力を示すために、あなたの条件に応じて正確なコードを書いて喜んでいます。

于 2013-02-03T06:28:31.020 に答える