我有一个简单的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='*';}
适用于数字字段(虽然我不喜欢像这样手动设置限制),但我无法弄清楚如何获得文本字段的通用匹配。我认为*会这样做,因为它匹配所有行名称,但显然不是。有谁知道怎么做?
答案 0 :(得分: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子句提供默认值。
答案 1 :(得分:1)
如果我是你,我会将整个SQL分成几部分,并处理WHERE语句。
某些人喜欢:sql = "SELECT * FROM phones WHERE 1=1 "
if (not empty($manu))
sql = sql + ' AND manu = "$manu"'
...
问候。
答案 2 :(得分: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
答案 3 :(得分:0)
也许像......
SELECT * FROM phones
WHERE manu = coalesce(?, manu)
AND price >= coalesce(?, price)
AND price <= coalesce(?, price)
然后传入参数而不是直接输入变量(不知道如何在PHP中做到这一点)。