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
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
浅谈php扩展imagick
Jun 02 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
Oct 24 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
PHP session 会话处理函数
Jun 06 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
基于thinkPHP实现的微信自定义分享功能示例
Sep 23 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 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采集时被封ip的解决方法
2010/08/29 PHP
php实现图片缩略图的方法
2016/03/29 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
淘宝搜索框效果实现分析
2011/03/05 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Python描述器descriptor详解
2015/02/03 Python
Python 的描述符 descriptor详解
2016/02/27 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
Python中的 enum 模块源码详析
2019/01/09 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
什么是python的必选参数
2020/06/21 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
党校自我鉴定范文
2013/10/02 职场文书
心理健康活动总结
2014/04/30 职场文书
物流专业求职信
2014/06/30 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
高中数学教学反思范文
2016/02/18 职场文书
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python