用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.
用 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.
相关阅读 更多 +