【问题标题】:Properly Filter with PHP/MySQL and Select Box使用 PHP/MySQL 正确过滤并选择框
【发布时间】:2009-12-11 18:49:12
【问题描述】:

我目前在 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 子句中实现它,以便它不会过滤该特定字段?

【问题讨论】:

  • 我希望您使用准备好的语句来避免 SQL 注入。
  • 我是,我只是保持简洁,以使“问题”尽可能简单。

标签: php mysql select


【解决方案1】:

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

<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(),这是我在示例中添加的。不过,听起来您已经意识到了这一点。

【讨论】:

    【解决方案2】:

    不考虑sql注入等,这是一种方法的基本逻辑。伪代码,或课程。

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

    当然,您需要对其进行一些清理、保护、将值放入变量等,但这是基本逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多