使用PHP和MySQL进行搜索过滤

使用PHP和MySQL进行搜索过滤,php,mysql,Php,Mysql,我正在编写一个搜索过滤器,它将获取条件列表,查询数据库,并返回匹配的用户名数组。以下是我正在做的事情: if (!empty($_GET['cat'])) { $category = urldecode($_GET['cat']); $category_query = "SELECT DISTINCT username FROM tutor_subjects_taught WHERE category = '{$category}'"; $category_process

我正在编写一个搜索过滤器,它将获取条件列表,查询数据库,并返回匹配的用户名数组。以下是我正在做的事情:

if (!empty($_GET['cat'])) {
    $category = urldecode($_GET['cat']);
    $category_query = "SELECT DISTINCT username FROM tutor_subjects_taught WHERE category = '{$category}'";
    $category_process = mysql_query($category_query);
    while ($row2 = mysql_fetch_assoc($category_process)) {
        $usernames[] = $row2['username'];
    }
}
这将从URL获取集合类别,并在数据库中查询与之匹配的用户名,然后将其放入数组中

现在,我需要做的是使用额外的“过滤器”来缩小这些用户名的范围。我的问题是:如果已经设置了$usernames数组,我如何创建一个循环查询来签出每个用户名,然后返回一个匹配的子集数组

例如,假设$usernames已经由前一段代码设置,因为我们已经有了一个$u GET['cat']变量集。现在,我们添加另一个$u GET变量“rev”:


首先,你不应该使用mysql。改用。这提高了网站的安全性。这将使黑客更难使用SQL注入

对于筛选,您可以在一个查询中完成所有操作,方法是在开始时设置所有筛选器。制作一个
$filter
变量,保存所有值

例如:

$filters = array();

if (!empty($_GET['cat'])) {
    $category = urldecode($_GET['cat']);
    $filter[] = 'category = ' . $category;
}

if (!empty($_GET['rev'])) {
    $anotherFilter = urldecode($_GET['rev']);
    $filters[] = 'anotherFilter = ' . $anotherFilter;
}

$filter = implode(' AND ', $filters);
$filter = $mysqli->real_escape_string($filter);

$mysqli = new mysqli('localhost', 'username', 'password', 'database');
$stmt = $mysqli -> prepare("SELECT DISTINCT username FROM tutor_subjects_taught WHERE '$filter'");
$stmt -> execute();
$stmt -> bind_result($username);
/* fetch values */
    while ($stmt->fetch()) {
        printf ("%s\n", $username);
    }
$stmt -> close();
$mysqli -> close();

让我看看我是否做对了。您希望查询数据库中的筛选器,创建结果数组,然后对另一个筛选器和创建的数组执行相同的操作。然后对每个过滤器进行反复检查?基本上,如果URL中设置了一个过滤器,我希望根据该条件查询用户并返回他们的用户名数组。然后,如果随后还设置了另一个过滤器,我想查询数据库中已经提取的每个用户名,看看这些用户是否也符合新的条件。然后我想返回一个符合这两个条件的用户数组。假设我们从5个教“数学”的用户开始,然后设置一个新的过滤器“至少有5个评论”。系统应该计算每个用户名,并检查他们是否有至少5条评论。只有那些会被退回。谢谢你的回答。我对MySQLi不太熟悉,但我可以检查一下。这种方法的问题在于,我设置东西的方式是,大多数过滤器将从不同的表中提取信息,因此仅查询导师教授的科目是不够的。您是否建议使用您的方法查询多个表?请使用。好教程
$filters = array();

if (!empty($_GET['cat'])) {
    $category = urldecode($_GET['cat']);
    $filter[] = 'category = ' . $category;
}

if (!empty($_GET['rev'])) {
    $anotherFilter = urldecode($_GET['rev']);
    $filters[] = 'anotherFilter = ' . $anotherFilter;
}

$filter = implode(' AND ', $filters);
$filter = $mysqli->real_escape_string($filter);

$mysqli = new mysqli('localhost', 'username', 'password', 'database');
$stmt = $mysqli -> prepare("SELECT DISTINCT username FROM tutor_subjects_taught WHERE '$filter'");
$stmt -> execute();
$stmt -> bind_result($username);
/* fetch values */
    while ($stmt->fetch()) {
        printf ("%s\n", $username);
    }
$stmt -> close();
$mysqli -> close();