1

我正在寻找这样的搜索http://i.imgur.com/sEA34M1.png

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

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

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

"SELECT FROM DATABASE WHERE ITEM = ANY"如果这是有道理的,我需要以某种方式。

谢谢!

4

3 回答 3

1

您拥有5 combos/selects并且每个都包含一个Allso 来确定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

于 2013-09-06T06:02:31.977 回答
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;
于 2013-09-06T05:13:34.090 回答
0

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

  1. field =“包含任何可能的现有值的大量数据范围......”
  2. field IS NULL

对于数字类型 1. 有点复杂,必须类似于

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

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

field LIKE '%'

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

所以,我想,您构建 SQL 搜索字符串的第一种方法仍然是这里要应用的方法。您将不得不为此付出一些努力,但我认为它仍然可以变得安全

在类似的项目中,我使用了一个模式生成器,其中我为每个字段设置了一个搜索标准。模式生成器需要知道字段的名称、类型和可能的表名,当然还有用户输入。然后,取决于是否实际输入了任何内容

  • 什么都没有(null)->没有比较!
  • 一个有效的搜索条件,如BETWEEN ANDfield LIKE '<processed user input>或字段field =oruser min valueuser max value

由于用户输入将始终根据给定的数据类型 进行处理field(当然包括类似的最终调用mysqli_real_escape_string()),您可以使整个事情变得安全。

在使用用户输入处理所有字段后,您需要将所有生成的(不是)标准再次放在一起(用,null包围它们,将它们收集在数组中(将s) 参与。这些现在也可以根据是否给出某些标准有条件地应用。这当然真的取决于你的表设置的更深层次的逻辑。()$arrjoin(' AND ',$arr)JOINJOINS

于 2013-09-06T05:22:14.870 回答