教你巧用PHP+MySQL搭建一个聊天室

教你巧用PHP+MySQL搭建一个聊天室,第1张

   MySQL并发能力强 响应速度快 是性能优异的数据库软件PHP是功能强大的服务器端脚本语言 笔者在山西铝厂网站开发中 采用PHP +MySQL 建立了多种应用 下面 以一个简单的聊天室设计为例 介绍PHP+MySQL在网页开发中的应用

     总体设计

     构思与规划:

    聊天室的基本原理 就是把每个连上同一网页的用户传送的发言数据储存起来 然后将所有的发言数据传给每一用户 也就是说 用数据库汇集每个人的发言 并将数据库中的数据传给每一个人就实现了聊天室的功能

     表设计

    首先使用MySQL建立表chat用来储存用户的发言:

    mysql>CREATE TABLE chat      >(chtime DATATIME      >nick CHAR( ) NOT NULL      >words CHAR( ))

    表中只设定了三个域 chtime是发言的时间 nick为发言者的昵称 words是发言的内容 发言最多 个字符

     网页设计

    一个最简单的聊天室通常需要两个页框:一个页框是用户输入发言的表单 另一个用来显示大家的发言 所以代码段通常至少需要如下几段:

    建立页框的结构(main php)

    显示大家发言的程序段(cdisplay php)

    传送用户发言的程序段(speak php)

    用户登录进入聊天室程序段(login php)

     代码设计

    以上规划完成后 就可以着手代码设计了 采用php可以非常简明实现以上的功能

     用户登录login php 本段代码是一个完全HTML网页

    <>     <head>     <title>用户登录</title>     </head>     <body>请输入您的昵称<br>     <form action= main php method= post target= _self >     <input type= text name= nick cols= >     <input type= submit value= 登录 >     </body>     </>

    用户提交自己的昵称后 就进入到聊天室 以下的处理交由main php处理

     页框主体代码段main php:

    <?     setcookie( nick $nick) //用cookie记录用户昵称 是常用的传递变量方法     ?>     <>     <title>山西铝厂聊天室试用版ver </title>     <frameset rows= % * >     <frame src= cdisplay php name= chatdisplay >     <frame src= speak php name= speak >     </frameset>     </>

     显示发言cdisplay php

    本代码段的任务是将表chat中的数据取出 显示在页框中 每次刷新时 取数据库中最近的 条发言 同时 为防止数据库无限增大 需设计删除陈旧数据的功能 代码如下

    <>     <head>     <title>显示用户发言</title>     <meta equiv= refresh content= url=cdisplay php >     </head>     <body>     <?     $link_ID=mysql_connect( main root )    //链接Mysql服务器 服务器名为main 管理员名为root     mysql_select_db( abc )//选择数据库     $str= select * from chat ORDER BY chtime//查询字符串     $result=mysql_query($str $link_ID)//送出查询     $rows=mysql_num_rows($result)//取得查询结果的记录笔数     //取得最后 笔发言 并显示     @mysql_data_seek($resut $rows )//移动记录指针到前 笔记录     if ($rows< ) $l=$rowselse $l= //记录总数小于 则最多为该记录数     for ($i= $i<=$l$i++) {     list($chtime $nick $words)=mysql_fetch_row($result)    echo $chtimeecho echo $nickecho : echo $wordsecho <BR>     }     //清除库中过时的数据     @mysql_data_seek($result $rows )//移动记录指针到前 笔记录     list($limtime)=mysql_fetch_row($result)    $str= DELETE FROM chat WHERE chtime< $limtime     $result=mysql_query($str $link_ID)//送出查询字符串 库中只留前 个记录     mysql_close($link_ID)    ?>     </body>     </>

     送出发言到数据库speak php

    <>     <head>     <title>发言</title>     </head>     <body>     <?     If ($words)     { $link_ID=mysql_connect( main root )    mysql_select_db( abc )//数据库名为abc     $time=date(y) date(m) date(d) date(h) date(i) (date(s)//取得当前时间     $str= INSERT INTO chat(chtime nick words) values ( $time $nick $words )    mysql_query($str $link_ID)//送出发言到数据库     mysql_close($link_ID)    }     ?>     //输入发言的表单     <form action= speak php method= post target= _self >     <input type= text name= words cols= >     <input type= submit value= 发言 >     </form>     </body>     </>

lishixinzhi/Article/program/PHP/201311/21516

1,配置文件

复制代码代码如下:

<?php

define('PATH',dirname($_SERVER['SCRIPT_NAME']))//聊天室目录

define('CHAT_NAME','PHP聊天室') //聊天室名称

define("MESS", "mess.txt")//聊天信息

define("PERSON", "person.txt") //在线人名单

define("RETIME",3) //刷新时间

define("LINE",11) //公共窗口显示的行数

define("PRLINE",5) //私聊窗口显示的行数

define("MAX",50) //聊天室人数限制

define("MAXTIME",600000)//最大不发言时间,单位是毫秒

define("WELCOME","<font color=blue>欢迎光临".CHAT_NAME.",请遵守聊天室规则,不要恶意刷新,不要使用不文明用语。</font>") //欢迎语

?>

2,公共函数文件

(1)chklogin()函数检查用户昵称是否重复。参数$user是登录用户的昵称。当函数返回值为True时,昵称不可用;返回值为False时,昵称可用。

复制代码代码如下:

function chklogin($file,$user){

$boo = false

if(file_exists($file)){

$userarr = file($file)

/* 判断昵称是否重复 */

foreach($userarr as $value){ //判断昵称是否重复

$tmparr = explode('#',$value)//使用“#”作为分隔符来拆分字符串

if($user == $tmparr[0]){ //如果用户数组中包含此用户

$boo = true

break

}

}

}

return $boo

}

(2)addlogin()函数将登录的用户昵称写入文件中,保存格式为:昵称#IP#性别,参数$file是保存的文件地址,$user是用户昵称,$ip是登陆IP,$sex表示用户性别。

复制代码代码如下:

function addlogin($file,$user,$ip,$sex){

$tmp = $user.'#'.$ip.'#'.$sex.chr(13).chr(10) //chr(13) 是一个回车,Chr(10) 是个换行符,chr(32) 是一个空格符

$fp = fopen($file,'a') //写入方式在文件末尾追加信息

$boo = fwrite($fp,$tmp)

fclose($fp)

return $boo

}

(3)storeuser()函数的作用是将用户信息存为一个数组。格式为“用户名,用户性别”,参数$file是用户列表文件。代码如下:

复制代码代码如下:

function storeuser($file){

$tmparr = file($file) //将文件内容写入数组

$userarr = array() //创建数组

foreach($tmparr as $value){ //循环输出数组内容

$tmparr = explode('#',$value)//使用#拆分字符串

$userarr[] = $tmparr[0].','.$tmparr[2] //将用户名和用户性别保存到新数组中

}

return $userarr

}

(4)addmess()函数将发言内容写入文件中。参数$file是保存的文件地址,$mess是要保存的内容

复制代码代码如下:

function addmess($file,$mess){

$fp = fopen($file,'a') //以追加的形式打开文件

$boo = fwrite($fp,$mess.chr(13).chr(10))//将信息写入文件中

fclose($fp)//关闭文件

return boo

}

(5)deluser()函数的作用是删掉用户。参数$file是保存的文件地址,$user是要删除的用户

复制代码代码如下:

function deluser($file,$user){

$tmparr = file($file) //将文件内容写入数组

$rearr = array()//创建数组

foreach($tmparr as $value){ //循环输出数组内容

$tmp = explode('#',$value) //使用#拆分字符串

if($tmp[0] != $user){ //如果变量中的用户名和当前用户不相等

$rearr[] = $value//将该用户信息保存到新数组中

}

}

$fp = fopen($file,'w+')//以只写的方式打开文件

foreach($rearr as $value){ //循环数组

fwrite($fp,$value) //写入数组内容

}

fclose($fp)//关闭文件

}

(6)getRows()函数的作用是返回文件的行数,参数$file是文件名

复制代码代码如下:

function getRows($file){

if(file_exists($file)){ //如果文件存在

$fl = file($file) //将文件按行写入数组

return count($fl) //求出数组长度并返回

}else{

return 0 //如果文件不存在,返回0

根据会话数来统计在线人数.

一般是这样的,在数据库中记录每个用户的会员数据,并且用户的每一次动作都update他的最后动作时间.那么统计在线人数就是统计某段时间内有动作的用户即可.一般5分钟或者10分钟.

上面是靠用户自己的 *** 作来更新在线时间的.你也可以在用户停留的页面弄个JS,隔个2分钟就做个ajax请求,自动更新用户的最后的在线时间,

ps 如果你不想修改session存到mysql,memcached等里面,则可以根据session_id()来获取PHPSESSID来作为身份标识,

然后要在程序中写上随机删除过期很久了的会话.

至于聊天记录.你肯定是要保存在服务器端的,至于读取.可以通过AJAX几秒来获取一次数据库里面的内容,当然,在获取记录的时候,你需要记录你获取的时间,然后下次获取的时候只呀这个时间后的,如果有数据,则追加到当前聊天记录后面,否则保持不变.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7332329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存