2

この「問題」を説明するのに苦労しました。タイトルをこのテーマをよりわかりやすいものに変更してください。

私はデータベースを持っており、結果の並べ替え方法、データベースの検索方法などをユーザーが選択できるようにしたいと考えています。

PHPとMySQLを使用しています。

例として、このテーブルの設定を行いました。

table Persons
+----+------+----------+------------+------+-----+
| id | age  | gender   | date       | hits | car |
+----+-----------------+------------+------+-----+
| 1  | 18   | male     | xx.xx.xxxx | 1040 | 1   |
| 2  | 35   | female   | xx.xx.xxxx | 443  | 2   |
| 3  | 67   | male     | xx.xx.xxxx | 453  | 2   |
| 4  | 10   | male     | xx.xx.xxxx | 3454 | 4   | ==> 4 means Citroen
| 5  | 98   | female   | xx.xx.xxxx | 323  | 6   |
+----+------+----------+------------+------+-----+

table Cars
+----+----------+
| id | model    |
+----+----------+
| 1  | Porche   |
| 2  | Ferrari  |
| 3  | Volvo    |
| 4  | Citroen  |
| 5  | VW       |
+----+----------+

データベースからデータを選択する方法は次のようになります。

$sql = "SELECT *, DATE_FORMAT(date, '%b %e, %Y') AS show_date FROM persons ORDER BY date DESC LIMIT 100";

しかし、ユーザーに日付、ヒット数、評価(別の表)の降順と昇順の両方で並べ替える機会と、X歳未満の男性の性別のみを選択する機会(たとえば)をユーザーに提供したい場合はどうなりますか?どうすればこれを行うことができますか?可能なすべてのクエリを作成する必要がありif elseますか、それとも1つのクエリで可能ですか?

仕上げコードスニペットは必要ありません。良い記事や「ベストプラクティス」があるかどうかを知る必要があります。これを行う方法です。最も簡単で安全な方法が推奨されます。

PSこの種の「問題」を何と呼びますか?

4

3 に答える 3

4

検索クエリ機能では、検索フィールドやオプションなどを取得して、クエリ文字列を作成します。SELECTステートメントが常に同じフィールドをプルする場合は、WHERE句までのクエリを作成することから始めて、そこから構築することができます。( SQLインジェクション攻撃からユーザー入力を保護するようにしてください。プリペアドステートメント、またはマニュアルの示唆的なメソッド(getSqlVal()私の元のコードで定義されています)を使用してください。)ここに小さな例を示します。

$sql = "SELECT ... FROM Persons p, Cars c WHERE p.car = c.id";

if(isset($_POST["age"]))
    $sql .= " AND age < " . getSqlVal($_POST["age"], 'int');
if(isset($_POST["gender"]))
    $sql .= " AND gender = '" . getSqlVal($_POST["gender"], 'text') . "'";
if(isset($_POST["sortBy"])){
    $sql .= " ORDER BY " . getSqlVal($_POST["sortBy"], 'text');
    if(isset($_POST["sortDirection"]) && $_POST["sortDirection"] == "DESC")
        $sql .= " DESC";
}
于 2012-04-16T17:06:42.290 に答える
3

単純に、実際の要求を表すモデルを考え出し、そのモデルを、クエリに適切なデータを返す動的に作成されたSQLステートメントに明示します。

たとえば、年齢、性別、ヒット数で並べ替えるだけの場合は、Carsテーブルにわざわざ参加しないようにする必要があります(テーブルから何も必要としないため)。一方、彼らが車のモデルを望んでいた場合は、必要に応じて参加を追加します。

于 2012-04-16T16:44:54.900 に答える
2

これらすべてのオプションをステートメントで囲み、switchURL$_GET変数をステートメントに渡すことができます。

たとえば、並べ替えをカスタマイズするには、sort_by変数をURLに渡します。

/my_list.php?sort_by=hits

次のようにswithステートメントを作成します。

$sort_by = '';
switch ($_GET['sort_by']) {
    case 'rating':
        $sort_by = ' ORDER BY `rating` ';
        break;
    case 'hits':
        $sort_by = ' ORDER BY `hits` ';
        break;
    default:
        $sort_by = ' ORDER BY `date` ';
        break;
}

その場合、クエリは次のようになります。

$sql = "SELECT *, DATE_FORMAT(date, '%b %e, %Y') AS show_date
        FROM persons "
        . $sort_by .
        "DESC LIMIT 100";
于 2012-04-16T16:47:22.460 に答える