Php 从MySQL返回相同的结果-我知道原因,但不知道解决方案

Php 从MySQL返回相同的结果-我知道原因,但不知道解决方案,php,mysql,Php,Mysql,我试图实现的目标:我试图创建一个过滤器,学生可以使用该过滤器按级别、性别或学科筛选我网站上的导师。为此,我创建了复选框,当作为ON提交或选中时,将运行查询以查找符合该条件的导师。我使用了while循环来检查哪些复选框已被选中 发生的情况:查询返回的结果是正确的,但假设一名教师教数学和英语,那么他将返回结果分区两次。这是因为导师完成了两个查询,并返回了两次 我不知道如何去解决这个问题,所以提前谢谢大家,我会感谢大家的帮助,下面是HTML和PHP编码的相关部分 <form action=""

我试图实现的目标:我试图创建一个过滤器,学生可以使用该过滤器按级别、性别或学科筛选我网站上的导师。为此,我创建了复选框,当作为ON提交或选中时,将运行查询以查找符合该条件的导师。我使用了while循环来检查哪些复选框已被选中

发生的情况:查询返回的结果是正确的,但假设一名教师教数学和英语,那么他将返回结果分区两次。这是因为导师完成了两个查询,并返回了两次

我不知道如何去解决这个问题,所以提前谢谢大家,我会感谢大家的帮助,下面是HTML和PHP编码的相关部分

<form action="" method="get" >
  Name: 
    <input type="text" name="tutor_name"><br>
  Level:
    <input type="checkbox" name="check[]" value="gcse">GCSE
    <input type="checkbox" name="check[]" value="a_level">A Level<br>
  Gender:
    <input type="checkbox" name="check[]" value="male">Male
    <input type="checkbox" name="check[]" value="female">Female<br>
  Subject:
    <input type="checkbox" name="check[]" value="maths">Maths
    <input type="checkbox" name="check[]" value="science">Science
    <input type="checkbox" name="check[]" value="english">English<br>
  <input type="submit" value="Go!">

您应该有一个简单的查询,一次检查多个值:

SELECT DISTINCT ...
WHERE 1 in (maths, english, male, a_level)
现在,您正在独立地运行多个查询,因此,对于每个具有两个或更多您正在搜索的属性的导师,您都会得到一个重复的导师。如果不能重写为单查询模型,则必须获取每个查询的结果,然后在PHP中组合它们以过滤出重复项

另外,请注意,您编写的查询容易受到攻击。在解决此问题之前,不要在生产系统上使用该代码。

您可以尝试:

$check = mysql_query("SELECT `tutor_id` FROM `tutors` WHERE $check=1 GROUP BY `tutor_id`");
编辑:

或者选择一个不同的。。。可以用

试试这个

if(!empty($_GET['check'])){
  $chks = array(); //Declare Array
  foreach($_GET['check'] as $check) {
    $chks[] = "$check=1"; // Add 'checkboxvalue=1' to the array
  }
  $check = implode(' OR ',$chks); // Join the array with ' OR '
  $check = mysql_query("SELECT `tutor_id` FROM `tutors` WHERE $check");

    $number= mysql_num_rows($check);
      echo "<b>$number</b> results";

  while($row = mysql_fetch_array($check)){
    $tutor_data = tutor_data($row['tutor_id'], 'first_name','image','rating','bio','last_name');

    echo "<br><h3> " . $tutor_data['first_name'];
    echo " " . $tutor_data['last_name'];
    echo "</h3><br>" . $tutor_data['bio'];
    echo "<br>Rating: " . $tutor_data['rating']. "<br><br>";
    }

}

在这里,我在循环中构建where子句并执行单个查询。

PSA:mysql_*函数是。不建议编写新代码,因为这样会阻止您将来升级。相反,请使用或和。@user2631669看到这样删除了注释。您的数据库结构似乎有点奇怪,如果添加了新主题,则需要更改结构。始终避免在循环中运行查询。@Sebastien Yes也不起作用。在它们不起作用之前尝试过,因为查询彼此独立。无论如何,谢谢您尝试了这一点,但没有成功:$check\u query=mysql\u query从tutors中选择不同的tutors\u id,其中$check;中有1;。我的代码如何易受攻击?提前谢谢。http://example.com/foo.php?check=; 下桌学生-。我真诚地希望小鲍比·泰克斯不是你的学生/客户。。。阅读我链接到的网站。非常感谢,我没有意识到这个问题。我会好好读一读的。你是个天才,一个超级骗子谢谢你。你介意解释前5行代码吗。据我所知,您已经创建了一个名为$chks的数组,对于每个提交的名为CHECK的get变量,其值都会插入到数组中。刚刚创建了一个数组$chks,并将复选框项存储在该数组中。例如:如果你检查了数学和英语,数组将是$chks=array'math=1','english=1',然后我用'OR'加入这个数组,因此字符串变成math=1或english=1,并成为一个很好的where条件。在foreach$toCheck=array'gcse'=>1,'a_level'=>1,'male'=>1,'math'=>1,'science'=>1,'english'=>1;如果$toCheck[$check]。。。
if(!empty($_GET['check'])){
  $chks = array(); //Declare Array
  foreach($_GET['check'] as $check) {
    $chks[] = "$check=1"; // Add 'checkboxvalue=1' to the array
  }
  $check = implode(' OR ',$chks); // Join the array with ' OR '
  $check = mysql_query("SELECT `tutor_id` FROM `tutors` WHERE $check");

    $number= mysql_num_rows($check);
      echo "<b>$number</b> results";

  while($row = mysql_fetch_array($check)){
    $tutor_data = tutor_data($row['tutor_id'], 'first_name','image','rating','bio','last_name');

    echo "<br><h3> " . $tutor_data['first_name'];
    echo " " . $tutor_data['last_name'];
    echo "</h3><br>" . $tutor_data['bio'];
    echo "<br>Rating: " . $tutor_data['rating']. "<br><br>";
    }

}