廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 3189 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
benjaminchch 手機
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x7
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
文章表情[SQL][教學] 如何做出即時訊息的功能呢?
如何實作線上傳訊功能?
事實上,線上傳訊功能與聊天室可說是大同小異。
首先,先建立資料庫:

<?
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>");
}
//-------------------------------------------------------------------------------
}
?>

表情



溝溝坎坎使人長大
哭哭笑笑沐浴人生
獻花 x0 回到頂端 [樓 主] From:未知地址 | Posted:2005-01-26 17:30 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.079811 second(s),query:15 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言