我希望创建一个搜索http://i.imgur.com/sEA34M1.png
基本上它会查看我的数据库,查找人们输入的值。
每个组合框都有不同的值(最多5个左右)。我需要以某种方式确定用户使用的值以及我需要相应地创建搜索的值。我尝试用get请求构建一个字符串构建器,但这太不安全了。
这里的问题是有一个值是“任意”意味着我将需要它来检索任何类型的值。
如果有意义,我需要以某种方式"SELECT FROM DATABASE WHERE ITEM = ANY"
。
谢谢!
答案 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
- 连接的部分组成:
field =
“一个慷慨的数据范围,包括任何可能的现有价值......”field IS NULL
对于数字类型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 value
和user max value
由于用户输入将始终根据给定field
的数据类型处理(当然包括mysqli_real_escape_string()
之类的最终调用)你可以使整件事安全。
使用用户输入处理完所有字段后,您需要再次将所有生成的(而不是null
)条件放在一起(用(
,)
包围它们,然后将它们收集起来一个数组($arr
),最后是join(' AND ',$arr)
,如果有必要,确定涉及哪些表(假设将有JOIN
个)。这些JOINS
现在也可以有条件地应用,具体取决于给定或不给定的某些crieteria。这当然取决于您的表设置的更深层逻辑。