【问题标题】:How To Count Read and Unread message in PHP mysql如何在 PHP mysql 中计算已读和未读消息
【发布时间】:2020-05-30 16:23:52
【问题描述】:

我想对 Mysql 中的已读和未读消息进行计数。

这是我的 PHP 代码:

<?php

$dbdata = "SELECT * FROM users";

if ($result = mysqli_query($db, $dbdata)) {
  if (mysqli_num_rows($result) > 0) {

    while ($row = mysqli_fetch_array($result)) {

      echo "<li class=online'><a href='?user=" .
        $row['username'] .
        "'><img alt='user pics' src='img/demo/av1.jpg' /> <span>" .
        $row['fname'] . ' ' .
        $row['lname'] . "</span><span class='msgcount'> 0</span></a></li>";

    }
    mysqli_free_result($result);

  } else {
    echo "No Students Found.";
  }

} else {
  echo "ERROR: Could not able to execute. ";
}

?>

我希望&lt;span class='msgcount'&gt; 0&lt;/span&gt; 显示该用户的未读消息计数。如果用户已经被点击,则未读消息变为 0,因为消息在点击时显示。

你能帮我解决这个逻辑吗?我只想通知有一条未读消息。谢谢各位高手帮帮我。

这是聊天消息的输出图像:

【问题讨论】:

  • 桌子长什么样?此外,mysqli 已被弃用一段时间,请考虑使用 PDO
  • @vivick 这对我来说是个新闻。我们要不要请来事实核查员?
  • 我也是新的 imn,不使用 PDO 风格的 PHP。如果我使用 PDO 是否会使安全性更好?或者我得到什么好处? @维维克
  • @villabetting 除了是对您使用的任何数据库的抽象之外,mysqli 可能会完全从 php 中消失,而 PDO(目前)可能不会

标签: php html mysql


【解决方案1】:

我是 php 新手。因此,在提供更好的答案之前,这可以作为替代方案。

您可以创建一个看起来像您的消息的表格。然后,当您发送消息时,将数据插入到两个表中。接下来,以正常方式选择您的消息。并从您的相似表中选择行数,然后在未读消息的范围内打印它。然后 onclick 让 mysqli 从相似表中删除消息。使用 jquery 自动更新 span。

【讨论】:

    【解决方案2】:

    我假设除了 users 表之外,您还有一个 messages 表。

    我会大胆假设您的消息表如下所示:

    id int pk,
    to_user_id int fk,
    from_user_id int fk,
    read bool default false,
    title varcher(250),
    body text,
    created_at datetime,
    updated_at datetime
    

    因此,用户和消息具有 1:M 关系,这是理所当然的

    您在每次页面加载或每隔几秒加入、过滤和统计用户和消息

     SELECT u.id, u.name as from, count(1) as total
     FROM users AS u
     JOIN messages AS m on u.id = m.from_user_id
     WHERE 
           to_user_id = ? -- this is the authenticated user id!
           AND `read` is false
     GROUP BY from_user_id
    

    这会给你这样的元组:

    • id,来自,总计
    • 22,约翰,1
    • 124,坦率,3
    • 523,鲍勃,1
    • 11,大卫,3

    但这需要更多的工作,因为这只会返回未读消息的用户。这样您就可以轻松查看是否有朋友的消息。

    如果您只想显示一般消息计数,例如在横幅上:

    SELECT count(1) FROM messages WHERE `read` is false and to_user_id = ? -- ? is the authenticated user id
    

    额外:

    还有很多更好的方法,比如使用 redis 缓存消息计数。

    我刚才描述的可能更简单,使用零辅助基础设施,也就是烧毁 mysql 烧录策略。

    专业提示:

    • 如果您的应用程序将严重依赖消息,例如 slack 类型的应用程序,那么将消息存储在 SQL 数据库中不是一个好主意。但是,如果您只是在学习或修补,请继续!

    【讨论】:

      【解决方案3】:

      在您的数据库中创建数据类型为int(1) Default 0 的“状态”列。

      如果我阅读了消息,则使用 1 更新状态,默认情况下我们使用 0 表示未读消息。

      现在计时。创建两个变量$total_read = 0$total_unread = 0

      在你的 while 循环中,你可以使用这个

      while($row = mysqli_fetch_array($result)) {  
          if($row['status'] == 0)
          {
              $total_unread = total_unread + 1
          } else {
              $total_read = total_read + 1
          }
      }
      

      【讨论】:

      • 但我有一个表名 stats 等待我向你展示表结构 >> 这是图片链接先生。 link
      • 先生,我该如何回应这两个变量?对不起,刚刚新来的先生。这么多问题先生。
      • 而输出变成了这样。它显示 1 只有先生 this is the output
      • 我不明白打印两个变量是什么意思
      • 据我所知,在 php 中,如果要回显两个变量,请在变量之间使用句号。例如
      猜你喜欢
      • 1970-01-01
      • 2021-09-05
      • 2015-06-28
      • 2016-10-27
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多