//原文发布在我原来的blog,原文发布时间:2012.5.15
网页聊天室:
1.登陆注册功能———–*
2.即时消息—————*
3.私聊,聊天记录保存
4.表情
5.在线用户列表———–*
6.用户头像上传
7.查看个人信息———–*
实现:
1.mysql,session/cookie
2.ajax/comet
3.mysql
4.待议
5.session,mysql
6.插件,jquery
7.mysql
具体实现:
mysql:
1.用户列表
uid,user,passwd,isonline,sex,email,regtime,head_add,information
2.私聊消息表
message_id,message_time,from_id,to_id,message_text
php:
3层结构
数据库层:输出数据库查询内容
php层:
html层:
html:
界面:
1.登陆
2.注销
3.聊天主页面
4.用户列表
5.个人信息
6.私聊
发现的问题:
1.GD库支持,导致验证码读取不出来
解决方法: 正在尝试,或者试试 phpnow。经分析并不是集成开发环境出的问题,但具体问题仍没发现,所以依旧使用以前的验证码模块
2.验证码存在session中,可被破解,导致暴力破解
解决方法:可以使用MD5加密后的验证码放入session中,进行对比验证
3.session使用问题
建立、删除cookie,session_start();函数必须放在首行,所以放在dbconnect.php中。
setCookie(‘usename’,’’,time());一共3个值
4.面向对象的开发思想,在本系统体现不明显。
5.界面设计,本想使用小七的jquery的界面,但是在IE下显示效果不佳。所以可以自己设计。
6.在类的调用上出现问题
7.Cookie调用不太会用,而且有安全性问题,改为session
8. session依旧有问题,参数传不到第二个页面,还有就是可以使用cookie存储session。
但是超时时间问题没有解决。对于传参,我的代码应该是没有问题的,但就是不行!!!
解决方案:搞了半天是大小写问题,原本以为php对于大小写和编写方式很开放的。SESSION_[‘’]这样表示。
9.顺利把zvchat植入,然后修改javascript,把用户名的植入方式改变。但发现一个问题,就是可以同时使用同一个账号登陆。
解决方案:可以通过ip地址判断,结合是否在线。或者取消此功能,web上使用这个容易出问题
10.在线用户列表,可以使用session记录登陆时间,设置超时时间,判断在线状态,还有就是使用javascript在用户关闭浏览器时向服务器发出下线请求。但我想可以在数据库建立一个在线用户表,或者把用户表进行改造,最好还是新建一个表,毕竟用户量大,查询是费资源的。记录登陆时间,在切换网页时更新最后在线时间,或者每30s进行查询。
或者另一种方案,就是使用session配合数据库,另作一个php页面,每60s刷新,并更新数据库,如果用户直接关闭浏览器,就配合session超时时间。session.cookie_lifetime =0
在php.ini中,值为0则为关闭浏览器后,session超时。
具体解决方案,可以登录后,把session_id等值存储到数据库,之后写一个php文件,加载到每个文件头部,通过查询sesion_id查询当前用户是否存在,存在的话,更新数据库在线人数,不在的话,删除信息。退出时删除信息。异常关闭浏览器也可以检查到。另外数据库中得记录最后在线时间,进行超时判断。
整理方法:
方法一:
1.登录、退出,存储session_id、用户名、最后在线时间,到数据库,退出删除。
2.在线时,每30s更新数据库的个人信息。
3.读取数据库个人信息,通过时间判断,最后登录时间超过60s,则为离线,删除此条目。并列出在线用户列表。
方法二:
1. 同方法一
2. 读取数据库,通过数据库session_id值,查询是否有此session值,如果有,则为用户在线,没有则为不在线,并删除此条目。
3. 读取数据库,形成在线用户列表。
形成在线用户列表后,还可以进行同一账号重复登录的判断。
方法二如果用户量大,数据库操作量会很大,方法一相对实用。
11.使用一个单独的updata.php页面,用meta设置刷新时间,后面跟着sql语句,每30s刷新数据库中的最后使用时间,并且检查数据库中的时间与当前时间相差40s以上的条目进行删除,达到时时更新在线人数的作用,唯一缺点就是数据库的访问量增大,但是小型网站还是没问题的。
12.delete from online where session=(select * from online where sess_time > subtime(now(),’00:40′))
这个语句mysql不支持,但select * from online where sess_time > subtime(now(),’00:40′)
是支持的,得改变下形式。
解决方案:在保林的提点下,我突然发现我犯了一个特别sb的错误,根本没必要写的那么复杂,直接delete from online where sess_time < subtime(now(),’00:00:40′);就可以了
13.计算在线时长,数据库的基础已经完成,就差一条查询语句,便可计算在线时长,之后可以计算出等级。
14.写出一个查询在线用户的页面,使用iframe插入chat中div,进行定时刷新查询。可以通过控制刷新时间,来调整在线用户列表的反应状态。
15.出现个BUG,限制同一个账户登陆,是用的数据库在线列表,但当前只有一个人时,采取直接关闭网页方式下线,那他的登陆信息就存在了数据库中,这样,就认为当前用户已经登录,所以会限制登陆。解决方案,先检查数据库是否存在超时。
16.对于zvchat核心显示聊天时间不准确的情况,经分析,zvchat 使用的time()是unix时间戳的意思,所以就算格林威治时间,调整的话,就把这个时间加8个小时,也就是28800秒,就完美解决这个问题了。
17.表单验证问题,还没有解决,似乎硬盘突然出问题之前还可以用呢,现在就不行了,到底哪里出问题了,shit!!!
感觉像是javascript出问题了,没反应,这个有待验证,中午关机重启,不行就试试换一个电脑试试看。先解决在线时长问题吧。
18.之前的头像上传功能也解决了,是用的一个从UCenter上分离出来的图片上传模块,不自己写这个,一个是自己懒,另一个是别人的好看。
19.表单功能完成,应该是可以用完美来形容,嘿嘿!接下来把头像功能实现一下。
发现头像上传路径是多重路径的, 比如webchat\headuploads\000\00\00\01_avatar_big.jpg,这里面文件夹的数字+文件名的数字部分就是uid的值,通过这种方法使每个文件夹存放的图片不至于过多,应该还有搜索效率方面的问题。这个在文件中是有函数的,直接调用就可以了,现在困了,有时间再解决。
20.目前仍需解决的问题汇总:
A.在线时间统计
B.数据库中时间部分全改成UNIX时间戳
C.注册表单检查
D.图片存储路径部分调用
E.界面优化
21.在线时间统计和UNIX时间戳改造已经完成,在线时间统计主要问题是多表联合更新问题,mysql不支持update…from…但它可以支uptate online,webchat_id set webchat_id.onlinetime=webchat_id.onlinetime+online.sess_time-online.login_time where webchat_id.uid=online.sess_uid 这种形式,就是多表联合查询。
22.使用UNIX时间戳的主要目的就是方便时间的计算,可以使用int格式类型,省了datatime类型比较麻烦的计算函数。
23.注册界面的js验证表单,就是现实不出来,真服了,类似的表单,change.php就没问题,先考虑下个问题,就是头像路径的问题。
24. php5.1以上时间戳会与实际时间相差8小时,解决办法如下
1、最简单的方法就是不要用php5.1以上的版本–显然这是不可取的方法!!!
2、修改php.ini。打开php.ini查找date.timezone 去掉前面的分号= 后面加Asia/Shanghai,重启apache服务器即可–缺点就是如果程序
放到别人的服务器上,不能修改php.ini,那就奈何不得了。
3、在程序中添加时间的初始化的语句的 即:“date_default_timezone_set(“Asia/Shanghai”); ”这个可以由程序员任意设置,我的推
荐。
时区标识符,大陆内地可用的值是:PRC,Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为中国,重庆,上海,乌鲁木齐) ,Etc/GMT-8,Asia/Harbin
港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北)
还有新加坡:Asia/Singapore
澳大利亚:Australia/Sydney
25.不会php的面向对象真费劲,改一个头像上传都改不出来,头疼啊,只能限定上传图片的类型了,改成只能JPG的,这样数据库都可以不用了。
这个图片格式的问题不用考虑了,在上传图像并裁切的过程中已经转化为JPG了,另外已经封装好了一个图片类,直接调取图片类就行了
Is_file()函数判断该路径下的文件是否存在,没有则返回false,进行判断,false则指定默认头像
26.注册界面的js验证表单代码解决了,就是拿正常用的那张直接拿来修改了,懒的查错了。
27.功能上基本就是完成了,剩下的工作主要有2项,一个是代码优化,就是一些常用的代码,就写到function.php中,到时直接调用,也可以多看看怎么去使用面向对象编程,还有就是写一个在线时间转化为等级的类。第二项就是对界面进行优化,使用表格重新修改网页结构,css什么的都重新写,再加一个用户信息的页面,添加头像显示。
28.整体上对代码进行优化组合,重新划分文件结构。还有就是私信的发送与接受,这个也得实现了,这个可以借助数据库来实现。
29.使用dreamweaver修改网页时,发现new.php的注册中,用户信息不能插入数据库。看语句是没有问题的,头疼啊。
诡异的问题,莫名其妙就又行了,真服了。。。
终于找出怎么回事了,原来数据库email项设成唯一了,用相同email注册就不行!!
一直在sql代码上找问题,原来是数据库的问题,唯一属性删之。
30.开始前台设计,尺寸由于宽屏普及,设计为1050*542
31.前台设计好难啊,真想就搞后台
32.2天没弄了,一直在配置ubuntu12.04,才把桌面给弄崩溃了,回到windows,搞网站吧,先改改聊天框,看看怎么能把聊天记录从下面开始,之后,做2个页面,一个是后台,管理权限和删除用户,第二个是个人信息,通过uid判断是否为当前用户,以显示修改按钮。
33.写出了个人信息,还有后台控制的页面,但没有和修改信息页面进行衔接起来,所以,最好重新写一个修改个人信息的页面,风格就是新的风格。
34.iframe问题还没有解决,怎么把页面传过来的,这个有待研究,还有就是,如何把iframe中的转址转到外面,后台上,把留言板设计好。
35.之前把网站修改了一下,把留言功能删掉了,时间太紧张来不及弄了,活跃用户也没了,现在的还是很简单的,不过效果还不错,感觉挺好,等之后再把整体色调,风格调一下,基本上就没有问题了,有空写一下功能文档还有文件功能什么的就可以了,有时间再把消息功能开发出来,这个就算是可以完工了。
36.说说写这个网站的感受吧,从5月3日晚上到5月15日早上,这些天基本都是夜里写网站白天睡觉,上午有课还去上课,下午到晚上才休息,太累了,以至于感觉这些天身体都变差了很多,以后没事不能这样了,才看了看这个月的安排,还有密码学课程设计和android软件设计,android软件估计完成不了了,密码学课程设计应该没问题,这两个都是用java,反正得学java,顺便的事。另外这两天给北京几十个公司投的简历,已经有七八个给我回消息了,但因为现在不在北京而未果,有些遗憾,但从另一方面说也是给自己一个充分准备的时间,毕竟现在的知识很贫乏,笔试面试比一定可以过,所以到暑假还有2个月时间去充分的准备,主要在2个方面努力,一是java方面,深刻的去学习和理解,二是基础知识,必须把自己的基础夯扎实,这块是自己最薄弱的部分。其实去投简历就是证明自己并不是一无是处,只是肯定一下自己还不算废柴,但未来的发展史需要自己努力的,加油!!!