用 PHP与MySQL建立简单聊天室
    本文再次以 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来实现聊天室,这样效果会好一些。