【问题标题】:PHP and SQL multiple/conditional filters queryPHP 和 SQL 多重/条件过滤器查询
【发布时间】:2018-07-31 08:21:42
【问题描述】:

我有一个包含以下字段的表格

id | Name         | Gender | Country | Math | English | Science
---------------------------------------------------------------
1  | Paul Allen   | Male   | USA     | 4    | 2       | 
2  | Andrew Cur   | Male   | GBR     |      | 1       | 2
3  | Paul Hanz    | Male   | GER     | 5    | 2       | 2
4  | Angela Dow   | Female | AUT     | 3    |         | 1
5  | Dana Loconto | Female | USA     | 2    |         |

我的用户可以使用 html 表单和 php.ini 以多种方式过滤此表。 他们可以按用户名过滤,按国家过滤,按性别过滤。这很容易实现。我的问题是,我还需要能够根据成绩进行过滤。例如:

“我想知道所有数学成绩为 2 和 3 并且科学成绩为 1 的女性”。

尽管我知道如何使用 AND 和 OR 手动编写查询,但事实证明,我很难根据用户使用表单传递的参数来组织最终查询。特别是在成绩方面。

有什么见解可以指引我走上正确的道路吗?

编辑:经过一些建议后,我还使用了以下内容:

 'code' $cchair = count($_POST['f_chair']);
$commas = 1; 
$query_officials .= " AND o_math IN (";
foreach($_POST['f_math'] as $val) { 
$query_officials .= "'".$val."'"; 
if ($commas < $cchair) { $query_officials .= ", "; $commas++; } 
}
$query_officials .= ")";

【问题讨论】:

标签: php html mysql sql filter


【解决方案1】:

下面这样的东西应该可以工作。 请注意,您需要允许对某些值进行多项选择(例如,您可以在下拉列表中选择多个等级),因此您可以这样构建查询。我没有准确地测试过这件作品,但之前使用过这种方法并且它有效。

$query = “select * from mytable where ” 
If(isset($_POST['gender']) {  //First field
    $query .=  "gender = " . $_POST['gender']
}

If(isset($_POST['math']) {  //Second field (array type of field since there could be more than one choice in the drop down)
    $query .=  "AND math in ( ";
    foreach($_POST['math'] as $value)
        {
            $query .= $value . ','
        }
    $query .= ')';
}
//You repeat this for every field that has a value from your form

【讨论】:

  • 我喜欢你的方法。起初我在复选框上添加了 5 个不同的可能等级,然后为每个生成一个不同的 POST 变量。我假设如果我使用多选表单,它们将作为一个数组出现,以便我可以循环浏览它们?这让事情变得容易一些。我会尝试使用你的方法,看看我会带来什么。
  • 我有一个简单的问题。在循环的最后一个值之后,我将如何处理,“,”消失了?如果我的查询在 IN 中的最后一个值之后有一个“,”,它会给我一个错误。
  • 我做了以下工作来解决这个问题。不确定我们是否有更简单的解决方案:'code' $cchair = count($_POST['f_chair']); $逗号 = 1; $query_officials .= " AND o_math IN ("; foreach($_POST['f_math'] as $val) { $query_officials .= "'".$val."'"; if ($commas
  • 那行得通。您可以编辑您的问题以添加代码片段。它们在 cmets 区域看起来很糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多