Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/Ajax简单聊天-将管理员用户名颜色设置为红色_Php_Mysql_Ajax_Chat - Fatal编程技术网

PHP/Ajax简单聊天-将管理员用户名颜色设置为红色

PHP/Ajax简单聊天-将管理员用户名颜色设置为红色,php,mysql,ajax,chat,Php,Mysql,Ajax,Chat,我有一个简单的PHP/Ajax聊天应用程序,允许用户在统一的聊天窗口中相互交谈。我希望角色为“admin”的用户在聊天窗口中的用户名显示为红色,而不管是谁登录的 以下是用户表列: 以下是消息表列: 我拥有会话-$\u会话['name']和$\u会话['role']中用户表中的用户名和角色,$\u会话['name']写入消息表中的用户列 下面是我用来get和send将消息发送到窗口的PHP开关语句: switch( $_REQUEST['action'] ) { case &q

我有一个简单的PHP/Ajax聊天应用程序,允许用户在统一的聊天窗口中相互交谈。我希望角色为“admin”的用户在聊天窗口中的用户名显示为红色,而不管是谁登录的

以下是用户表列:

以下是消息表列:

我拥有会话-
$\u会话['name']
$\u会话['role']
中用户表中的用户名和角色,
$\u会话['name']
写入消息表中的
用户

下面是我用来
get
send
将消息发送到窗口的PHP开关语句:

switch( $_REQUEST['action'] ) {
        case "sendMessage":
            $stmt = $pdo->prepare("INSERT INTO messages SET user = ?, message = ?");
            $run = $stmt->execute([$_SESSION['name'], $_REQUEST['message']]);

            if ( $run ) {
                echo 1;
                exit;
            }
        break;
        case "getMessages":
            $stmt = $pdo->prepare("SELECT * FROM messages");
            $run = $stmt->execute();
            $results = $stmt->fetchAll(PDO::FETCH_OBJ);

            $chat = '';
            foreach($results as $message){
                $chat .= '<div class="single-message border">
                            <strong class="text-uppercase">'.$message->user.': </strong>
                            <p> '.$message->message.'</p>
                            <span class="float-right">'.date('h:i a', strtotime($message->date)).'</span>
                          </div>';
            }
            echo $chat;
        break;

在详细考虑了sql语句之后,在这里发布的人们的帮助下,我就是这样解决了这个问题的。请让我知道是否有更优雅(正确)的方法。我将
getMessages
switch语句更改为:

case "getMessages":

            $stmt = $pdo->prepare('SELECT m.*, u.role FROM messages m INNER JOIN users u ON m.user = u.username');
            $stmt->execute();
            $results = $stmt->fetchAll(PDO::FETCH_OBJ);

            $chat = '';
            foreach($results as $message) {
                if ($message->role == 'Admin') {
                    $chat .= '<div class="single-message border">
                        <strong class="text-uppercase">' . $message->user . ': </strong>[admin]
                        <p> ' . $message->message . '</p>
                        <span class="float-right">' . date('h:i a', strtotime($message->date)) . '</span>
                      </div>';
                } else {
                    $chat .= '<div class="single-message border">
                        <strong class="text-uppercase">' . $message->user . ': </strong>
                        <p> ' . $message->message . '</p>
                        <span class="float-right">' . date('h:i a', strtotime($message->date)) . '</span>
                      </div>';
                }
            }
            echo $chat;
        break;
案例“getMessages”:
$stmt=$pdo->prepare('SELECT m.*,u.role FROM messages m internal JOIN users u ON m.user=u.username');
$stmt->execute();
$results=$stmt->fetchAll(PDO::FETCH_OBJ);
$chat='';
foreach($results as$message){
如果($message->role==“Admin”){
$chat.='
。$message->user.:[admin]
“.$message->message”

“.date('h:ia',strottime($message->date))。” '; }否则{ $chat.=' 。$message->user.: “.$message->message”

“.date('h:ia',strottime($message->date))。” '; } } echo$chat; 打破

如果有更简单的方法,请告诉我。注意:我选择在用户名后面加上[admin],而不是更改文本颜色,这似乎更便于用户使用。

首先,尝试使用fetchObject,并进行迭代,直到返回false。
这种方法占用的内存更少,速度更快,因为您只使用一个数组,而不使用数组和字符串

用这种方式添加“[admin]”是可以的,但是您有重复的代码。 如果你想在以后的代码中改变一些东西,那将是痛苦的。 例如,当您想更改“单一消息”类名时,必须在两个位置进行更改。 第二个错误是使用fetchAll和遍历fetched数组

此代码应该更好:

case "getMessages":

            $stmt = $pdo->prepare('SELECT m.*, u.role FROM messages m INNER JOIN users u ON m.user = u.username');
            $stmt->execute();

            $chat = '';
            while( $message = $stmt->fetchObject() ) {
                $admin = "";
                if ($message->role == 'Admin') {
                    $admin = "[admin]";
                }
                    $chat .= '<div class="single-message border">
                        <strong class="text-uppercase">' . $message->user . '</strong>'
                       . $admin . '<p> ' . $message->message . '</p>
                        <span class="float-right">' . date('h:i a', strtotime($message->date)) . '</span>
                      </div>';

            }
            echo $chat;
        break;


我想你会知道如何从JSON中提取数据并用javascript在客户端显示:)

我想在获取数据后,你可以检查
role=“Admin”
是否正确,那么你就不需要在查询中输入这个
role=:role
条件了,也可以像这样从数据库中获取用户角色-$sql='从消息m中选择m.*,从消息m中选择u.role在m.user=u.username上加入用户u,其中u.role=:role和u.username=:username';。我假设您正在“users”表中存储用户角色。然后在switch case语句中-case“getMessages”:-您可以检查用户角色是否为admin,红色-可能正在使用css..请不要发布text@Strawberry-我在数据库中发布了列的图片-我以前被要求这样做-有什么问题吗?@Swati-很好-谢谢你。我知道有更好的方法-应该考虑使用while循环-谢谢你。至于另一种方式——我喜欢你说的话——但是——我不太理解你的意思——我与PHP相处得很好,并且刚刚开始学习javascript。您能对您的评论进行扩展吗?@SteveShead抱歉,在我的代码中我丢失了语句:)在while循环之后,请添加:header(“内容类型:application/json”);echo json_编码($messages);模具();现在在javascript中,您将获得json数组而不是html代码。接下来,迭代这个数组,通过将消息作为子消息插入到#chat container中,在html代码中创建DOM节点。
case "getMessages":

            $stmt = $pdo->prepare('SELECT m.*, u.role FROM messages m INNER JOIN users u ON m.user = u.username');
            $stmt->execute();
            $results = $stmt->fetchAll(PDO::FETCH_OBJ);

            $chat = '';
            foreach($results as $message) {
                if ($message->role == 'Admin') {
                    $chat .= '<div class="single-message border">
                        <strong class="text-uppercase">' . $message->user . ': </strong>[admin]
                        <p> ' . $message->message . '</p>
                        <span class="float-right">' . date('h:i a', strtotime($message->date)) . '</span>
                      </div>';
                } else {
                    $chat .= '<div class="single-message border">
                        <strong class="text-uppercase">' . $message->user . ': </strong>
                        <p> ' . $message->message . '</p>
                        <span class="float-right">' . date('h:i a', strtotime($message->date)) . '</span>
                      </div>';
                }
            }
            echo $chat;
        break;
case "getMessages":

            $stmt = $pdo->prepare('SELECT m.*, u.role FROM messages m INNER JOIN users u ON m.user = u.username');
            $stmt->execute();

            $chat = '';
            while( $message = $stmt->fetchObject() ) {
                $admin = "";
                if ($message->role == 'Admin') {
                    $admin = "[admin]";
                }
                    $chat .= '<div class="single-message border">
                        <strong class="text-uppercase">' . $message->user . '</strong>'
                       . $admin . '<p> ' . $message->message . '</p>
                        <span class="float-right">' . date('h:i a', strtotime($message->date)) . '</span>
                      </div>';

            }
            echo $chat;
        break;

$stmt = $pdo->prepare('SELECT m.*, u.role FROM messages m INNER JOIN users u ON m.user = u.username');
$stmt->execute();

$messages = [];
while ($message = $stmt->fetchObject()) {
    $message->date_formatted = date('h:i a', strtotime($message->date));
    $messages[] = $message;
}