3

ブランド、タイプ、価格がオプションの入力フィールドである検索フォームからの入力を使用するクエリを作成しています。

SELECT * FROM `database` WHERE `brand` LIKE "%' . $brand . '%" AND `type` LIKE "%' . $type. '%" AND `price` LIKE "%' . $price . '%"

いずれかのフィールドに何も入力されていない場合、「すべて」と言う方法があるかどうか疑問に思っています。たとえば、価格フィールドに値を入力しない場合、そのセクションを無視するよう SQL に指示する方法はありますか?

AND `price` LIKE "*";

そのため、結果は引き続きブランドとタイプでフィルタリングされますが、任意の価格を持つことができます。

これに関するアドバイスをいただければ幸いです。ありがとう

4

3 に答える 3

3

Ariel が述べたように、クエリを作成するときに PHP でフィルタリングを行う方がよいでしょう。そのようにするためのコードサンプルを次に示します。

<?php
$sql = 'SELECT * FROM `database`';
$where = array();
if ($brand !== '') $where[] = '`brand` LIKE "%'.$brand.'%"';
if ($type !== '')  $where[] = '`type` LIKE "%'.$type.'%"';
if ($price !== '') $where[] = '`price` LIKE "%'.$price.'%"';
if (count($where) > 0) {
  $sql .= ' WHERE '.implode(' AND ', $where);
} else {
  // Error out; must specify at least one!
}
// Run $sql

: 、、および変数の内容をこのように使用する前にサニタイズされていることを確認してください。そうしないと、 SQL インジェクション攻撃に対して脆弱になります (理想的には、PHP PDOデータベース コネクタを準備済みステートメントでサニタイズするために使用する必要があります)。入力)。$brand$type$price

于 2012-09-13T05:37:57.137 に答える
0

フォームフィールドを整理している場合は、次のようにすることができます。

<?php
    $fields = array(
        // Form    // SQL
        'brand' => 'brand',
        'type'  => 'type',
        'price' => 'price',
    );

    $sql  = 'SELECT * FROM `database`';
    $comb = ' WHERE ';
    foreach($fields as $form => $sqlfield)
    {
        if (!isset($_POST[$form]))
            continue;
        if (empty($_POST[$form]))
            continue;
        // You can complicate your $fields structure and e.g. use an array
        // with both sql field name and "acceptable regexp" to check input
        // ...

        // This uses the obsolete form for mysql_*
        $sql .= $comb . $sqlfield . ' LIKE "%'
             . mysql_real_escape_string($_POST[$form])
             . '"';
        /* To use PDO, you would do something like
             $sql .= $comb . $sqlfield . 'LIKE ?';
             $par[] = $_POST[$form];
        */
        $comb = ' AND ';
    }
    // Other SQL to go here
    $sql .= " ORDER BY brand;";

    /* In PDO, after preparing query, you would bind parameters
       - $par[0] is value for parameter 1 and so on.
       foreach($par as $n => $value)
           bindParam($n+1, '%'.$value.'%');
    */
于 2012-09-13T05:56:00.460 に答える
0

通常、これは SQL ではなくフロントエンド言語で行います。

しかしprice LIKE '%'、実際にはすべてを意味します (NULL を除く)。だからきっと大丈夫。

于 2012-09-13T05:33:15.900 に答える