0

私は単純なSQLクエリを持っています、

SELECT * FROM phones WHERE manu='$manuf' AND price BETWEEN $min AND $max

問題は、すべての変数フィールドが空のフィールドに接続されていることです。そのため、空の場合にそれぞれのフィールドが取ることができる値と一致させる方法が必要です。私は試した

$min=$_REQUEST['min_price'];
$max=$_REQUEST['max_price'];
$manuf=$_REQUEST['manufact'];
if (empty($min)){
    $min=0;}
if (empty($max)){   
    $max=900000;}
if (empty($manuf)){
    $manuf='*';}

数値フィールドでは問題なく機能しますが (このように手動で制限を設定する必要はありません)、テキスト フィールドの普遍的な一致を取得する方法がわかりません。* はすべての行名に一致するので、それを行うと思っていましたが、明らかにそうではありません。誰でもこれを行う方法を知っていますか?

4

4 に答える 4

1

SQL のロジックを変更し、NULL パラメータまたは特定の値を持つパラメータを渡すことで、これを行う傾向があります。

WHERE manu='$manuf' AND price BETWEEN $min AND $max

=>

WHERE
    (manu='$manuf' OR '$manuf' = '*')    -- Check for "special value"
    AND (price >= $min OR $min IS NULL)  -- Check for NULL
    AND (price <= $max OR $max IS NULL)  -- Check for NULL
于 2009-12-07T17:57:18.857 に答える
1

パラメータをオプションにできる「フィルタ」タイプのクエリにしたいのではないでしょうか。次のようなことができます。

SELECT 
    * 
FROM 
    Phones 
WHERE
    (manu = $manu OR manu IS NULL)
    AND (min = $min OR min IS NULL)
    AND (max = $max OR max IS NULL)

OR を null オプション (空の文字列などにすることができます) に追加すると、渡された任意のパラメーターをフィルター処理できます。

これを上記のものと組み合わせて、最小/最大をチェックし、BETWEEN 句のデフォルトを指定できます。

于 2009-12-07T17:44:16.633 に答える
1

私があなたなら、SQL 全体を部分に分割し、WHERE ステートメントを処理します。

次のようなもの:

sql = "SELECT * FROM phones WHERE 1=1 "
if (not empty($manu))
    sql = sql + ' AND manu = "$manu"'
...

よろしく。

于 2009-12-07T17:46:01.030 に答える
0

多分何か...

SELECT * FROM phones 
WHERE manu = coalesce(?, manu)
AND price >= coalesce(?, price) 
AND price <= coalesce(?, price)

次に、変数を直接入力する代わりにパラメータを渡します (私の頭の中で PHP でそれを行う方法がわかりません)。

于 2009-12-07T22:43:37.673 に答える