如果字段为空,则返回所有结果

时间:2011-12-07 21:33:25

标签: php mysql sql

我目前正在搜索脚本,但我有一点问题。我正在使用以下查询:

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'为空等等。

我如何以我想要的方式解决这个问题?

5 个答案:

答案 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!=”部分。

中过滤掉它们。