php - 使用 php 和 mysqli 在 html 页面中消息传递如何工作?
问题描述
我正在建立一个有消息传递功能的网站,这个功能应该像任何正常的消息传递一样工作。单击味精链接/按钮时,它会向我们显示我们聊天的人员列表(还不是对话),然后再进入该特定人的个人味精(对话),我的问题是我得到了一个重复的朋友(另一个人的用户名)当我们两个都发送时,因为我有两列用户名(登录的人)和朋友(我与之联系的人)。
我相信我的问题是逻辑问题而不是代码,但我可能错了。我尝试过使用不同类型的逻辑,但无法得到我想要的。我也相信,如果我在 while 循环内的第二个“if”中给出正确的条件,它可能会起作用。检查我的表格和下面的代码:
Table chats:
username(fk) friend chats
a b Hi b
b a Hi a
我的 PHP 和 SQL 代码是:
$username = $_SESSION['username'];
$sql = "SELECT DISTINCT username, friend FROM chats WHERE username = '$username' OR friend = '$username'";
$result = $conn->query($sql);
if($result->num_rows > 0)
{
while($row = $result->fetch_assoc())
{
if($username == $row['friend'])
{
echo "<a href = 'chat.php?usernames=".$row['username']."'>".$row['username']."</a>";
}
if($username == $row['username'])
{
echo "<a href = 'chat.php?usernames=".$row['friend']."'>".$row['friend']."</a>";
}
}
}
在上面的代码中,假设我是'a',我得到的是:'b'两次,而不是只有一个所以有两个'b',但我想要的只有一个'b'。假设第二条记录不存在,那么我只会得到一个'b',但是一旦我得到'b'的回复,它将显示2个'b',这意味着一旦有'a'和'b'的两条记录,就像在上表,将显示 2 'b'。还值得一提的是,由于我从 2 个不同的列中检查,查询中的 DISTINCT 将不起作用(如果只有 1 列而不是 2 列,我可以通过使用 distinct 解决问题)。请检查下图中的问题. 感谢您的帮助。
解决方案
您可以使用 SQL 或 PHP 来处理它。
一个 PHP 示例:
$username = $_SESSION['username'];
$sql = "SELECT username, friend FROM chats WHERE username = '$username' OR friend = '$username'";
$result = $conn->query($sql);
$chat_list = array();
if($result->num_rows > 0)
{
while($row = $result->fetch_assoc())
{
$user = ($username == $row['username'] ? $row["friend"] : $row['username']);
if(!in_array($user, $chat_list) && $user != $username)
{
$chat_list[] = $user;
}
}
}
foreach($chat_list as $a_chat)
{
echo "<a href = 'chat.php?usernames=".$a_chat."'>".$a_chat."</a>";
}
推荐阅读
- ramda.js - Ramda.js - 如何查看嵌套数组中的多个值
- mysql - 不正确的字符串值:mySql 中第 1 行的列 \'description\' 的 \'\\xC3\'
- javascript - 在数组对象上反应映射
- javascript - 如何在chrome中查看javascript代码?
- c++ - 为什么我不能从 char* 构造 wstring
- javascript - Aria-live 内容被 Mac 读取两次 - Chrome - VoiceOver
- google-sheets - google sheet image() 函数更新(缓慢、不稳定、滞后)
- python - CheckboxGroup、散景、堆积条形图
- javascript - 如何保持列表内容与其在html中的编号之间的单独对齐,将列表样式位置保持在内部?
- android - Gravity Center 拒绝为 Fragment 对象的 ConstraintLayout 中定义的按钮内的文本工作