我目前在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子句中实现它,以便它不会过滤该特定字段?
答案 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的情况下,您不必担心是否根据是否存在部分或全部来附加/前置'和'。您默认选择全部(空白选择值),并根据每个选择的存在进行过滤。
当然,你需要稍微清理它,保护它,将值放入变量等等,但这是基本的逻辑。