php实现简易聊天室应用代码


Posted in PHP onSeptember 23, 2015

核心逻辑

在定义应用程序的核心功能之前,先来看一看聊天应用程序的基本外观,如以下截图所示:

php实现简易聊天室应用代码

通过聊天窗口底部的输入框输入聊天文本。点击Send按钮,就开始执行函数set_chat_msg。这是一个基于Ajax的函数,因此无需刷新页面就可以将聊天文本发送到服务器。程序在服务器中执行chat_send_ajax.php以及用户名和聊天文本。

// 
// Set Chat Message 
// 
 
function set_chat_msg() 
{ 
  if(typeof XMLHttpRequest != "undefined") 
  { 
    oxmlHttpSend = new XMLHttpRequest(); 
  } 
  else if (window.ActiveXObject) 
  { 
    oxmlHttpSend = new ActiveXObject("Microsoft.XMLHttp"); 
  } 
  if(oxmlHttpSend == null) 
  { 
    alert("Browser does not support XML Http Request"); 
    return; 
  } 
 
  var url = "chat_send_ajax.php"; 
  var strname="noname"; 
  var strmsg=""; 
  if (document.getElementById("txtname") != null) 
  { 
    strname = document.getElementById("txtname").value; 
    document.getElementById("txtname").readOnly=true; 
  } 
  if (document.getElementById("txtmsg") != null) 
  { 
    strmsg = document.getElementById("txtmsg").value; 
    document.getElementById("txtmsg").value = ""; 
  } 
 
  url += "?name=" + strname + "&msg=" + strmsg; 
  oxmlHttpSend.open("GET",url,true); 
  oxmlHttpSend.send(null); 
}

PHP模块从Query String(查询字符串)中接收表单数据,更新到命名为chat的数据库表中。chat数据库表有命名为ID、USERNAME、CHATDATE和MSG的列。ID字段是自动递增字段,所以这个ID字段的赋值将自动递增。当前的日期和时间,会更新到CHATDATE列。

require_once('dbconnect.php'); 
 
db_connect(); 
 
$msg = $_GET["msg"]; 
$dt = date("Y-m-d H:i:s"); 
$user = $_GET["name"]; 
 
$sql="INSERT INTO chat(USERNAME,CHATDATE,MSG) " . 
   "values(" . quote($user) . "," . 
   quote($dt) . "," . quote($msg) . ");"; 
 
   echo $sql; 
 
$result = mysql_query($sql); 
if(!$result) 
{ 
  throw new Exception('Query failed: ' . mysql_error()); 
  exit(); 
}

为了接收来自数据库表中所有用户的聊天消息,timer函数被设置为循环5秒调用以下的JavaScript命令,即每隔5秒时间执行get_chat_msg函数。

var t = setInterval(function(){get_chat_msg()},5000);

get_chat_msg是一个基于Ajax的函数。它执行chat_recv_ajax.php程序以获得来自于数据库表的聊天信息。在 onreadystatechange属性中,另一个JavaScript 函数get_chat_msg_result被连接起来。在返回来自于数据库表中的聊天消息的同时,程序控制进入到 get_chat_msg_result函数。

// 
// General Ajax Call 
// 
 
var oxmlHttp; 
var oxmlHttpSend; 
 
function get_chat_msg() 
{ 
  if(typeof XMLHttpRequest != "undefined") 
  { 
    oxmlHttp = new XMLHttpRequest(); 
  } 
  else if (window.ActiveXObject) 
  { 
    oxmlHttp = new ActiveXObject("Microsoft.XMLHttp"); 
  } 
  if(oxmlHttp == null) 
  { 
    alert("Browser does not support XML Http Request"); 
    return; 
  } 
 
  oxmlHttp.onreadystatechange = get_chat_msg_result; 
  oxmlHttp.open("GET","chat_recv_ajax.php",true); 
  oxmlHttp.send(null); 
}

