“选择*来自myTable WHERE $ var ='y'”这可能吗?

时间:2013-08-01 16:24:39

标签: mysql select checkbox

我正在尝试按照最简单的方式执行以下操作

形式

<input type="checkbox" name="Filter[Column1]" value="y" />
<input type="checkbox" name="Filter[Column2]" value="y" />
<input type="checkbox" name="Filter[Column3]" value="y" />

PHP

$filter=(Column1, Column2, Column3);
$post= ($_POST['Filter'][Column1], $_POST['Filter'][Column2], $_POST['Filter'][Column3]);
if(isset($post) && !empty($post)){
$query= "Select * From myTable WHERE $filter='y'";
}

实际上我需要根据选中的复选框过滤行。 它有意义吗?

2 个答案:

答案 0 :(得分:2)

这很可能。变量$filter在您的SQL中被替换,因此在这种情况下,它可以完全是列名。

请注意,你必须彻底检查你的输入。如果有人要将垃圾发布到您的脚本中,查询可能会中断,或者他们甚至可能故意破坏您的数据库或窃取您的信息!

因此,我建议构建一个允许的过滤器数组,并检查该数组的发布数据。如果它不在那里,请不要在查询中使用它。

当然,想一个不同的变量名。目前您使用$filter两次,这可能会导致问题。 :)

答案 1 :(得分:0)

除了似乎没有必要使用所有$ _POST值声明$ filter以便您可以对其进行测试而不是仅测试post值,所以对我来说似乎一切都很好。

此外,由于您循环遍历每个过滤器并对每个过滤器进行单独查询,因此您实际上是在拉出三个单独的结果。我不知道这是否是预期的结果,但如果你想实际测试所有三个过滤器,那么你需要将所有过滤器放入一个由AND或OR连接的WHERE条件

if(isset($_POST['Filter']) && !empty($_POST['Filter'])){
  $query = "SELECT * FROM myTable WHERE ";
  foreach( $_POST['Filter'] as $filter ){
    $query .= "$filter='y' AND ";
  }
  // Once we add our filters, strip off that last unnecessary ' AND ' from the query string.
  $query = substr($query, 0, -5);