如何实作线上传讯功能?
事实上,线上传讯功能与聊天室可说是大同小异。
首先,先建立资料库:
<?
CREATE TABLE SendMsg (
ID smallint(5) unsigned DEFAULT Ɔ' NOT NULL auto_increment,
FromUser varchar(20) binary NOT NULL,
ToUser varchar(20) binary NOT NULL,
Date datetime DEFAULT -00-00 00:00:00' NOT NULL,
Body tinyblob NOT NULL,
HasSend tinyint(1) DEFAULT Ɔ' NOT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE OnLine (
ID mediumint(10) unsigned DEFAULT Ɔ' NOT NULL auto_increment,
UserName varchar(20) NOT NULL,
Date date DEFAULT -00-00' NOT NULL,
Time time DEFAULT ༼:00:00' NOT NULL,
PRIMARY KEY (ID),
);
?>
资料库分两个资料表,一是用来记录目前线上使用者,二是纪录讯息资料。
线上使用者记录使用者名称、时间。
讯息资料记录传讯者、收讯者、讯息内容以及讯息状态,其中讯息状态纪录该讯息是否已送出给收讯者。
二、建立传讯页面档案 SendMsg.php
先由OnLine资料库收寻时间为一分钟内的纪录作为目前线上人数的依据,列出一分钟内的使用者资料。
<?
$OnLineUser = "Select *
From Flow
Where Date = current_date
and time_to_sec(current_time)-time_to_sec(Time) < 60
Group By UserName";
?>
建立一传讯表单,让使用者输入传讯内容以及选择收讯者。
<form name="SendMsgForm" method="post" action="">");
<tr>
<td>
<input type="text" name="SendMsgBody" >
<select name="ToUser" >
<?
while ($OnLineUser[$i])
{
echo ("<option value="$OnLineUser[$i]">");
echo ("$OLUData->UserName");
echo ("</option>");
$i++;
}
?>
</select>
<input type="submit" name="SendMessageOk" value="发送讯息">
</td>
</tr>
</form>
当表单送出时,将传讯内容以及收讯者记录到SendMsg资料表中,并设定讯息尚未送出。
<?$AddMsg = "Insert Into SendMsg Values
(0,'$UserName','$ToUser',now(),
'$Body',0)";?>
^^0代表讯息尚未送出。
三、建立记录线上人数及
搜寻未传送讯息页面档 Check.php
此档案内容主要是:
1.将Client端使用者资讯记录到OnLine资料表中
<?
$AddOnLine = "Insert Into OnLine Values
(0,'$UserName',now(),now())";
?>
2.搜寻 Client 尚未接收之讯息
<?
$FindtoSend = "Select *
From SendMsg
Where ToUser = '$UserName' and HasSend = 0";
?>
如果有尚未接收之讯息则 利用 JavaScript 的 alert() function 送出
<?
echo ("<script language="JavaScript">
<!--
alert("$Body");
//-->
</script>
");
?>
四、整合SendMsg.php与Check.php
将Index网页画面以frame分割上下两个frame。
上面的frame高度设为 0 ,内容为Check.php,并设定每隔五分钟refresh一次
,即每五秒钟执行一次记录及
搜寻一次未接收之讯息。
<?echo ("<META HTTP-EQUIV=REFRESH CONTENT=Ƌ'>");?>
下面的fram为主页面,内容为SendMsg.php。
整个传讯功能主要关键在于,分割网页,网页上方分割出一高度为 0 的frame,每隔一段时间
Reload一次,以记录目前线上之使用者及收寻尚未接收之讯息。
你也可以利用iframe的方式来将SendMsg.php放入主网页内,并设定一按钮当按下时Reload该iframe
,更新线上使用者资讯。
Check.php也可以用iframe做出一个高与宽都只有1的iframe去定时Refresh。
下面这段为Check.php档范例,请配合db.lib.php档使用
<?
/**记录Clinet端使用者资讯**/
$AddOnLine = "Insert Into OnLine Values
(0,'$UserName',now(),now())";
$DBObject->Query($AddOnLine); // $DBObject 物件请参考教学区 db.lib.php 类别
/** 搜寻个人讯息 **/
$SendMsgStr = "Select *
From SendMsg
Where ToUser = '$UserName' and HasSend = 0";
$SendMsg = $DBObject->Query($SendMsgStr);
while($MsgData = $SendMsg->fetch_object())
{
echo ("<script language="JavaScript">
<!--
alert("$MsgData->FromUser 于 $MsgData->Date 来讯 : $MsgData->Body");
//-->
</script>
");
/**将讯息改为已送出**/
$SetSended = "Update SendMsg
Set HasSend = 1
Where ID ='$MsgData->ID'";
$DBObject->Query($SetSended);
}
echo ("<META HTTP-EQUIV=REFRESH CONTENT=Ƌ'>");
?>
下面这个Class可用来实作 SndMsg.php ,请配合db.lib.php档使用
<?PHP
/*
Example:
$OnLabUser = new OnLineUser($DBObject);
$OnLabUser->ShowOnLineUser;
if($SendMessageOk)
^^^^^^^^^^^^^
{
if($OnLabUser->SendMsg($FromUser,$SendMsgBody,$FromSession_ID,$ToSess))
^^^^^^^^^^^^ ^^^^^^^
echo("讯息已送出");
}
*/
class OnLineUser
{
var $DBObject;
//-------------------------------------------------------------------------------
function OnLineUser($DBObject)
{
$this->DBObject=$DBObject;
}
//-------------------------------------------------------------------------------
function SendMsg($FromUser,$Body,$ToUser)
{
$AddMsg = "Insert Into SendMsg Values
(0,'$FromUser','$ToUser',now(),
'$Body',0,'None')";
if($this->DBObject->Query($AddMsg))
return true;
else
return false;
}
//-------------------------------------------------------------------------------
function ShowOnLineUser($Sess_ID)
{
$OLUStr = "Select *
From OnLine
Where Date = current_date
and time_to_sec(current_time)-time_to_sec(Time) < 60
Group By UserName";
$OLU = $this->DBObject->Query($OLUStr);
$OLUNum = $OLU->num_rows();
$JavaScript =
"
<script language="JavaScript">
<!--
function CheckMsg()
{
if(document.SendMsgForm.SendMsgBody.value=="")
{
alert("你必须输入讯息内容!!");
return false;
}
else if(document.SendMsgForm.ToSess.selectedIndex==0)
{
alert("你必须输入传送讯息对象!!");
return false;
}
else
{
return true;
}
}
//-->
</script>
";
echo ($JavaScript);
echo ("<table border="0" cellspacing="0" cellpadding="0">");
echo ("<form name="SendMsgForm" method="post" action="">");
echo ("<tr>");
echo ("<td>");
echo ("<div align="right">");
echo ("<input type="text" name="SendMsgBody" > ");
echo ("<select name="ToSess" >" );
echo ("<option value="0" selected>线上人数: $OLUNum 人</option>");
while ($OLUData=$OLU->fetch_object())
{
echo ("<option value="$OLUData->UserName" >");
echo ("$OLUData->UserName ");
echo ("</option>");
}
echo ("</select>");
echo ("<input type="button" name="reload" value="更新" onClick="location.reload()">");
echo ("<input type="submit" name="SendMessageOk" value="发送讯息" onClick="return CheckMsg()">");
echo ("</div>");
echo ("</td>");
echo ("</tr>");
echo ("</form>");
echo ("</table>");
}
//-------------------------------------------------------------------------------
}
?>