文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>用PHP与MySQL建立简单聊天室

用PHP与MySQL建立简单聊天室

时间:2007-02-17  来源:PHP爱好者

本文再次以 MySQL与PHP 来时间创建一个简单的聊天室。当前众多的聊天室可以实现方法可以分为两类:第一种是使用Java语言,第二种是使用CGI方式,用 Java 的优点是画面美观,但是设计复杂,而采用CGI的方式的缺点是画面会闪动,但是设计简单。PHP本身就是CGI,所以我们这里采用后一种方式来设计实现一个聊天室。

用 CGI 设计聊天室原理很简单:把大家说的话收集起来,在发送给大家。这个原理可以用下面的图来说明:

 

:

原理就是这么简单,但是实现我们分为两个步骤:一是设计数据库与表格格式,而是设计程序。

设计数据库与表格

要开始设计表格之前,必须指定数据库,在此我们假设读者没有使用过数据库,因此先建立一个chat数据库。

create database chat;

所有的交谈信息都必须放在数据库中,聊天者的每一句话都是一个记录,因此很明显,每个表格至少需要三个属性:聊天者身份(ID)、说话内容(WORDS) 以及发生时间(DATETIME)。以上面的A与B对话的例子来说明,其数据库内容就是:

 

ID WORDS DATETIME
A Hello 1999-10-10 13:20:43
B Hi 1999-10-10 13:20:57
A 你好 1999-10-10 13:21:12
B 好啊 1999-10-10 13:21:33
A 天氣不錯 1999-10-10 13:22:39
B 嗯…對啊 1999-10-10 13:24:03

另外,每个属性都要定义数据类型,你可以根据自己的聊天室需求来定义,再次我们假定ID需要20个字节,WORDS为200 个字节,DATETIME则定义为datetime (也就是日期加时间)。下面就生成这个表格:

use chat;
create table myChatDB (ID char(20), WORDS char(200), DATETIME datetime);

现在数据库与表格就建立完毕了,但是里面的内容是空的,接下来我们开始设计程序:

程序设计

一个聊天室最常见的动作便是更新画面,这部分使用HTML 所提供的功能 :自动间隔读取页面的功能。要让一各页面自动间隔一段时间读取,方法是在该页面中加入:

 

<meta http-equiv="refresh" content="10; url=chatDisplay.php3">

这里表示每10秒种自动读取一次chatDisplay.php3 指定的资源:

此外,通常一个聊天室至少包含两个部分,一个是说话显示区,一个是谈论输入区,这两个部分是独立的,一般来说,都是使用 HTML 的 Frame 功能来完成,Frame可以将浏览器划分为几个部分,如下面的例子:

 

<html>
<?
echo "
<frameset rows="73%,27%" border=1>
<frame src="chatDisplay.php3">
<frame src="chatTyping.php3">
</frameset> ";
?>
</html>

程序: chat.php3就是表示画面被划分为上下两个部分,上方占了73%,内容由chatDisplay.php3产生,下面占了27%,内容由 chatTyping.php3 产生,两部分中间有分隔线分开。

聊天者进入这个聊天室的方式很简单,就是直接连入http://your_web_site/chat.php3 既可。

下面就是负责谈话显示区的chatDisplay.php3 的内容:

<html>
<meta http-equiv="refresh" content="10; url=chatDisplay.php3">
<body bgcolor=ffffff text=333333 link=006666 vlink=003333>
<?
$DB=mysql_connect("localhost","root","");
mysql_select_db("chat",$DB);

$DBT=mysql_query("select ID, WORDS from myChatDB order by DATETIME desc limit 0,13");
$DBTrownum=mysql_num_rows($DBT);

echo "<table cellpadding=0 cellspacing=0 border=0 width=90%>";

for ($t=$DBTrownum-1;$t>=0;$t--) {
mysql_data_seek($DBT,$t);
$DBTrow=mysql_fetch_row($DBT);
$ID=$DBTrow[0];
$WORDS=$DBTrow[1];

echo "<tr><td width=10%>$ID</td>";
echo "<td width=5% align=center>:</td>";
echo "<td width=85%>$WORDS</td></tr>";
};
echo "</table>";
mysql_close($DB);
?>
</body>
</html>

