【问题标题】:fetching chat messages from mysql从 mysql 获取聊天消息
【发布时间】:2017-11-10 16:09:47
【问题描述】:

我正在获取两个用户之间的聊天消息,并希望以两种不同的颜色显示消息。

<?php
    session_start();  
?>
<html>
    <head></head>
    <body>
        <?php
            require("config.php");
            $id = $_POST['id'];
            $sql = "select * from users where id='$id'";
            $res = mysqli_query($con, $sql);
            $row = mysqli_fetch_array($res);
            $user_to = $row['name'];
            $sql1 = "select * from chats where user_from='$_SESSION[name]' AND user_to='$user_to' OR user_to='$_SESSION[name]' AND user_from='$user_to' order by id";
            $res1 = mysqli_query($con, $sql1);
            if(mysqli_num_rows($res1) > 0) {
                while($row = mysqli_fetch_array($res1)) {
                    if($row['user_from'] == $_SESSION['name'])
                        $color = 'red';
                    else
                        $color = 'purple';
                    echo '<i><p style="font-family:arial;color:' . $color . ';font-size:15px;">' . $row['msg'] . '</p>';
                }
            } else
                echo "No msgs <br />";
        ?>
    </body>
</html>

例如登录的用户,他的消息应该是红色的,他正在检查的消息应该是紫色的。问题是所有获取的消息都变红了。

【问题讨论】:

  • Little Bobbyyou may be at risk for SQL Injection Attacks。通过parameterized queries 了解Prepared Statements。我推荐PDO,我推荐wrote a class for,使其比使用非参数化查询更容易、更干净、更安全。此外,This article 可以帮助您在 MySQLiPDO 之间进行选择
  • $row['user_from'] 的内容是什么样的?我假设它是一个用户标识,而不是一个名称。如果没有,应该是。
  • 我知道这只是帮助我。
  • @grumpy user_from是当前登录的用户名
  • 我正在帮助你。安全性应该始终是您编写的任何代码的主要关注点。就目前而言,您有一个巨大的注入漏洞,任何攻击者都会发现并滥用。

标签: php css mysql stylesheet


【解决方案1】:

这里的问题在于您对$sql1 的逻辑,您说的是select * from chats where user_from='$_SESSION[name]' AND....

然后你做这个检查:

if($row['user_from'] == $_SESSION['name'])
    $color = 'red';

该检查将始终为true,因为您实际上只是要求mysql为您提供user_from是登录用户的所有聊天,现在您告诉程序如果@987654326将颜色设置为红色@ 是登录用户,它将永远是,因为这是您要求的。

您应该重组处理颜色的 if 语句,因为现在您的逻辑对于您正在尝试做的事情没有任何意义。

编辑:

我不明白您是如何将任何消息发送给用户的,因为现在您的 sql 查询只是查看来自用户的消息(或者看起来如此)。如果我的假设是正确的,我建议您重组您的 $sql1 查询以将所有消息发送给登录用户,以及来自与$user_to 通信的登录用户,因为我是还假设您只想关注这两个用户之间的特定线程。

假设使用这个新查询,您有两个用户在聊天:

  • User1 已登录,试图与 user2 聊天。当他们将聊天插入数据库时​​,user_from = user1user_to = user2

  • User2 已登录,正在与 user1 聊天。当他们插入聊天时,user_from = user2user_to = user1

由于您希望这两个用户都能看到线程中的消息,因此您需要一个查询来查找从 user1 到 user2 以及从 user2 到 user1 的消息。

为了创建正确的查询,您应该做出以下假设:

  • user_from 需要是登录用户或 $user_to 用户(他们正在与之聊天的用户),因为这两个用户是
    线程)
  • user_to 也需要是这两个用户之一,因为他们是线程中唯一的用户。

您可以通过类似于以下的查询在此线程中获取消息: select * from chats where user_from='$_SESSION[name]' OR user_from='$user_to' AND user_to='$_SESSION[name]' OR user_to='$user_to'

如果我对您的程序的假设是正确的,您可以整合我的逻辑,并且该查询或与它非常相似的查询应该可以很好地完成您想要完成的任务,只要您的所有其他代码都是正确的。

一旦您正确检索了两个用户之间的消息,您应该像在问题中一样集成消息颜色,因为您的 sql 查询是您的 if 语句中的逻辑混乱的原因。

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 2021-10-04
    • 1970-01-01
    • 2014-01-05
    • 2016-07-23
    • 2016-05-22
    • 2017-12-31
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多