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

Php 如果参数为空,则构造并查询,php,mysql,Php,Mysql,我允许我的用户按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=quo

我允许我的用户按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"]);
这是很容易做到的

...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')...
但如果取而代之或u put,并且例如仅
mg_golub.brojgolub=''
为空,则它将搜索数据库中
brojgolub
为空的所有记录,它将不会找到任何内容,也不会作为结果显示任何内容

如何解决这种情况?

也许你可以使用

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

相反。

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

您可以使用foreach并迭代$\u 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如果要跳过空参数,则

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语句,然后设置参数值。

如果它确实为空,那么你想用它做什么呢?这种方法看起来像是一个地狱般的设计失败。
quote\u smart
这样的功能是一个非常非常糟糕的主意。请不要用这些。首先,你为什么不习惯避免所有这些呢?PDO的命名参数将显著地解决这个问题。只有在填充了有问题的值时,才应该在查询中附加条件。否则,请忽略这一点。提出问题的人甚至似乎对听到答案都不感兴趣。这是有帮助的,但有时人们希望按照不同的标准进行搜索,有时使用AND,有时使用What is
b
?我在原来的问题中看不到这一点。