PHP/Ajax简单聊天-将管理员用户名颜色设置为红色
我有一个简单的PHP/Ajax聊天应用程序,允许用户在统一的聊天窗口中相互交谈。我希望角色为“admin”的用户在聊天窗口中的用户名显示为红色,而不管是谁登录的 以下是用户表列: 以下是消息表列: 我拥有会话-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
$\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;
}