PHP實現最簡單的聊天室應用

2020-12-08 51CTO

介紹

聊天應用程式在網上非常常見。開發人員在構建這類應用程式時的選擇也很多。這篇文章介紹了如何實現基於PHP-AJAX的聊天應用程式,並且不需要刷新頁面就可以發送和接收消息。

核心邏輯

在定義應用程式的核心功能之前,先來看一看聊天應用程式的基本外觀,如以下截圖所示:

通過聊天窗口底部的輸入框輸入聊天文本。點擊Send按鈕,就開始執行函數set_chat_msg。這是一個基於Ajax的函數,因此無需刷新頁面就可以將聊天文本發送到伺服器。程序在伺服器中執行chat_send_ajax.php以及用戶名和聊天文本。

  1.  
  2.  
  3.  
  4.  
  5. function set_chat_msg() 
  6.     if(typeof XMLHttpRequest != "undefined"
  7.     { 
  8.         oxmlHttpSend = new XMLHttpRequest(); 
  9.     } 
  10.     else if (window.ActiveXObject) 
  11.     { 
  12.        oxmlHttpSend = new ActiveXObject("Microsoft.XMLHttp"); 
  13.     } 
  14.     if(oxmlHttpSend == null
  15.     { 
  16.        alert("Browser does not support XML Http Request"); 
  17.        return
  18.     } 
  19.  
  20.     var url = "chat_send_ajax.php"
  21.     var strname="noname"
  22.     var strmsg=""
  23.     if (document.getElementById("txtname") != null
  24.     { 
  25.         strname = document.getElementById("txtname").value; 
  26.         document.getElementById("txtname").readOnly=true
  27.     } 
  28.     if (document.getElementById("txtmsg") != null
  29.     { 
  30.         strmsg = document.getElementById("txtmsg").value; 
  31.         document.getElementById("txtmsg").value = ""
  32.     } 
  33.  
  34.     url += "?name=" + strname + "&msg=" + strmsg; 
  35.     oxmlHttpSend.open("GET",url,true); 
  36.     oxmlHttpSend.send(null); 

PHP模塊從Query String(查詢字符串)中接收表單數據,更新到命名為chat的資料庫表中。chat資料庫表有命名為IDUSERNAMECHATDATEMSG的列。ID欄位是自動遞增欄位,所以這個ID欄位的賦值將自動遞增。當前的日期和時間,會更新到CHATDATE列。

  1. require_once('dbconnect.php'); 
  2.  
  3. db_connect(); 
  4.  
  5. $msg = $_GET["msg"]; 
  6. $dt = date("Y-m-d H:i:s"); 
  7. $user = $_GET["name"]; 
  8.  
  9. $sql="INSERT INTO chat(USERNAME,CHATDATE,MSG) " . 
  10.       "values(" . quote($user) . "," . 
  11.       quote($dt) . "," . quote($msg) . ");"
  12.  
  13.       echo $sql; 
  14.  
  15. $result = mysql_query($sql); 
  16. if(!$result) 
  17.     throw new Exception('Query failed: ' . mysql_error()); 
  18.     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函數。

  1.  
  2.  
  3.  
  4.  
  5. var oxmlHttp; 
  6. var oxmlHttpSend; 
  7.  
  8. function get_chat_msg() 
  9.     if(typeof XMLHttpRequest != "undefined"
  10.     { 
  11.         oxmlHttp = new XMLHttpRequest(); 
  12.     } 
  13.     else if (window.ActiveXObject) 
  14.     { 
  15.        oxmlHttp = new ActiveXObject("Microsoft.XMLHttp"); 
  16.     } 
  17.     if(oxmlHttp == null
  18.     { 
  19.         alert("Browser does not support XML Http Request"); 
  20.        return
  21.     } 
  22.  
  23.     oxmlHttp.onreadystatechange = get_chat_msg_result; 
  24.     oxmlHttp.open("GET","chat_recv_ajax.php",true); 
  25.     oxmlHttp.send(null); 

在chat_recv_ajax.php程序中,來自於用戶的聊天消息會通過SQL select命令進行收集。為了限制行數,在SQL查詢中還給出了限制子句(limit 200),即要求聊天資料庫表中的***200行。所獲得的消息再返回給Ajax函數,用於在聊天窗口中顯示內容。

  1. require_once('dbconnect.php'); 
  2.  
  3. db_connect(); 
  4.  
  5. $sql = "SELECT *, date_format(chatdate,'%d-%m-%Y %r'
  6. as cdt from chat order by ID desc limit 200"; 
  7. $sql = "SELECT * FROM (" . $sql . ") as ch order by ID"
  8. $result = mysql_query($sql) or die('Query failed: ' . mysql_error()); 
  9.  
  10.  
  11. $msg=""
  12. while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) 
  13.    $msg = $msg . "" . 
  14.         "" . 
  15.         ""
  16. $msg=$msg . "<table style="color: blue; font-family: verdana, arial; " . 
  17.   "font-size: 10pt;" border="0"
  18.   <tbody><tr><td>" . $line["cdt"] . 
  19.   " </td><td>" . $line["username"] . 
  20.   ": </td><td>" . $line["msg"] . 
  21.   "</td></tr></tbody></table>"
  22.  
  23. echo $msg; 
  24.  
  25. 數據準備就緒的同時,JavaScript函數會收集來自於PHP接收到的數據。這些數據將被安排置於DIV標籤內。oxmlHttp.responseText會保留從PHP程序接收到的聊天消息,並複製到DIV標籤的document.getElementById(「DIV_CHAT」).innerHTML屬性。 
  26.  
  27. function get_chat_msg_result(t) 
  28.     if(oxmlHttp.readyState==4 || oxmlHttp.readyState=="complete"
  29.     { 
  30.         if (document.getElementById("DIV_CHAT") != null
  31.         { 
  32.             document.getElementById("DIV_CHAT").innerHTML =  oxmlHttp.responseText; 
  33.             oxmlHttp = null
  34.         } 
  35.         var scrollDiv = document.getElementById("DIV_CHAT"); 
  36.         scrollDiv.scrollTop = scrollDiv.scrollHeight; 
  37.     } 

下面的SQL CREATE TABLE命令可用於創建名為chat的資料庫表。所有由用戶輸入的信息都會進入到資料庫表中。

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

興趣點

這段用於實現聊天應用程式的代碼非常有意思。它可以改進成為一個完全成熟的HTTP聊天應用程式。創建該應用程式的邏輯也非常簡單。即使是初學者理解起來也不會有任何困難。

許可證

這篇文章,以及任何相關的原始碼和文件,都獲得了The Code Project Open License (CPOL)的許可。

譯文連結:http://www.codeceo.com/article/php-chart-app.html
英文原文:Chat Application in PHP

點讚 0

相關焦點

  • PHP實現簡單線性回歸之數學庫的重要性
    對於那些同時還熟練應用PHP的人來說,PHP數學庫的開發可以增強數學學習過程,換句話說,不要只閱讀有關T測試的章節,還要實現一個能計算相應的中間值並用標準格式顯示它們的類。通過指導和訓練,我希望證明開發PHP數學庫並不是一項很難的任務,它可能代表一項有趣的技術和學習難題。
  • polarphp 0.0.1 alpha 發布:全新 PHP 運行時環境
    簡單來說polarphp之於PHP語言的關係跟NodeJS之於Javascript語言一樣,NodeJS在v8引擎基礎之上進行打造,為Javascript提供了一個在服務端運行的環境。同樣polarphp也在zend engine的基礎上進行打造,實現了一個除Web開發之外的一個全新的運行環境。
  • PHP實例——PHP創建動態圖像
    下面,筆者將詳細介紹如何實現。     在使用基本的圖像創建函數之前,需要安裝GD庫文件。如果要使用與JPEG有關的圖像創建函數,還需要安裝jpeg-6b,如果要在圖像中使用Type 1型字體,則必須安裝t1lib。      在建立圖像創建環境之前,還需要做一些準備工作。首先,安裝t1lib接著安裝jpeg-6b,然後再安裝GD庫文件。
  • C/C++、Java、JavaScript、PHP、Python分別用來開發什麼?
    JAVAJava常常跟」企業」聯繫在一起,因為具備一些很好的語言特性,以及豐富的框架,在企業應用中最被青睞,你總可以聽到關於J2EE, JSP, Hibernate之類的東西的討論。同時,Java在手機領域也有一席之地, 在普遍智能化之前, 很多手機就是以支持java應用作為賣點的,而智慧型手機爆發之後, Java手機主場變成了Android,作為安卓的標準程式語言而存。總結:Java:網頁, 企業級開發, 普通應用軟體, 遊戲後臺。
  • Php常見問題總結
    打開php.ini,找到最下面的error_reporting,修改為error_reporting = E_ALL & ~E_NOTICE對於Parse error錯誤error_reporting(0)無法關閉.
  • PHP 框架 QueryPHP 1.0.3 發布,兼容 PHP 8.0 和 PHP 8.1
    關於 QueryPHP QueryPHP 是一款現代化的高性能 PHP 漸進式協程框架, 我們還是主要面向傳統 PHP-FPM 場景,以工程師用戶體驗為歷史使命,讓每一個 PHP 應用都有一個好框架。
  • 工欲善其事必先利其器,盤點Github上那些優秀的PHP項目
    swoole實現了php的異步、多線程,正如官方所說「重新定義PHP」,也許這才是swool的精髓吧。對於phper來說,以前做web開發主要是寫業務邏輯,只需要php的知識即可勝任,使用swool編程則需要補齊多線程編程的知識、進程間通信的知識、網絡協議TCP/UDP的知識,否則很多地方理解起來會有難度。
  • TP6多應用模式下獲取不到當前控制器和方法名 - php中文網
    前言:最近使用TP6做了一套項目,發現多應用模式下使用 $this->request->controller()和 $this->request->action() 無法獲取到當前的控制器和方法名,自己研究了一下,找了個笨辦法
  • php中函數禁用繞過的原理與利用
    我談談我個人的幾個偏向點:版本號最直觀的就是php版本號(雖然版本號有時候會在響應頭中出現),如我的機器上版本號為:PHP Version 7.2.9-1那麼找到版本號後就會綜合看看是否有什麼"版本專享"漏洞可以利用。
  • 怎麼理解php中的數組?php的數組創建和使用方法是什麼?
    php數組的定義數組就是值類型相同的變量的集合,在PHP中的一種常用的複合數據類型,數據可以存放很多的數據,可以存儲任何類型的數據。我們可以把變量當做一個包含值得盒子,那麼可以把數組當做當成一個帶有隔層的盒子,每一層都可以存放一個值。
  • PHP文件包含漏洞利用思路與Bypass總結手冊(二)
    session.serialize_handler=php伺服器在配置文件或代碼裡面沒有對session進行配置的話,PHP默認的會話處理方式就是session.serialize_handler=php這種模式機制。下面通過一個簡單的用戶會話過程了解session.serialize_handler=php是如何工作的。
  • 簡單雙向數據綁定的實現(代碼示例)
    本篇文章給大家帶來的內容是介紹雙向數據綁定的相關內容,讓大家了解為什麼要實現雙向數據綁定,以及怎麼實現簡單的雙向數據綁定。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有所幫助。首先我們了解一下單向數據綁定和雙向數據綁定是什麼?單向數據綁定是什麼?
  • 實例-使用PHP類庫PHPqrCode生成二維碼
    下載官網提供的類庫後,只需要使用 phpqrcode.php 就可以生成二維碼了,你使用的PHP環境必須開啟支持GD2。一、phpqrcode直接輸出二維碼:【例1】調用PHPqrCode非常簡單,如下代碼即可生成一張內容為 百度首頁的二維碼。代碼如下:
  • 朝陽安貞街道建立社區「聊天室」 專陪老人聊家長裡短兒
    對於家住朝陽安貞街道安貞裡三區的居民來說,74歲的趙淑雲和她牽頭建立的「情暖夕陽」聊天室幾乎家喻戶曉,在9年時間裡,這個溫馨的「聊天室」共服務超過5000餘人次,盡情的傾訴、耐心的傾聽,讓這裡成為社區老人們難得的心靈歸宿與休憩港灣。
  • 關於PHP 5.4 你所需要知道的
    Traits的最佳應用是多類之間可以共享相同的函數。打個比方,我們要做個網站,需要使用Facebook和Twitter的APIs。我們要建2個類,如果是以前,我們需要寫一個cURL的方法並且複製/粘貼到兩個類中。現在不用了,使用Traits重用代碼吧,這次真正地遵循了DRY(Don’t Repeat Yourself)原則。
  • DVBBS php轉換工具使用教程
    動網PHP1.03、asp71sql-to-php10  動網的ASP7.1 MSSQL 轉到 動網PHP1.04、dz41-to-php10  DISCUZ4.1 轉到 動網PHP1.05、dz50-to-php10  DISCUZ5.0 轉到 動網PHP1.0使用工具對sql資料庫進行管理和維護,這樣能加快一些不熟悉sql語句的新手快速應用
  • PHP框架 Solar 1.1.2發布!
    SolarPHP是一個應用程式框架和庫,是Zend Framework、Symfony、Cake和其它類似框架的強有力競爭對手。
  • php基礎打通關之一,你能通關嗎?
    本節將通過試題的方式來講解php的基礎問題,有興趣的來看看自己的php基礎如何!php基礎知識結構PHP 是下列哪個選項的簡稱?A. Preprocessed Hypertext PageB. Hypertext Markup LanguageC.
  • php常量是什麼?它和變量有什麼區別?
    本篇將介紹php常量是什麼?它和變量有什麼區別?有興趣的朋友可以了解一下!一、前言php是一門很受歡迎的程式語言之一,它的語法簡單易學,迎來了一大批自學者,小編也是其中之一。小編自學php學了四個多月吧!雖然算不上精通,但是也算得上小有成就,獨立開發中小型網站還是不成問題的。
  • php基礎大通關——十分鐘了解php基礎知識點之二
    本節我們繼續通過練習題的方式來熟悉php的基礎知識點。1. echo 和 print 有什麼區別?php常用函數3. Joomla 在 PHP 中是什麼? 一套功能豐富的庫 開源 CMS 設計動態頁面的框架 可重用 PHP 組件的框架和分發系統解析:Joomla!