如何在多对多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 中,因此可以为组中的用户共享、收藏等页面。
我正在使用多对多关系(使用三个 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 中,因此可以为组中的用户共享、收藏等页面。