分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载网络编程PHP专区 → 文章内容

用PHP与MySQL建立简单聊天室

  • 作者:佚名    来源:不详    发布时间:2006-2-26 2:02:36
  • 字体大小:
本文再次以 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来实现聊天室这样效果会好一些。
<