0

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

$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')...

但是,如果改为 OR 放置 AND 并且例如仅mg_golub.brojgolub=''是空的,那么它将搜索数据库中brojgolub为空的每条记录,它什么也找不到,也不会显示任何结果。

如何解决这种情况?

4

4 回答 4

1

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

于 2013-05-19T22:06:28.437 回答
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

于 2013-05-19T22:09:58.840 回答
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 语句,并设置参数值。

于 2013-05-19T22:15:29.483 回答
-2

也许你可以使用

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

反而。

于 2013-05-19T21:59:12.787 回答