2009-12-11 53 views
2

我目前在MySQL中有一个很大的表,有几个字段。我目前正在尝试允许用户通过选择框筛选每个字段。正确过滤PHP/MySQL和选择框

我有4个领域:学校,部门和国家。

我没有问题,使用PHP,如何筛选基于用户在选择框中选择哪个选项。

例如,如果这3个提交:

<select id="school"> 
<option value="13">John Brown School</option> 
</select> 

<select id="division"> 
<option value="I">I</option> 
</select> 

<select id="state"> 
<option value="NY">New York</option> 
</select> 

我将能够根据每个选项进行查询,如:

$school= $_POST['school']; 
$division= $_POST['division']; 
$state = $_POST['state']; 

Query: SELECT * from table WHERE school=$school AND division=$division and state=$state 

但是,如果我想有一个“全“选项(在选择框中),我将如何将它实现到查询或WHERE子句中,以便它不会过滤该特定字段?

+2

我希望你使用准备好的语句来避免SQL注入。 –

+0

我是,我只是保持简洁,以保持'问题'尽可能简单。 – Dodinas

回答

4

你应该简单地做一个你特别寻找的选项。事实上,在这种情况下,听起来最好的选择是使您的选择框具有“全部”选项,或者将它们留空。空白选择可以是您的默认选项。我把它设置为:

<option value="">-- All schools --</option> 
etc. 

现在,设置查询变量的时候,你这样做:。

$whereClauses = array(); 
if (! empty($_POST['school'])) $whereClauses[] = 'school='.mysql_real_escape_string($_POST['school']); 
if (! empty($_POST['division'])) $whereClauses[] ='division='.mysql_real_escape_string($_POST['division']); 
if (! empty($_POST['state'])) $whereClauses[] = 'state='.mysql_real_escape_string($_POST['state']); 

$where = ''; 
if (count($whereClauses) > 0) { 
    $where = 'WHERE '.implode(' AND ',$whereClauses); 
} 

$query = "SELECT * FROM table ".$where; 

现在,如果任何选择选项获得与空值选择(即使用全部),它们将不会成为WHERE子句的一部分。

你是开放的SQL注入攻击,如果你不逃避传入$ _ POST数据一样,所以有一件事你需要做的是运行在你的$ _POST价值观,这是我到例如添加mysql_real_escape_string()。听起来你已经意识到了这一点。

1

不考虑SQL注入等,这里是一个方法来做到这一点的基本逻辑。 Psudo代码或课程。

<select id="select1"> 
    <option value="">All</option> 
    <option value="value1">Value1</option> 
    ... 
</select> 



$sql = "select ... from ... where 1 = 1 "; 

if (!empty($_POST["select_1"])) { 
    $sql .=" and field1 = select1value"; 
} 

if (!empty($_POST["select_2"])) { 
    $sql .=" and field2 = select2value"; 
} 

if (!empty($_POST["select_one"])) { 
    $sql .=" and field3 = select3value"; 
} 

// Etc. 

这样,与1 = 1,您不必担心是否要追加基于一些或所有这些是否存在/添加“和”。您默认选择全部(空白选择值),并根据每个选择的存在进行过滤。

当然,您需要清理它,保护它,将值放入变量等,但这是基本逻辑。