如何在多对多PHP/SQL关系中显示特定的rows/columns?

How to display specific rows/columns in a many-to-many PHP/SQL relationship?

我正在使用多对多关系(使用三个 tables - 用户、组、关系)来连接组内的用户。我试图找到一种方法来显示在组中注册的用户。到目前为止,这是我的代码:

通过 POST 形式按名称搜索群组:

    $errors = array();

    if(isset($_POST['groupSearchSubmit'])){
        $groupSearchName = trim($_POST['groupSearchName']);
        $query = "SELECT * FROM groups WHERE groupName = '$groupSearchName'";
        $result = mysqli_query($link, $query);

        if(mysqli_num_rows($result) != 1){
            $errors['groupSearch'] = 'No group was found with that group'
                    . 'name. Enter a different group name and try again.';
        }

        if(!$errors){
            if(mysqli_num_rows($result) == 1){
                $searchedGroupRow = mysqli_fetch_array($result, MYSQLI_BOTH);
                $_SESSION['searchedGroupID'] = $searchedGroupRow['groupID'];
                $_SESSION['searchedGroupName'] = $searchedGroupRow['groupName'];

            }
            header('Location: searchedGroup.php');
        }
    }

显示搜索组中用户的工作正在进行中:

    $searchedGroupID = $_SESSION['searchedGroupID'];
    $query = "SELECT * FROM relations WHERE groupID = '$searchedGroupID'";
    $result = mysqli_query($link, $query);

    while($row = mysqli_fetch_array($result)){
        $_SESSION['searchedGroupRelationsUserID'] = $row['userID'];
        $searchedGroupRelationsUserID = $_SESSION['searchedGroupRelationsUserID'];
        echo $searchedGroupRelationsUserID;
    }

    $query = "SELECT * FROM users WHERE userID = '$searchedGroupRelationsUserID'";
    $result = mysqli_query($link, $query);

    while($row = mysqli_fetch_array($result)){
        echo $row['email'];
    }

现在,当我 运行 通过按组名称搜索组的代码时,它正在输出不带引号的“1718testuser@email.com”。这对应于 userID 为 17 和 18 的用户在搜索组中的事实,而 userID 17 的电子邮件为 testuser@email.com.

1) 成功输出userID,为什么不输出用户18的邮箱?

2) 如何将值分隔到一个数组中,以便我可以选择在 table 中显示电子邮件,每个用户单独一行?

1)

当您 运行 以下查询时,您 select 只有一条记录。我认为这实际上可能是用户 18 的电子邮件地址?这是在上一个循环中获取的最后一个结果的电子邮件地址。

SELECT * FROM users WHERE userID = '$searchedGroupRelationsUserID'

最好的办法是对 select 用户进行一次查询:

SELECT * FROM users AS u INNER JOIN relations AS r ON u.userID = r.userID WHERE r.groupID = '$searchedGroupID'

然后迭代这些结果以获取所需的字段。

2)

你所做的是一个好的开始!我建议这样:

echo "<table><tr><th>ID</th></tr>";
while ($row = mysqli_fetch_array($result)) {
    echo "<tr><td>" . $row['userID'] . "</td><td>" . $row['email'] . "</td></tr>";
}
echo "</table>";

切点

  • 我会使用 PDO 而不是 mysql_* 函数,并准备语句。强烈建议不要使用 mysql_*,目前的代码容易受到 SQL 注入的攻击。
  • 理想情况下,您希望拆分显示代码和逻辑代码。通常,这是通过模板完成的。您将在某处获取用户的代码(例如,function getUsersInGroup($groupID) { ... }),然后将其传递给呈现类似内容的模板引擎... {{ foreach user in users }} ... {{ user.userID }} ... {{ user.email }} ... .
  • 我认为您通常不会将 session 变量用于此类事情。使用 $_GET 意味着组 ID 将在 URL 中,因此可以为组中的用户共享、收藏等页面。