찾다
백엔드 개발PHP 튜토리얼Ajax PHP JavaScript MySQL은 새로 고침이 필요 없는 간단한 온라인 채팅방을 구현합니다.

이 기사는 새로 고침이 없는 간단한 온라인 채팅방을 구현하기 위해 Ajax PHP JavaScript MySQL을 주로 소개합니다. 관심 있는 친구들은 이를 참고할 수 있습니다.

지난 이틀 동안 배운 Ajax 관련 지식을 더 잘 활용하기 위해 그 지식을 바탕으로 간단한 온라인 채팅방을 만들었습니다.

Idea

대화방을 구현하려면 기본적으로 Ajax를 통해 데이터를 전송하고, PHP에서 데이터 입력 및 검색을 구현한 다음 이를 프런트엔드 JavaScript에 전달하여 페이지를 업데이트하여 기능을 구현합니다. 인스턴트 채팅의

메시지 표시 영역

메시지 표시 영역은 Ajax를 사용하여 서버 측 정보를 얻고 JavaScript를 사용하여 페이지를 업데이트합니다.

<h3 id="消息显示区">消息显示区</h3>
<p id="up">
</p>
<hr />

메시지 보내기

메시지 모듈은 직설적으로 말하면 서버에 데이터를 삽입하는 과정인데 이 역시 비교적 간단합니다.

<h3 id="发言栏">发言栏</h3>
  <p id="bottom">
    <form action="./chatroom_insert.php">
      <p id="chat_up">
        <span>颜色</span>
        <input type="color" name="color"/>
        <span>表情</span>
        <select name="biaoqing">
          <option value="微笑地">微笑地</option>
          <option value="猥琐地">猥琐地</option>
          <option value="和蔼地">和蔼地</option>
          <option value="目不转睛地">目不转睛地</option>
          <option value="傻傻地">傻傻地</option>
        </select>
        <span>聊天对象</span>
        <select name="receiver">
          <option value="">所有的人</option>
          <option value="老郭">老郭</option>
          <option value="小郭">小郭</option>
          <option value="大郭">大郭</option>
        </select>
      </p>
      <p id="chat_bottom">
        <textarea id="msg" name="msg" style="width:380px;height:auto;"></textarea>
        <input type="button" value="发言" onclick="send()" />
        发言:<span id="result"></span>
      </p>
    </form>
  </p>

섹션

코드를 사용하여 관련 비즈니스 로직을 구현해 보세요.

메시지 표시

우리의 생각은 클라이언트가 가끔씩 서버에 요청을 보내고 최신 데이터를 얻기 위해 폴링한다는 것입니다.

<script>

