我目前正在搜索脚本,但我有一点问题。我正在使用以下查询:
mysql_query("SELECT * FROM boeken WHERE
titel LIKE '%".$titel."%' AND
categorie_id = '".$categorie."' AND
auteurs LIKE '%".$auteurs."%' AND
jaar_copyright = '".$jaar_copyright."'
AND ontwerp_groep = '".$ontwerp_groep."'");
例如,当我搜索'categorie_id' = '5'
并将其他fiels留空时,我希望得到每个具有categorie_id = 5的行。无论其他字段是什么。
它的作用如下:我得到的每行都有categorie_id = 5,但标题为空,'jaar_copyright'为空等等。
我如何以我想要的方式解决这个问题?
答案 0 :(得分:0)
您应该检查代码中设置的字段,然后只将该部分添加到查询中。例如:
if(isset($_POST['categorie_id'])){
$where = " categorie_id = '".$categorie."' ";
}elseif(...){
....
}
嗯,你明白了,你可以让它有点整洁,这取决于你的表格/ POST等格式,但这就是主意。弄清楚你知道什么,然后在SQL中推送它。
我在工作,所以没有长篇故事可能,但你应该能够弄清楚这一点:
foreach($_POST as $key=>$item){
if($value != ''){
$yourField = $key;
$yourValue = $item;
}
}
//PERFORM SANITY CHECKS!
//MAYBE USE PDO etc? (but that's another thing)
//SAVE them in 2 new variables used below:
$query = "SELECT * FROM boeken WHERE `$sanitizedField` = '$sanitizedValue'";
答案 1 :(得分:0)
对于每个条件,您需要为空白参数值添加第二个评估:
(categorie_id = '".$categorie."' OR '".$categorie."' = '') AND ...
这样就可以涵盖空或填充参数的两种情况。
修改强>
示例查询,因为它将出现在SQL中。
假设您传递了5
的$ categoryie而没有其他参数:
SELECT * FROM boeken WHERE
(titel LIKE '%%' OR '' = '' )AND
(categorie_id = '5' OR '5' = '') AND
(auteurs LIKE '%%' OR '' = '') AND
...
如果它们以NULL
传入,则执行NULL
比较,而不是空字符串比较。
答案 2 :(得分:0)
为什么不直接构建基于变量的查询?这样,除非填充了var,否则它们不会包含在查询中。我不知道你的变量如$ titel实际上是什么,所以我只是说它们是不是空白。显然应该根据适用情况设定。不是null,isset等,并且始终使用类似mysql_real_escape_string()
的东西进行转义$titel_where = "";
if($titel != '')
$title_where = "AND titel LIKE '%".$titel."%'";
$auteurs_where = "";
if($auteurs_where != "")
$auteurs_where = "AND auteurs LIKE '%".$auteurs."%'";
$jaar_copyright_where = "";
if($jaar_copyright != '')
$jaar_copyright_where = "AND jaar_copyright = '".$jaar_copyright."'";
$ontwerp_groep_where = "";
if($ontwerp_groep != '')
$ontwerp_groep_where = "AND ontwerp_groep = '".$ontwerp_groep."'";
mysql_query("SELECT * FROM boeken WHERE
categorie_id = '".$categorie."'
$titel_where
$auteurs_where
$jaar_copyright_where
$ontwerp_groep_where
");
答案 3 :(得分:0)
mysql_query("SELECT * FROM boeken WHERE
( '".$categorie."' = 5 AND
categorie_id = 5
) OR
( titel LIKE '%".$titel."%' AND
categorie_id = '".$categorie."' AND
auteurs LIKE '%".$auteurs."%' AND
jaar_copyright = '".$jaar_copyright."' AND
ontwerp_groep = '".$ontwerp_groep."'
)");
答案 4 :(得分:0)
<?php
$query = "SELECT * FROM boeken WHERE";
$n = 0;
$makeAnd = "";
foreach($_POST as $key=>$value){
if($value != '' && $value != 'submit'){
if($n != 0){$makeAnd = " AND";}
if(!is_numeric($value)){
$query .= "$makeAnd `$key` LIKE '%$value%'";
} else {
$query .= "$makeAnd `$key` = '$value'";
}
$n++;
}
}
print $query;
?>
通过这种方式,您可以过滤掉空值。如果将其他值发布到$ _POST,请确保在“if($ value!=”部分。
中过滤掉它们。