如果参数为空,则构造和查询

时间:2013-05-19 21:55:27

标签: php mysql

我允许我的用户按10种不同的标准进行搜索。我是从网址中挑选的。但问题是,如果某些标准是空的。然后它将在数据库中搜索空记录的记录。

$pretrazi_drzava=quote_smart($_GET["pretrazi_drzava"]);
$pretrazi_broj=quote_smart($_GET["pretrazi_broj"]);
$pretrazi_spol=quote_smart($_GET["pretrazi_spol"]);
$pretrazi_boja=quote_smart($_GET["pretrazi_boja"]);
$pretrazi_rasa=quote_smart($_GET["pretrazi_rasa"]);
$pretrazi_ime=quote_smart($_GET["pretrazi_ime"]);
$pretrazi_godina=quote_smart($_GET["pretrazi_godina"]);
$pretrazi_status=quote_smart($_GET["pretrazi_status"]);
$pretrazi_otac=quote_smart($_GET["pretrazi_otac"]);
$pretrazi_majka=quote_smart($_GET["pretrazi_majka"]);

使用OR

很容易
...AND (mg_drzava.drzava='$pretrazi_drzava' 
                        OR mg_golub.brojgoluba='$pretrazi_broj' 
                        OR mg_golub.spol='$pretrazi_spol' 
                        OR mg_golub.boja='$pretrazi_boja' 
                        OR mg_golub.rasa='$pretrazi_rasa'
                        OR mg_golub.ime='$pretrazi_ime' 
                        OR mg_golub.godina='$pretrazi_godina'
                        OR mg_status.status='$pretrazi_status'
                        OR O.brojgoluba='$pretrazi_otac'
                        OR M.brojgoluba='$pretrazi_majka')...

但是,如果相反,或者你把AND和例如只有mg_golub.brojgolub=''为空,那么它将搜索数据库中brojgolub为空的每条记录,它将找不到任何内容并且它赢了“结果没有显示任何结果。

如何解决这种情况?

4 个答案:

答案 0 :(得分:1)

如果要同时应用多个条件,则需要AND参数,如性别为“男性”且年龄为“35”。如果用户没有传递一些参数,则可能意味着他不了解或关心他们:性别是男性,我不关心年龄。如果是这种情况,您需要从查询中排除该条件,而不是使用只会减慢查询速度的额外条件。

答案 1 :(得分:1)

您可以使用foreach并迭代$ _GET数组来构造您的SQL语句

$sql = "SELECT * FROM table";

if(count($_GET) > 0)
{
    // Append WHERE clause
    $sql .= " WHERE ";

    // Construct WHERE
    foreach($_GET as $key => $value)
    {
        if($value != '')
        {
            $sql .= ' '.$key.' = '.$value.' AND ';
        }
    }


    // Remove last "AND"
    $sql = trim( $sql, 'AND ');

 }

我没有测试这段代码,仅供参考如何忽略SQL语句中的emtpy值。希望这有帮助。

更新:在查询中避免1 = 1

答案 2 :(得分:1)

如果你想跳过参数,如果它是空的那么

where (someparam1 is null or (someparam1 = somecolumn1)) 
and (someparam2 is null or (someparam2 = someColumn2) 
and ... 

是你想去的一种方式。

如果quotesmart总是返回一个字符串,那么

where ((someparam1 = '') or (someparam1 = somecolumn1)) 
and ((someparam2 = '') or (someparam2 = someColumn2) 
and ... 

如果你不想在sql中放入不需要的参数,那么生成所选参数的列表/哈希并从中构建一个参数化的sql语句,并设置参数值。

答案 3 :(得分:-2)

也许你可以使用

AND (b.a='' OR b.a='$a')

代替。