使用PHP / MySQL和选择框正确过滤

时间:2009-12-11 18:49:13

标签: php mysql select

我目前在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 个答案:

答案 0 :(得分: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子句的一部分。

如果你没有逃避传入的$ _POST数据,你会对SQL注入攻击持开放态度,所以你需要做的就是在你的$ _POST值上运行mysql_real_escape_string(),我将其添加到例。听起来你已经意识到了这一点。

答案 1 :(得分:1)

不考虑sql注入等,这是一种方法的基本逻辑。 Psudo-code,或者当然。

<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的情况下,您不必担心是否根据是否存在部分或全部来附加/前置'和'。您默认选择全部(空白选择值),并根据每个选择的存在进行过滤。

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