0

検索フィルター機能を作成しており、URL 経由でフィルター情報を送信します。私が直面している問題は、これはフィルターであるため、一部の情報が存在する場合とそうでない場合があることです。これにより、未定義の変数の問題が発生します。

フィルターの最大数は次のようになります。cat=コンピューター&credits1=1&credits2=2&rev=5&stars=5. また、GET 変数セットに基づいて、複数の SQL テーブルからデータを取得します。

クエリを実行するために、特定の時間に設定されていない変数をどのように説明できますか? それぞれのケースを説明する一連の if else ステートメントを介してこれを行うことができると思いますが、それは「汚いコード」のようです。

4

1 に答える 1

3

渡されたフィルター値に基づいて、SQL ステートメントを動的に作成する必要があります。これは条件を意味する可能性がありますが、データベースでのクエリを最適化するための最良の方法です。

これは次のようになります (例では mysqli を使用していますが、これは準備済みステートメントを使用するあらゆる種類の DB ライブラリで同様である必要があります)。

$query = 'SELECT * FROM table'; // or specifically specify the fields you need in result set.
if (empty($_GET['cat']) && empty($_GET['credits1']) && empty($_GET['credits2']) && empty($_GET['rev']) && empty($_GET['stars'])) {
    // there are no search filters set so maybe you alert some sort of error
} else {
    $query .= ' WHERE ';
    $parameters = array();
    $at_least_one_where_set = false;
    if (!empty($_GET['cat'])) {
        if($at_least_one_where_set === true) {
            $query .= ' AND cat=?';
        } else {
            $query .= 'cat=?';
        }
        $at_least_one_where_set = true;
        $parameters[]['value'] = $_GET['cat'];
        $parameters[]['type'] = 's';
    }

    // do similar conditionals for each $_GET value you are interested in.

    // query the database    
    $mysqli = new mysqli('host', 'user', 'password', 'database');
    $stmt = $mysqli->stmt_init();
    $stmt->prepare($query);
    foreach ($parameters as $parameter) {
        $stmt->bind_param($parameter['type'], $parameter['value']);
    }
    $stmt->execute();

    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with your result row
    }
}
于 2012-12-21T18:57:45.777 に答える