我正在寻找这样的搜索http://i.imgur.com/sEA34M1.png
基本上它会通过我的数据库查找人们输入的值。
每个组合框会有不同的值(最多 5 个左右)。我需要以某种方式确定用户使用哪些值,并使用这些值创建相应的搜索。我尝试使用 get 请求构建字符串构建器,但这太不安全了。
这里的问题是有一个值是“任何”,这意味着我需要它来检索任何类型的值。
"SELECT FROM DATABASE WHERE ITEM = ANY"
如果这是有道理的,我需要以某种方式。
谢谢!
我正在寻找这样的搜索http://i.imgur.com/sEA34M1.png
基本上它会通过我的数据库查找人们输入的值。
每个组合框会有不同的值(最多 5 个左右)。我需要以某种方式确定用户使用哪些值,并使用这些值创建相应的搜索。我尝试使用 get 请求构建字符串构建器,但这太不安全了。
这里的问题是有一个值是“任何”,这意味着我需要它来检索任何类型的值。
"SELECT FROM DATABASE WHERE ITEM = ANY"
如果这是有道理的,我需要以某种方式。
谢谢!
您拥有5 combos/selects
并且每个都包含一个All
so 来确定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。
您需要构建 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;
由于 SQL 区分数据类型,即使为特定field
的值提供了值,该any
值也总是需要由两个OR
连接的部分组成:
field =
“包含任何可能的现有值的大量数据范围......”field IS NULL
对于数字类型 1. 有点复杂,必须类似于
field IS BETWEEN MIN(<numeric type>) AND MAX(<numeric type>)
对于字符串类型,它有点简单:
field LIKE '%'
但无论如何,这些搜索条件永远不会像您希望的那样简单,而且它们将花费 SQL 服务器不必要的搜索工作!
所以,我想,您构建 SQL 搜索字符串的第一种方法仍然是这里要应用的方法。您将不得不为此付出一些努力,但我认为它仍然可以变得安全。
在类似的项目中,我使用了一个模式生成器,其中我为每个字段设置了一个搜索标准。模式生成器需要知道字段的名称、类型和可能的表名,当然还有用户输入。然后,取决于是否实际输入了任何内容
null
)->没有比较!field LIKE '<processed user input>
或字段field =
or
user min value
user max value
由于用户输入将始终根据给定的数据类型 进行处理field
(当然包括类似的最终调用mysqli_real_escape_string()
),您可以使整个事情变得安全。
在使用用户输入处理所有字段后,您需要将所有生成的(不是)标准再次放在一起(用,null
包围它们,将它们收集在数组中(将s) 参与。这些现在也可以根据是否给出某些标准有条件地应用。这当然真的取决于你的表设置的更深层次的逻辑。(
)
$arr
join(' AND ',$arr)
JOIN
JOINS