程序:: chatDisplay.php3

在chatDisplay.php3 中最重要的部分在于:

$DBT=mysql_query("select ID, WORDS from myChatDB order by DATETIME desc limit 0,13");

当chatDisplay.php3 每 10 秒钟就执行一次,会从myChatDB中按照时间先后,反向读取数据库记录 (order by DATETIME desc),然后限定最多读取13个记录(limit 0,13)。

等读取记录之后,再倒过来读取从最后面的记录(事实上这反而是这13条记录中最先近来的记录)一直读到最前面的记录(事实上反而是这13条记录中最后近来的记录),将这13条记录(包含了 ID,WORDS)列在表格中即可。

这里利用 mysql_data_seek 来指定希望读入的记录:

mysql_data_seek($DBT,$t);

再利用 mysql_fetch_row 来将资料读入到一一维数组中:

$DBTrow=mysql_fetch_row($DBT);

至於你問我为什么只要列出最后 13 条记录,这是因为画面高度有限,发出太多内容会导致速度降低。

最后,来分析负责下面发言输入部分的程序: chatTyping.php3 :

<html>
<body>
<?
$DB=mysql_connect("localhost","root","");
mysql_select_db("chat",$DB);

if ($CHATID=="") $CHATID="路人";

if (isset($WORDS))
$DBT=mysql_query("insert into myChatDB values('$CHATID','$WORDS',now())");

echo "<table width=99% cellpadding=0 cellspacing=0 border=0>n";
echo "<tr>";
echo "<td align=left><font size=2><b>";
echo "<form method=GET action=chatTyping.php3>n";
echo "$CHATID : <input type=text size=50 maxlength=160 name=WORDS value="">";
echo "<input type=hidden name=CHATID value="".$CHATID."">";
echo " <input type=submit name=SENDOUT value="送出"> ";
echo "</form>";
echo "</font></td>";

echo "<td align=left><font size=2><b>";
echo "<form method=GET action=chatTyping.php3>n";
echo "<input type=text size=12 maxlength=160 name=CHATID value="">";
echo " <input type=submit name=RENAMEBUTTON value="變更名稱"> ";
echo "</form>";
echo "</font></td>";

echo "</tr>";
echo "</table>";

mysql_close($DB);
?>
</body>
</html>

程式 : chatTyping.php3

chatTyping.php3 包含了两个form,第一个用来输入发言内容的,第二个则用来更改聊天者的ID的。

第一个 form 其实很简单,当使用者按下"发送"按钮时,会再次执行 chatTyping.php3,若此时$WORDS 变量(也就是存储谈话内容的参数)已经被定义,则这条记录就会被存储到数据库的 myChatDB 表格中 :

 

if (isset($WORDS))
$DBT=mysql_query("insert into myChatDB values('$CHATID','$WORDS',now())");

注意到这个 form 中使用了隐藏变量:

<input type=hidden name=CHATID value="$CHATID">

因为只有这样才能将聊天者的ID(也就是 $CHATID) 随同谈话内容WORDS一起发送出去。

至第二个form 主要负责让聊天者可以更改ID,注意这个 form 的文字输入部分的名字就是 CHATID,也就是说当聊天者输入新的ID并按下"改变名字"时,会再次执行 chatTyping.php3,然后会改变了变量$CHATID 的值,这样就实现了更改使用者 ID 的目的。

结束语
其实,用PHP和Mysql再加上原本 HTML 的强大显示能力,可以做出很多使用而有趣的效果,虽然这个聊天室很简单,但是只要发挥一些想象力,可以让它更加实用。其实很多专业的聊天室的原理也是这样的。只不过复杂一些罢了。

这种思路实现聊天室的最大缺陷是无法做到只有新信息出现才更新,而是定时更新,从而效率比较低,所以才采用JAVA来实现聊天室,这样效果会好一些。
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载