广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 3034 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为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.023497 second(s),query:15 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言