我允许我的用户按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
为空的每条记录,它将找不到任何内容并且它赢了“结果没有显示任何结果。
如何解决这种情况?
答案 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')
代替。