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

我猜你想让它成为一个“过滤器”类型的查询,允许参数是可选的?您可以执行以下操作:

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

添加带有 null 选项的 OR(您可以将其设为空字符串或其他任何内容)允许您过滤传递的任何参数。

您可以将其与上面的内容结合起来,检查最小值/最大值并为 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 回答
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 回答
0

也许像...

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

然后传入参数而不是直接输入变量(不知道如何在 PHP 中做到这一点)。

于 2009-12-07T22:43:37.673 回答