如何實作線上傳訊功能?
事實上,線上傳訊功能與聊天室可說是大同小異。
首先,先建立資料庫:
<?
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>");
}
//-------------------------------------------------------------------------------
}
?>