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 相关文章推荐
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
PHP之短标签开启设置
Jun 17 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
php读取文件内容的方法汇总
Jan 24 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 PHP
PHP单例模式定义与使用实例详解
Feb 06 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 22 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生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
PHP时间函数使用详解
2019/03/21 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
jquery URL参数判断,确定菜单样式
2010/05/31 Javascript
js 金额文本框实现代码
2012/02/14 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
谈谈JavaScript中的垃圾回收机制
2020/09/17 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
pandas重新生成索引的方法
2018/11/06 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
Django通过json格式收集主机信息
2020/05/29 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
教学器材管理制度
2014/01/26 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
房产公证书样本
2015/01/23 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
详解Python中*args和**kwargs的使用
2022/04/07 Python
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