在chat_recv_ajax.php程序中,来自于用户的聊天消息会通过SQL select命令进行收集。为了限制行数,在SQL查询中还给出了限制子句(limit 200),即要求聊天数据库表中的最后200行。所获得的消息再返回给Ajax函数,用于在聊天窗口中显示内容。

require_once('dbconnect.php'); 
 
db_connect(); 
 
$sql = "SELECT *, date_format(chatdate,'%d-%m-%Y %r') 
as cdt from chat order by ID desc limit 200"; 
$sql = "SELECT * FROM (" . $sql . ") as ch order by ID"; 
$result = mysql_query($sql) or die('Query failed: ' . mysql_error()); 
 
// Update Row Information 
$msg=""; 
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) 
{ 
  $msg = $msg . "" . 
    "" . 
    ""; 
} 
$msg=$msg . "<table style="color: blue; font-family: verdana, arial; " . 
 "font-size: 10pt;" border="0"> 
 <tbody><tr><td>" . $line["cdt"] . 
 " </td><td>" . $line["username"] . 
 ": </td><td>" . $line["msg"] . 
 "</td></tr></tbody></table>"; 
 
echo $msg; 
 
数据准备就绪的同时,JavaScript函数会收集来自于PHP接收到的数据。这些数据将被安排置于DIV标签内。oxmlHttp.responseText会保留从PHP程序接收到的聊天消息,并复制到DIV标签的document.getElementById(“DIV_CHAT”).innerHTML属性。 
 
function get_chat_msg_result(t) 
{ 
  if(oxmlHttp.readyState==4 || oxmlHttp.readyState=="complete") 
  { 
    if (document.getElementById("DIV_CHAT") != null) 
    { 
      document.getElementById("DIV_CHAT").innerHTML = oxmlHttp.responseText; 
      oxmlHttp = null; 
    } 
    var scrollDiv = document.getElementById("DIV_CHAT"); 
    scrollDiv.scrollTop = scrollDiv.scrollHeight; 
  } 
}

下面的SQL CREATE TABLE命令可用于创建名为chat的数据库表。所有由用户输入的信息都会进入到数据库表中。

create table chat( id bigint AUTO_INCREMENT,username varchar(20),
chatdate datetime,msg varchar(500), primary key(id));

这段用于实现聊天应用程序的代码非常有意思,它可以改进成为一个完全成熟的HTTP聊天应用程序,创建该应用程序的逻辑也非常简单,即使是初学者理解起来也不会有任何困难,希望这篇文章对大家的学习有所帮助。

PHP 相关文章推荐
多文件上载系统完整版
Oct 09 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
PHP以指定字段为索引返回数据库所取的数据数组
Jun 30 PHP
php5.3 注意事项说明
Jul 01 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
PHP中list()函数用法实例简析
Jan 08 PHP
PHP生成静态HTML文档实现代码
Jun 23 PHP
php中static和const关键字用法分析
Dec 07 PHP
PHP回调函数与匿名函数实例详解
Aug 16 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
php实现图片压缩处理
Sep 09 PHP
利用PHP如何实现Socket服务器
Sep 23 #PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 #PHP
Discuz!X中SESSION机制实例详解
Sep 23 #PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 #PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
Sep 23 #PHP
php实现简单的MVC框架实例
Sep 23 #PHP
php实现的单一入口应用程序实例分析
Sep 23 #PHP
You might like
利用PHP创建动态图像
2006/10/09 PHP
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
PHP比你想象的好得多
2014/11/27 PHP
PHP使用递归生成文章树
2015/04/21 PHP
php处理带有中文URL的方法
2016/07/11 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
vue+Element-ui前端实现分页效果
2020/11/15 Javascript
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
python2和python3哪个使用率高
2020/06/23 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
2014年工作总结及2015工作计划
2014/12/12 职场文书
奖励通知
2015/04/22 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
给下属加薪申请报告
2015/05/15 职场文书
三国演义读书笔记
2015/06/25 职场文书
PHP基本语法
2021/03/31 PHP
Python加密技术之RSA加密解密的实现
2022/04/08 Python
详解SQL的窗口函数
2022/04/21 Oracle