チャット アプリケーションを構築していますが、いくつか問題があります。まず、ユーザーがログインすると、チャットがデータベースからロードされ始めます。
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);
}
これは、ユーザーがEnterキーを押すと呼び出されるデータベースに新しいメッセージを挿入する関数であり、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 を使用しようとしましたが、しませんでした私と一緒に仕事をしないでください。