如何使用2 while循环从获取相同的表但不同的条件

问题描述 投票:0回答:1

我正在尝试使用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 html
1个回答
0
投票

没有真正理解为什么你为这个项目选择了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?>
© www.soinside.com 2019 - 2024. All rights reserved.