function showmessage(){
  var ajax = new XMLHttpRequest();
  // 从服务器获取并处理数据
  ajax.onreadystatechange = function(){
    if(ajax.readyState==4) {
      //alert(ajax.responseText); 
      // 将获取到的字符串转换成实体
      eval(&#39;var data = &#39;+ajax.responseText);
      // 遍历data数组,把内部的信息一个个的显示到页面上
      var s = "";
      for(var i = 0 ; i < data.length;i++){
        data[i];
        s += "("+data[i].add_time+") >>>";
        s += "<p style=&#39;color:"+data[i].color+";&#39;>";  
        s += data[i].sender +" 对 " + data[i].receiver +"  "+ data[i].biaoqing+"说:" + data[i].msg;
        s += "</p>";

      }
      // 开始向页面时追加信息
      var showmessage = document.getElementById("up");
      showmessage.innerHTML += s;

    }
  }
  ajax.open(&#39;get&#39;,&#39;./chatroom.php&#39;);
  ajax.send(null);  

}

// 更新信息的执行时机
window.onload = function(){
  //showmessage();  
  // 制作轮询,实现自动的页面更新
  setInterval("showmessage()",3000);
}
</script>


더 중요한 것은 요청 이벤트의 간격 트리거를 달성하기 위해 setInterval 함수를 사용하는 것입니다.

메시지 보내기

메시지 보내기는 양식을 통해 서버에 보내면 됩니다. 여기서는 HTML5의 최신 기술인 FormData를 사용합니다. 일반적으로 현재 주류 최신 브라우저는 이 기술을 지원합니다. FormData를 사용하면 양식의 데이터를 쉽게 얻을 수 있습니다.

참고: FormData는 키-값 쌍의 형태로 양식 데이터를 수집하므로 해당 양식 항목에는 이름 속성이 있어야 합니다. 그렇지 않으면 양식에서 항목의 데이터 값을 수집할 수 없습니다.


 <script>
  function send(){
    // 向服务器差入相关的数据
    var form = document.getElementsByTagName(&#39;form&#39;)[0];
    var formdata = new FormData(form);
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
      if(xhr.readyState==4) {
        //alert(xhr.resposneText);
        document.getElementById("result").innerHTML = xhr.responseText;
        setTimeout("hideresult()",2000);
      }
    }
    xhr.open(&#39;post&#39;,&#39;./chatroom_insert.php&#39;);
    xhr.send(formdata);
    document.getElementById("msg").value="";
    //return false;
  }

  // 2秒后实现提示信息的消失
  function hideresult(){
    document.getElementById(&#39;result&#39;).innerHTML = "";  
  }
</script>

생각해 볼 가치가 있는 것은 setTimeout 함수에 의해 구현된 함수입니다. 서버로부터 피드백 정보를 받은 후 보내기 버튼 뒤에 적시에 업데이트되어 사용자에게 좋은 경험을 제공합니다.

Optimization

이 작업을 완료하면 기본적으로 채팅을 구현할 수 있습니다. 그러나 달성된 효과는 주로 다음 사항으로 인해 매우 나쁠 것입니다.
•스크롤링 표시가 없으며 매번 최신 뉴스를 수동으로 확인해야 합니다.
•얻은 데이터에는 중복된 데이터가 많이 포함되어 있어 트래픽이 낭비되고 정보 보기가 불편합니다.

반복되지 않는 데이터 표시

반복적인 데이터를 표시하는 이유는 where 문을 사용하지 않기 때문인데, 매번 모든 데이터를 얻어오는 것 같습니다. 생각해 보세요. 어떻게 최신 데이터를 얻을 수 있을까요?
그리고 다양한 고객을 돌봐야 합니다.

Hollywood 원칙: 나에게 오지 마세요, 내가 당신에게 갈 것입니다

이는 또한 고객이 이기기보다는 어떤 데이터를 얻을지 결정할 수 있도록 하는 많은 소프트웨어 개발 개념의 표현입니다. 막대기로 서버를 죽입니다. 따라서 데이터 요청을 보낼 때 클라이언트를 최적화해야 합니다.

<script>
// 记录当前获取到的id的最大值,防止获取到重复的信息
var maxId = 0;
function showmessage(){
  var ajax = new XMLHttpRequest();
  // 从服务器获取并处理数据
  ajax.onreadystatechange = function(){
    if(ajax.readyState==4) {
      //alert(ajax.responseText); 
      // 将获取到的字符串转换成实体
      eval(&#39;var data = &#39;+ajax.responseText);
      // 遍历data数组,把内部的信息一个个的显示到页面上
      var s = "";
      for(var i = 0 ; i < data.length;i++){
        data[i];
        s += "("+data[i].add_time+") >>>";
        s += "<p style=&#39;color:"+data[i].color+";&#39;>";  
        s += data[i].sender +" 对 " + data[i].receiver +"  "+ data[i].biaoqing+"说:" + data[i].msg;
        s += "</p>";
        // 把已经获得的最大的记录id更新
        maxId = data[i].id;
      }
      // 开始向页面时追加信息
      var showmessage = document.getElementById("up");
      showmessage.innerHTML += s;
      //showmessage.scrollTop 可以实现p底部最先展示
      // pnode.scrollHeight而已获得p的高度包括滚动条的高度
      showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;
    }
  }
  ajax.open(&#39;get&#39;,&#39;./chatroom.php?maxId=&#39;+maxId);
  ajax.send(null);  

}

// 更新信息的执行时机
window.onload = function(){
  //showmessage();  
  // 制作轮询,实现自动的页面更新
  setInterval("showmessage()",3000);
}
</script>


디스플레이 최적화

디스플레이 인터페이스 최적화는 데이터를 보낸 후 수동으로 최신 메시지를 확인하는 것을 용납할 수 없습니다. 따라서 표시 영역의 p를 설정해야 합니다.

스크롤바 추가

<style>
  #up {
    height:320px;
    width:100%;
    overflow:auto; 
  }
</style>

최신 뉴스를 매번 표시합니다

직접 말하면 항상 맨 밑에 있는 p가 먼저 표시됩니다.

//showmessage.scrollTop 可以实现p底部最先展示
// pnode.scrollHeight而已获得p的高度包括滚动条的高度
showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;

전체 코드

프런트 엔드 코드





Ajax 聊天室

<script>
// 记录当前获取到的id的最大值,防止获取到重复的信息
var maxId = 0;
function showmessage(){
  var ajax = new XMLHttpRequest();
  // 从服务器获取并处理数据
  ajax.onreadystatechange = function(){
    if(ajax.readyState==4) {
      //alert(ajax.responseText); 
      // 将获取到的字符串转换成实体
      eval(&#39;var data = &#39;+ajax.responseText);
      // 遍历data数组,把内部的信息一个个的显示到页面上
      var s = "";
      for(var i = 0 ; i < data.length;i++){
        data[i];
        s += "("+data[i].add_time+") >>>";
        s += "<p style=&#39;color:"+data[i].color+";&#39;>";  
        s += data[i].sender +" 对 " + data[i].receiver +"  "+ data[i].biaoqing+"说:" + data[i].msg;
        s += "</p>";
        // 把已经获得的最大的记录id更新
        maxId = data[i].id;
      }
      // 开始向页面时追加信息
      var showmessage = document.getElementById("up");
      showmessage.innerHTML += s;
      //showmessage.scrollTop 可以实现p底部最先展示
      // pnode.scrollHeight而已获得p的高度包括滚动条的高度
      showmessage.scrollTop = showmessage.scrollHeight-showmessage.style.height;
    }
  }
  ajax.open(&#39;get&#39;,&#39;./chatroom.php?maxId=&#39;+maxId);
  ajax.send(null);  

}

// 更新信息的执行时机
window.onload = function(){
  //showmessage();  
  // 制作轮询,实现自动的页面更新
  setInterval("showmessage()",3000);
}
</script>




消息显示区


发言栏

颜色 表情 聊天对象

<script> function send(){ // 向服务器差入相关的数据 var form = document.getElementsByTagName(&#39;form&#39;)[0]; var formdata = new FormData(form); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState==4) { //alert(xhr.resposneText); document.getElementById("result").innerHTML = xhr.responseText; setTimeout("hideresult()",2000); } } xhr.open(&#39;post&#39;,&#39;./chatroom_insert.php&#39;); xhr.send(formdata); document.getElementById("msg").value=""; //return false; } // 2秒后实现提示信息的消失 function hideresult(){ document.getElementById(&#39;result&#39;).innerHTML = ""; } </script> 发言:


데이터베이스 테이블 구조


mysql> desc message;
+----------+--------------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra     |
+----------+--------------+------+-----+---------+----------------+
| id    | int(100)   | NO  | PRI | NULL  | auto_increment |
| msg   | varchar(255) | NO  |   | NULL  |        |
| sender  | varchar(30) | NO  |   | NULL  |        |
| receiver | varchar(30) | NO  |   | NULL  |        |
| color  | varchar(10) | YES |   | NULL  |        |
| biaoqing | varchar(10) | YES |   | NULL  |        |
| add_time | datetime   | YES |   | NULL  |        |
+----------+--------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

서버 측 코드

<?php

// 获得最新的聊天信息
$conn = mysql_connect(&#39;localhost&#39;,&#39;root&#39;,&#39;mysql&#39;);
mysql_select_db(&#39;test&#39;);
mysql_query(&#39;set names utf8&#39;);

$maxId = $_GET[&#39;maxId&#39;];

// 防止获取重复数据,本次请求的记录结果id要大鱼上次获得的id
$sql = "select * from message where id >"."&#39;$maxId&#39;";
$qry = mysql_query($sql);

$info = array();
while($rst = mysql_fetch_assoc($qry)){
  $info[] = $rst;
}


// 通过json格式给客户端提供数据
echo json_encode($info);


?>


요약 및 전망 ​​

요약

완료 작은 예는 여기까지입니다. 오늘의 이득을 검토해 보면 다음과 같습니다.
• setInterval 함수를 사용하여 데이터를 얻기 위해 폴링하는 방법
• setTimeout 함수를 사용하여 프롬프트 데이터가 적시에 사라짐
• 최신 데이터를 얻는 방법: 클라이언트 제어 하에 전송되는 maxId 매개변수입니다.
•디스플레이 최적화 방법: 오버플로는 스크롤 효과를 구현합니다. pnode.scrollTop은 디스플레이 하단 효과를 제어합니다.

Outlook
•클라이언트 발신자가 고정되어 있음을 알 수 있습니다. 사용자 로그인. 사용자가 로그인하면 세션에서 발신자를 동적으로 얻을 수 있습니다. 이는 또한 사람들의 주관적인 감정과 더 일치할 수도 있습니다.

•인터페이스가 허술하고 미화효과가 없습니다. Bootstrap을 추가한 후 효과가 뛰어날 것입니다.

•휴대폰 적응 효과가 좋지 않고, Windows Phone에서는 색상 조절이 정상적으로 표시되지 않습니다.

관련 권장 사항:

php+webSoket 채팅방 샘플 코드 구현(소스 코드 첨부)

Python+Slack API를 사용하여 챗봇을 구현하는 방법의 자세한 예



위 내용은 Ajax PHP JavaScript MySQL은 새로 고침이 필요 없는 간단한 온라인 채팅방을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP의 전체 형태는 무엇입니까?PHP의 전체 형태는 무엇입니까?Apr 28, 2025 pm 04:58 PM

이 기사는 PHP에 대해 설명하고, 전체 형식, 웹 개발의 주요 용도, Python 및 Java와의 비교 및 ​​초보자를위한 학습 용이성을 자세히 설명합니다.

PHP는 양식 데이터를 어떻게 처리합니까?PHP는 양식 데이터를 어떻게 처리합니까?Apr 28, 2025 pm 04:57 PM

PHP는 유효성 검사, 소독 및 보안 데이터베이스 상호 작용을 통해 보안을 보장하면서 $ \ _ post 및 $ \ _를 사용하여 데이터 양식 데이터를 처리합니다.

PHP와 ASP.NET의 차이점은 무엇입니까?PHP와 ASP.NET의 차이점은 무엇입니까?Apr 28, 2025 pm 04:56 PM

이 기사는 PHP와 ASP.NET을 비교하여 대규모 웹 응용 프로그램, 성능 차이 및 보안 기능에 대한 적합성에 중점을 둡니다. 둘 다 대규모 프로젝트에서는 실용적이지만 PHP는 오픈 소스 및 플랫폼 독립적이며 ASP.NET,

PHP는 사례에 민감한 언어입니까?PHP는 사례에 민감한 언어입니까?Apr 28, 2025 pm 04:55 PM

PHP의 사례 감도는 다양합니다. 함수는 무감각하고 변수와 클래스는 민감합니다. 모범 사례에는 일관된 이름 지정 및 비교를위한 사례 감수 기능 사용이 포함됩니다.

PHP에서 페이지를 어떻게 리디렉션합니까?PHP에서 페이지를 어떻게 리디렉션합니까?Apr 28, 2025 pm 04:54 PM

이 기사는 PHP의 페이지 리디렉션에 대한 다양한 방법에 대해 설명하고 헤더 () 함수에 중점을두고 "헤더가 이미 보낸 헤더"오류와 같은 일반적인 문제를 해결합니다.

PHP의 유형을 설명하십시오PHP의 유형을 설명하십시오Apr 28, 2025 pm 04:52 PM

기사는 기능의 예상 데이터 유형을 지정하는 기능인 PHP의 유형 힌트에 대해 설명합니다. 주요 문제는 유형 시행을 통해 코드 품질과 가독성을 향상시키는 것입니다.

PHP의 PDO는 무엇입니까?PHP의 PDO는 무엇입니까?Apr 28, 2025 pm 04:51 PM

이 기사에서는 PHP Data Objects (PDO)에 대해 설명합니다. PHP의 데이터베이스 액세스 확장. 데이터베이스 추상화 및 더 나은 오류 처리를 포함하여 준비된 진술과 MySQLI에 대한 이점을 통해 보안을 향상시키는 데 PDO의 역할을 강조합니다.

PHP에서 API를 만드는 방법?PHP에서 API를 만드는 방법?Apr 28, 2025 pm 04:50 PM

기사는 PHP API 생성 및 보호, Laravel 및 Best Security Practices와 같은 프레임 워크를 사용하여 엔드 포인트 정의에서 성능 최적화에 이르는 단계를 자세히 설명합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.