通过多列搜索多个值

时间:2013-09-06 05:06:56

标签: php jquery sql

我希望创建一个搜索http://i.imgur.com/sEA34M1.png

基本上它会查看我的数据库,查找人们输入的值。

每个组合框都有不同的值(最多5个左右)。我需要以某种方式确定用户使用的值以及我需要相应地创建搜索的值。我尝试用get请求构建一个字符串构建器,但这太不安全了。

这里的问题是有一个值是“任意”意味着我将需要它来检索任何类型的值。

如果有意义,我需要以某种方式"SELECT FROM DATABASE WHERE ITEM = ANY"

谢谢!

3 个答案:

答案 0 :(得分:1)

您有5 combos/selects且每个人都包含All,因此要确定All您可以为All设置值,例如:

<option value="none">All</option>

因此,您可以检查服务器是否none提交了这样的内容

$where = array();
$where['country'] = (isset($_GET['country']) && $_GET['country'] != 'none') ? filter_var($_GET['country'], FILTER_SANITIZE_STRING) : null;
$where['state'] = (isset($_GET['state']) && $_GET['state'] != 'none') ? filter_var($_GET['state'], FILTER_SANITIZE_STRING) : null;
// Rest of them ....

$where_str = ' where ';
foreach($where as $field => $value) {
    if(!is_null($value)) {
        if(strlen($where_str) > 6) $where_str .= ' and ';
        $where_str .= "$field = '$value'";
    }
}

到目前为止,您将获得一个字符串where country = 'Bangladesh' and holiday_cost = '1000'或仅where(取决于用户选择),因此您可以检查在where子句中是否有任何内容,如

// At first your basic/default query
$sql = "select * from tablename";

// Now, if $where_str contains more than where, then add it
if(strlen($where_str) > 6) {
    $sql .= $where;
}

现在,您的SQL查询已准备就绪,您可以从此处运行查询。不要忘记filter输入,您可以使用filter-var

答案 1 :(得分:0)

您需要构建sql语句。例如:

$whr = "";
$srch1 = ( isset($_POST['suburb']) ) ? $_POST['suburb'] : "";
//-- repeat for each field
if( $srch1 != "" ) $whr .= " suburb like '%'.%srch1."%'";

$sql ="SELECT ... FROM ... ";
if( $whr != "" ) $sql .= " WHERE ".$whr;

答案 2 :(得分:0)

由于SQL区分数据类型,即使给出了特定field的值,any值总是需要由两个OR - 连接的部分组成:

  1. field =“一个慷慨的数据范围,包括任何可能的现有价值......”
  2. field IS NULL
  3. 对于数字类型1.有点复杂,必须是

    field IS BETWEEN MIN(<numeric type>) AND MAX(<numeric type>)
    

    对于字符串类型,它有点简单:

    field LIKE '%'
    

    但无论如何,这些搜索条件永远不会像您希望的那样简单它们将花费不必要的SQL服务器搜索工作量!

    所以,我想,你构建SQL搜索字符串的第一种方法仍然是在这里应用的方法。你必须付出一些努力,但我认为可以可以安全

    在类似的项目中,我使用了一个模式生成器,在其中我为每个字段组合了一个搜索条件。模式生成器需要知道字段的名称,类型和可能的表名,当然还有用户输入。然后,取决于是否有任何实际输入,它会产生

    • 没有(null) - &gt;没有比较!
    • 有效的搜索条件,例如field LIKE '<processed user input>field = or字段BETWEEN user min valueuser max value

    由于用户输入将始终根据给定field的数据类型处理(当然包括mysqli_real_escape_string()之类的最终调用)你可以使整件事安全。

    使用用户输入处理完所有字段后,您需要再次将所有生成的(而不是null)条件放在一起(用()包围它们,然后将它们收集起来一个数组($arr),最后是join(' AND ',$arr),如果有必要,确定涉及哪些表(假设将有JOIN个)。这些JOINS现在也可以有条件地应用,具体取决于给定或不给​​定的某些crieteria。这当然取决于您的表设置的更深层逻辑。