2

「カテゴリ」という列名のテーブルがあります。PHP では、SQL の準備ステートメントを使用して、指定されたカテゴリに属する​​すべてのレコードを選択します。これは、category=? で行います。次に、変数にカテゴリ値を追加します。これはうまくいきます。

ただし、この同じクエリ内ですべてのカテゴリを選択するにはどうすればよいですか?

null と '' をカテゴリ値として使用しようとしましたが、うまくいきませんでした。コード全体を別のクエリでコピーすると、スパゲッティ コードが作成される可能性があるため、より良いオプションがあるかどうか疑問に思っていました。ある?

ありがとう!

4

2 に答える 2

2

@JamesMarks が提供していたものに基づいて構築すると、次のようなクエリを使用する方が簡単になります

$query = "SELECT * FROM table WHERE category = ? OR 1 = ?;"

次に、最初のパラメーターに $category を渡し、2 番目のパラメーターとして 1 または 0 を渡します。1 を渡すと、第 2 項は になり1 = 1ます。これは常に true であるため、式全体が常に true です。0 を渡すと、2 番目1 = 0の項は常に false になりますが、一致した場合にのみ式全体が true になりますcategory = $category

これは、「任意のカテゴリ」に特別な値 0 を指定するよりもシンプルで優れたスタイルです。

別の解決策は、クエリを動的に構築することです。

$where = array();
if ($category) {
    $where[] = "category = ?";
    $params[] = $category;
}

... perhaps add more terms to $where conditionally ...

$query = "SELECT * FROM table";
if ($where) {
    $query .= " WHERE " . implode(" AND ", $where);
}
于 2013-10-06T18:50:30.983 に答える
0

自動的に生成された ID (データベース エンジンに応じて AUTO_INCREMENT または IDENTITY) があると仮定すると、次のような WHERE 句を使用できます。

$query = "SELECT * FROM table WHERE カテゴリ = $category OR $category = 0;"

「すべてのカテゴリ」が必要な場合は、$category 変数に値 0 を渡すだけです。

$category に値を渡したくなく、代わりに空白の $category を渡したい場合は、クエリ文字列を作成する前に $category を 0 に設定できます。

$category = ( empty($category) ? "0" : $category ); $query = "SELECT * FROM テーブル WHERE カテゴリ = $category OR $category = 0;";

...または、以下のように 1 行で書き直すこともできます。

$query = "SELECT * FROM table WHERE カテゴリ = $category OR" . (空($category) ? "0" : $category) . " = 0;"

于 2013-10-06T17:31:19.540 に答える