AS3+PHP+MySQL:自制在线聊天并不总是被动的

AS3+PHP+MySQL:自制在线聊天并不总是被动的,php,mysql,actionscript-3,Php,Mysql,Actionscript 3,我用Flash AS3客户端编写了某种在线聊天系统,该客户端从与MySQL数据库通信的PHP脚本中发送和检索数据 它工作得很好,只是偶尔,我的客户机没有收到一条新的聊天线路,即使它们在数据库中正确注册 下面是它背后的基本逻辑:每个用户在数据库中都有一个条目,每个条目都有一个lastChatCheck BigInt16变量。 当用户键入并发送聊天线路时,客户端将其发送到PHP脚本,并将其存储在数据库中,同时,存储在该脚本中的日期也是BigInt16。 flash客户端每250毫秒通过getter

我用Flash AS3客户端编写了某种在线聊天系统,该客户端从与MySQL数据库通信的PHP脚本中发送和检索数据

它工作得很好,只是偶尔,我的客户机没有收到一条新的聊天线路,即使它们在数据库中正确注册

下面是它背后的基本逻辑:每个用户在数据库中都有一个条目,每个条目都有一个lastChatCheck BigInt16变量。 当用户键入并发送聊天线路时,客户端将其发送到PHP脚本,并将其存储在数据库中,同时,存储在该脚本中的日期也是BigInt16。 flash客户端每250毫秒通过getter PHP脚本检查一次每个聊天行,其中line's date>user's lastChatCheck,然后将用户的lastChatCheck设置为最后检索到的行的日期。请告诉我这是否令人困惑或解释不当

我确信我为发送新行而编写的代码是正确的,因为我发送的所有内容都正确地存储在数据库中

获取聊天线路的简化PHP代码如下所示:


这会跳过最近的一些聊天线路,有什么合乎逻辑的原因吗?有什么办法可以解决这个问题吗?

如果我在发布聊天信息的同时检查聊天信息,这意味着检查时间和发布时间的bigint是相同的,那么在您获取该时间的聊天信息后,可能会在当前时间添加聊天信息。换句话说,您可以拥有以下序列:

时间0:客户端A获取聊天记录。设置lastChatCheck=0

时间1:客户端A获取聊天>0。设置lastChatCheck=1。客户端B发布聊天,时间1

时间2:客户端A获取聊天>1。没有看到客户端B post

为什么不使用时间戳而不是BigInt呢

此外,在PHP代码中,考虑做一个连接,这样您就不必为每个聊天行单独调用MySQL。


$result=mysql_query('SELECT lastChatCheck FROM players WHERE id='.$id);
while ($row=mysql_fetch_array($result))
{
$lastChatCheck=$row['lastChatCheck'];
}

$output='';

$chatDate=0;

$result=mysql_query('SELECT * FROM chat WHERE date>'.$lastChatCheck);
while ($row=mysql_fetch_array($result))
{
$chatSayer=$row['sayer'];
$chatText=$row['text'];
$chatDate=$row['date'];
$result2=mysql_query('SELECT name FROM players WHERE id='.$chatSayer);
while ($row2=mysql_fetch_array($result2))
{
$output.=$row2['name'].' : '.$row['text'].'<br>';
//(in reality, $output is formatted as an XML object)
}

}


if ($chatDate!=0) mysql_query('UPDATE players SET lastChatCheck='.$chatDate.' WHERE id='.$id);