我正在尝试使用PHP和MySQL在admin和用户之间创建在线聊天。因为我创建了一个用于保存来自管理员和用户的消息的公共表。我使用了两个不同条件的while循环,比如打印他们的消息。通过一起使用while循环,一个循环只能工作..请你帮我工作2同时循环工作...
这是我的PHP代码: -
<?php
$userid=$_SESSION['registerid'];
$sql1="select * from registers where registerid='$userid'";
$query1=mysql_query($sql1,$con);
$result1=mysql_fetch_array($query1);
$username=$result1['name'];
$sql18="select * from usertoadmin_chat where userid='$userid' and sender='$username'";
$query18=mysql_query($sql18,$con);
$sql19="select * from usertoadmin_chat where sender='Admin' and userid='$userid'";
$query19=mysql_query($sql19,$con);
?>
这里我的显示代码: -
<form method="post" action="#">
<div class="chat-content chat-scrollbar">
<?php while($row19=mysql_fetch_array($query19)) { ?>
<?php while($row18=mysql_fetch_array($query18)) { ?>
<div class="author-chat">
<h3><?php echo $row18['sender'];?><span class="chat-date"><?php echo $row18['time'];?></span></h3>
<p><?php echo $row18['msg'];?></p>
</div>
<div class="client-chat">
<h3><?php echo $row19['sender'];?><span class="chat-date"><?php echo $row19['time'];?></span></h3>
<p><?php echo $row19['msg'];?></p>
</div>
<?php } ?>
<?php } ?>
</div>
<div class="chat-send">
<input type="text" name="msg" placeholder="send msg..." />
<span><button type="submit" name="submit">Send</button></span>
</div>
</form>
没有真正理解为什么你为这个项目选择了PHP而不是WebSocket和Javascript,而你选择了这个布局,这里有一个选项。
PHP / SQL:更改为单个查询并删除SQL注入
function sqlSafe($dbConn,$str) {
if (! $dbConn) {
echo 'no DB connection';
exit;
}
return mysqli_real_escape_string($dbConn,$str);
}
function getChat($dbConn,$username) {
if (! $dbConn) {
echo 'no DB connection';
exit;
}
// only request the columns needed
$query = 'SELECT sender,time,msg FROM usertoadmin_chat WHERE
(userid=\''.sqlSafe($dbConn,$userid).'\' AND
sender=\''.sqlSafe($dbConn,$username).'\') OR
(sender=\'Admin\' AND
userid=\''.sqlSafe($dbConn,$userid).'\')
ORDER BY id';
$dbResult = mysqli_query($dbConn,$query);
// Check for no results.
if (! $dbResult) {
return null;
}
// collect the db data in to an array
while($row = mysqli_fetch_assoc($dbResult)) {
$data[] = $row;
}
// free up and return data
mysqli_free_result($dbResult);
return $data;
}
HTML:让我们改变这一点并假设短标签支持:]
<?php
/*
other stuff above to establish db connection and
get $username and whatever
*/
// Get the data for $username
$data = getChat($con,$username);
// Get the comments from the Admin and user in to different
// HTML chunks in a single loop.
if (! $data) {
$htmlAdmin = 'no chat yet';
$htmlUser = '';
} else {
foreach($data as $k => $v) {
if ($v['sender'] == 'Admin') {
$htmlAdmin .= '<div class="author-chat">
<h3>Admin
<span class="chat-date">'.$v['time'].'</span></h3>
<p>'.htmlspecialchars($v['msg']).'</p>
</div>';
} else {
$htmlUser .= '<div class="client-chat">
<h3>'.htmlspecialchars($v['sender']).'
<span class="chat-date">'.$v['time'].'</span></h3>
<p>'.htmlspecialchars($v['msg']).'</p>
</div>';
}
}
}
?>
<form method="post" action="#">
<div class="chat-content chat-scrollbar">
<?=$htmlAdmin.$htmlUser?>
</div>
<div class="chat-send">
<input type="text" name="msg" placeholder="send msg..." />
<span><button type="submit" name="submit">Send</button></span>
</div>
</form>
这将创建一个块,其中包含组中的所有管理员聊天以及所有用户在另一个块中聊天。这可能不是你想要的,但这是我从你的要求中理解的。
如果要线程化文本,请更改为:
if (! $data) {
$html = 'no chat yet';
} else {
foreach($data as $k => $v) {
if ($v['sender'] == 'Admin') {
$html .= '<div class="author-chat">
<h3>Admin
<span class="chat-date">'.$v['time'].'</span></h3>
<p>'.htmlspecialchars($v['msg']).'</p>
</div>';
} else {
$html .= '<div class="client-chat">
<h3>'.htmlspecialchars($v['sender']).'
<span class="chat-date">'.$v['time'].'</span></h3>
<p>'.htmlspecialchars($v['msg']).'</p>
</div>';
}
}
}
然后就是:
// Change <?=$htmlAdmin.$htmlUser?> to
<?=html?>