0

我正在构建一个聊天应用程序并遇到一些问题。首先,我希望用户登录后聊天开始从数据库加载。

从 ajax 调用的 db 获取整个聊天的函数

function getChatData(){
    global $mysqli;
    //echo $lastinseted= $mysqli->insert_id();
    $sql = "SELECT `chat`.`message`,
        `users`. `username`,
        `chat`.`timestamp`
        from `chat` JOIN `users` ON (`chat`.`user_id`=`users`.`user_id`) 
        ORDER BY `chat`.`timestamp` DESC limit 15";
    try{
        if($stmt=$mysqli->prepare($sql)){
            echo returnJson($stmt);
            $stmt->close();
            $mysqli->close();
        }else{
            throw new Exception("An error occured while fetching record data");
        }
    }catch(Exception $e){
        log_error($e, $sql, null);
        echo 'fail';
    }
}

这是回调函数:

function getChatCallback(data){
    var h='';
    for(var i=0, l=data.length;i<l;i++){
        h+=data[i].username+' says: '+data[i].message+'<span style="color:gray"> at the time '+data[i].timestamp+'</span><br/>';
    }
    $('.messages').html(h);
    setTimeout(getChat,1500);
 }

这是将新消息插入数据库的函数,一旦用户点击回车就会调用它,它也被 ajax 调用调用:

function putChatData($message,$room,$user_id){
    global $mysqli;
    $sql = "INSERT INTO `chat`
    (`message`,`timestamp`,`room`,`user_id`)
    VALUES (?,?,?,?)";
    $timestamp = gmdate("Y-m-d H:i:s");


    try{
        if($stmt=$mysqli->prepare($sql)){
             $stmt->bind_param('ssii',$message,$timestamp,$room,$user_id);

            $stmt->execute();

            $stmt->close();
            $mysqli->close();

        }else{  
            throw new Exception("An error occured while fetching record data");
        }
    }catch(Exception $e){
        log_error($e, $sql, null);
        echo 'fail';
    }

}

现在的问题是我可以将新消息插入数据库,但是获取聊天的第一个函数会在用户登录之前带来所有聊天,包括旧的聊天。我尝试使用时间戳或最后一个插入 ID,但没有不要和我一起工作。

4

1 回答 1

0

对于这个用例,您需要知道注册时间并在查询中添加 WHERE 条件

$sql = "SELECT `chat`.`message`,
    `users`. `username`,
    `chat`.`timestamp`
    from `chat` JOIN `users` ON (`chat`.`user_id`=`users`.`user_id`) 
    WHERE `chat`.`timestamp` > $userRegDate 
    ORDER BY `chat`.`timestamp` DESC limit 15";
于 2012-10-26T11:40:06.500 回答