How to Create A Simple Web-based Chat Application

How to Create A Simple Web-based Chat Application

Tutorial Details
  • Technologies: JavaScript,PHP,CSS
  • Difficulty: Beginner

In this tutorial we will be creating a simple web-based chat application with PHP and jQuery. This sort of utility would be perfect for a live support system for your website.


Introduction

final product

The chat application we will be building today will be quite simple. It will include a login and logout system, AJAX-style features, and will also offer support for multiple users.


Step 1 : HTML Markup

We will start this tutorial by creating our first file called index.php.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Chat - Customer Module</title>
<link type="text/css" rel="stylesheet" href="style.css" />
</head>

<div id="wrapper">
	<div id="menu">
		<p class="welcome">Welcome, <b></b></p>
		<p class="logout"><a id="exit" href="#">Exit Chat</a></p>
		<div style="clear:both"></div>
	</div>

	<div id="chatbox"></div>

	<form name="message" action="">
		<input name="usermsg" type="text" id="usermsg" size="63" />
		<input name="submitmsg" type="submit"  id="submitmsg" value="Send" />
	</form>
</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script type="text/javascript">
// jQuery Document
$(document).ready(function(){

});
</script>
</body>
</html>
  • We start our html with the usual DOCTYPE, html, head, and body tags. In the head tag, we add our title, and link to our css stylesheet (style.css).
  • Inside the body tag, we structure our layout inside the #wrapper div. We will have three main blocks: a simple Menu, our chatbox, and our message input; each with its respective div and id.
    • The #menu div will consist of two paragraph elements. The first will be a welcome to the user and will float left and the second will be an exit link and will float right. We also include a div to clear the elements.
    • The #chatbox div will contain our chatlog. We will load our log from an external file using jQuery’s ajax request.
    • The last item in our #wrapper div will be our form, which will include an text input for the user message and a submit button.
  • We add our scripts last to load the page faster. We will first link to the Google jQuery CDN, as we will be using the jQuery library for this tutorial. Our second script tag will be where we will be working on. We will load all of our code after the document is ready.

Step 2 : CSS Styling

We will now add some css to make our chat application look better than with the default browser styling. The code below will be added to our style.css file.


/* CSS Document */
body {
	font:12px arial;
	color: #222;
	text-align:center;
	padding:35px; }

form, p, span {
	margin:0;
	padding:0; }

input { font:12px arial; }

a {
	color:#0000FF;
	text-decoration:none; }

	a:hover { text-decoration:underline; }

#wrapper, #loginform {
	margin:0 auto;
	padding-bottom:25px;
	background:#EBF4FB;
	width:504px;
	border:1px solid #ACD8F0; }

#loginform { padding-top:18px; }

	#loginform p { margin: 5px; }

#chatbox {
	text-align:left;
	margin:0 auto;
	margin-bottom:25px;
	padding:10px;
	background:#fff;
	height:270px;
	width:430px;
	border:1px solid #ACD8F0;
	overflow:auto; }

#usermsg {
	width:395px;
	border:1px solid #ACD8F0; }

#submit { width: 60px; }

.error { color: #ff0000; }

#menu { padding:12.5px 25px 12.5px 25px; }

.welcome { float:left; }

.logout { float:right; }

.msgln { margin:0 0 2px 0; }

There’s nothing special about the above css other than the fact that some id’s or classes, which we have set a style for, will be added a bit later.

As you can see above, we are finished building the chat’s user interface.

Step 3 : Using PHP to Create a Login Form.

Now we will implement a simple form that will ask the user their name before continuing further on.

<?
session_start();

function loginForm(){
	echo'
	<div id="loginform">
	<form action="index.php" method="post">
		<p>Please enter your name to continue:</p>
		<label for="name">Name:</label>
		<input type="text" name="name" id="name" />
		<input type="submit" name="enter" id="enter" value="Enter" />
	</form>
	</div>
	';
}

if(isset($_POST['enter'])){
	if($_POST['name'] != ""){
		$_SESSION['name'] = stripslashes(htmlspecialchars($_POST['name']));
	}
	else{
		echo '<span class="error">Please type in a name</span>';
	}
}
?>

The loginForm() function we created is composed of a simple login form which asks the user for his/her name. We then use an if and else statement to verify that the person entered a name. If the person entered a name, we set that name as $_SESSION['name']. Since we are using a cookie-based session to store the name, we must call session_start() before anything is outputted to the browser.

One thing that you may want to pay close attention to, is that we have used the htmlspecialchars() function, which converts special characters to HTML entities, therefore protecting the name variable from become victim to Cross-site scripting (XSS). We will later also add this function to the text variable that will be posted to the chat log.

Showing the Login Form

In order to show the login form in case a user has not logged in, and hence has not created a session, we use another if and else statement around the #wrapper div and script tags in our original code. On the opposite case, this will hide the login form, and show the chat box if the user is logged in and has created a session.;

<?php
if(!isset($_SESSION['name'])){
	loginForm();
}
else{
?>
<div id="wrapper">
	<div id="menu">
		<p class="welcome">Welcome, <b><?php echo $_SESSION['name']; ?></b></p>
		<p class="logout"><a id="exit" href="#">Exit Chat</a></p>
		<div style="clear:both"></div>
	</div>
	<div id="chatbox"></div>

	<form name="message" action="">
		<input name="usermsg" type="text" id="usermsg" size="63" />
		<input name="submitmsg" type="submit"  id="submitmsg" value="Send" />
	</form>
</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script type="text/javascript">
// jQuery Document
$(document).ready(function(){
});
</script>
<?php
}
?>

Welcome and Logout Menu

We are not yet finished creating the login system for this chat application. We still need to allow the user to log out, and end the chat session. If you can remember, our original HTML markup included a simple menu. Let’s go back and add some PHP code that will give the menu more functionality.

First of all, let’s add the users name to the welcome message. We do this by outputting the session of the user’s name.

<p class="welcome">Welcome, <b><?php echo $_SESSION['name']; ?></b></p>

In order to allow the user to log out and end the session, we will jump ahead of ourselves and briefly use jQuery.

<script type="text/javascript">
// jQuery Document
$(document).ready(function(){
	//If user wants to end session
	$("#exit").click(function(){
		var exit = confirm("Are you sure you want to end the session?");
		if(exit==true){window.location = 'index.php?logout=true';}
	});
});
</script>

The jquery code above simple shows a confirmation alert if a user clicks the #exit link. If the user confirms the exit, therefore deciding to end the session, then we send them to index.php?logout=true. This simple creates a variable called logout with the value of true. We need to catch this variable with PHP:

if(isset($_GET['logout'])){	

	//Simple exit message
	$fp = fopen("log.html", 'a');
	fwrite($fp, "<div class='msgln'><i>User ". $_SESSION['name'] ." has left the chat session.</i><br></div>");
	fclose($fp);

	session_destroy();
	header("Location: index.php"); //Redirect the user
}

We now see if a get variable of ‘logout’ exists using the isset() function. If the variable has been passed via a url, such as the link mentioned above, we proceed to end the session of the user’s name.

Before destroying the user’s name session with the session_destroy() function, we want to write a simple exit message to the chat log. It will say that the user has left the chat session. We do this by using the fopen(), fwrite(), and fclose() functions to manipulate our log.html file, which as we will see later on, will be created as our chat log. Please note that we have added a class of ‘msgln’ to the div. We have already defined the css styling for this div.

After doing this, we destroy the session, and redirect the user to the same page where the login form will appear.


Step 4 : Handling User Input

After a user submits our form, we want to grab his input and write it to our chat log. In order to do this, we must use jQuery and PHP to work synchronously on the client and server sides.

jQuery

Almost everything we are going to do with jQuery in order to handle our data, will revolve around the jQuery post request.

	//If user submits the form
	$("#submitmsg").click(function(){
		var clientmsg = $("#usermsg").val();
		$.post("post.php", {text: clientmsg});
		$("#usermsg").attr("value", "");
		return false;
	});
  1. Before we do anything, we must grab the user’s input, or what he has typed into the #submitmsg input. This can be achieved with the val() function, which gets the value set in a form field. We now store this value into the clientmsg variable.
  2. Here come’s our most important part: the jQuery post request. This sends a POST request to the post.php file that we will create in a moment. It posts the clients input, or what has been saved into the clientmsg variable.
  3. Lastly, we clear the #usermsg input by setting the value attribute to blank.

Please not that the code above will go into our script tag, where we placed the jQuery logout code.

PHP – post.php

At the moment we have POST data being sent to the post.php file each time the user submits the form, and sends a new message. Our goal now is to grab this data, and write it into our chat log.

<?
session_start();
if(isset($_SESSION['name'])){
	$text = $_POST['text'];

	$fp = fopen("log.html", 'a');
	fwrite($fp, "<div class='msgln'>(".date("g:i A").") <b>".$_SESSION['name']."</b>: ".stripslashes(htmlspecialchars($text))."<br></div>");
	fclose($fp);
}
?>
  1. Before we do anything, we have to start the post.php file with the session_start() function as we will be using the session of the user’s name in this file.
  2. Using the isset boolean, we check if the session for ‘name’ exists before doing anything else.
  3. We now grab the POST data that was being sent to this file by jQuery. We store this data into the $text variable.
  4. This data, as will all overall user input data, will be stored on the log.html file. To do this we open the file with the mode on the fopen function to ‘a’, which according to php.net opens the file for writing only; places the file pointer at the end of the file. If the file does not exist, attempt to create it. We then write our message to the file using the fwrite() function.
    • The message we will be writing will be enclosed inside the .msgln div. It will contain the date and time generated by the date() function, the session of the user’s name, and the text, which is also sorrounded by the htmlspecialchars() function to prevent from XSS.

    Lastly, we close our file handle using fclose().


Step 5 : Displaying the Chat Log (log.html) Contents

Everything the user has posted is handled and posted using jQuery; it is written to the chat log with PHP. The only thing left to do is to display the updated chat log to the user.

In order to save ourselves some time, we will preload the chat log into the #chatbox div if it has any content.

	<div id="chatbox"><?php
	if(file_exists("log.html") && filesize("log.html") > 0){
		$handle = fopen("log.html", "r");
		$contents = fread($handle, filesize("log.html"));
		fclose($handle);

		echo $contents;
	}
	?></div>

We use a similar routine as we used the post.php file, except this time we are only reading and outputting the contents of the file.

The jQuery.ajax request

The ajax request is the core of everything we are doing. This request not only allows us to send and receive data throught the form without refreshing the page, but it also allows us to handle the data requested.

//Load the file containing the chat log
	function loadLog(){		

		$.ajax({
			url: "log.html",
			cache: false,
			success: function(html){
				$("#chatbox").html(html); //Insert chat log into the #chatbox div
		  	},
		});
	}

We wrap our ajax request inside a function. You will see why in a second. As you see above we will only use three of the jQuery ajax request objects.

  • url: A string of the URL to request. We will use our chat log’s filename of log.html.
  • cache: This will prevent the our file from being cached. It will ensure that we get an updated chat log everytime we send a request.
  • sucess: This will allow us to attach a function that will pass the data we requested.

As you see, we then move the data we requested (html) into the #chatbox div.

Auto-scrolling

As you may have seen in other chat applications, the content automatically scrolls down if the chat log container (#chatbox) overflows. We are going to implement a simple and similar feature, that will compare the container’s scroll height before and after we do the ajax request. If the scroll height is greater after the request, we will use jQuery’s animate effect to scroll the #chatbox div.

	//Load the file containing the chat log
	function loadLog(){
		var oldscrollHeight = $("#chatbox").attr("scrollHeight") - 20; //Scroll height before the request
		$.ajax({
			url: "log.html",
			cache: false,
			success: function(html){
				$("#chatbox").html(html); //Insert chat log into the #chatbox div	

				//Auto-scroll
				var newscrollHeight = $("#chatbox").attr("scrollHeight") - 20; //Scroll height after the request
				if(newscrollHeight > oldscrollHeight){
					$("#chatbox").animate({ scrollTop: newscrollHeight }, 'normal'); //Autoscroll to bottom of div
				}
		  	},
		});
	}
  • We first store the #chatbox div’s scroll height into the oldscrollHeight variable before we make the request.
  • After our request has returned sucessful, we store the #chatbox div’s scrolle height into the newscrollHeight variable.
  • We then compare both of the scroll height variables using an if statement. If the newscrollHeight is greater than the oldscrollHeight, we use the animate effect to scroll the #chatbox div.

Continuously Updating the Chat Log

Now one question may arise, how will we constantly update the new data being sent back and forth between users? Or to rephrase the question, how will we continuously keep sending requests to update the data?

setInterval (loadLog, 2500);	//Reload file every 2500 ms or x ms if you wish to change the second parameter

The answer to our question lies in the setInterval function. This function will run our loadLog() function every 2.5 seconds, and the loadLog function will request the updated file and autoscroll the div.

Finished

We are finished! I hope that you learned how a basic chat system works, and if you have any suggestions on anything, I’ll happily welcome them. This chat system is a simple as you can get with a chat application. You can work off this and build a multiple chat rooms, add an administrative backend, add emoticons, ect. The sky here is your limit.

Below are a few links you might want to check if you are thinking of expanding this chat application:


Add Comment

Discussion 397 Comments

Comment Page 6 of 7 1 ... 4 5 6 7
  1. agaluh says:

    this is very usefull for me

    thanks for the code..

  2. sunil says:

    hi,

    good code.

    i am using this code but getting some problem. I want to create multiple log.html files according to different session for each user. i dnt want to store data in same or one log.html file.

    plz help me as soon as possible…..

    thanks for the code…..

    • Tim says:

      @Sunil I would imagin you could change this:
      <?
      session_start();
      if(isset($_SESSION['name'])){
      $text = $_POST['text'];

      $fp = fopen(“log.html”, ‘a’);
      fwrite($fp, “<div class=’msgln’>(“.date(“g:i A”).”) <b&gt”.$_SESSION['name'].”</b>: “.stripslashes(htmlspecialchars($text)).”<br></div>”);
      fclose($fp);
      }
      ?>

      To this:

      <?
      session_start();
      if(isset($_SESSION['name'])){
      $text = $_POST['text'];

      $fp = fopen($_Session['name']) .” log.html”, ‘a’);
      fwrite($fp, “<div class=’msgln’>(“.date(“g:i A”).”) <b&gt”.$_SESSION['name'].”</b>: “.stripslashes(htmlspecialchars($text)).”<br></div>”);
      fclose($fp);
      }
      ?>

      then reference the url in the script by echoing it using the php at the point in the script you could do this by setting a variable

      $Chatlogurl =$_SESSION['name'] .” log.html”

      and put in <?php echo $Chatlogurl;?> where the path is needed in any scripts

      then update each bit of the code in the rest of the tutorial to refrence the url this way

      hope this helps.

      Thanks to the auther of this Tutorial I hope to add a support chat to my website soon too.

  3. essener says:

    is there anyway to add the text “user has left the session” when user closes the tab or browser? or do i need other scripts for that?

  4. jose says:

    how to add random users to chat like omegle.com

  5. derrick says:

    i a little confused,do i have to create a file for every script?
    and how do i link them?

  6. Gay Roulette says:

    Can you tell us more about this? I’d care to find out more details.

  7. rithi says:

    Hi,plz anyone send me the integrated code for chatbox with all usage.

  8. Anonymous says:

    Good code. problem now is I cannot tell when user joins the chat, there is no user has joined the chat message.
    I also had to put in a refresh script to refresh the chatbox as it was not being refreshed.

  9. john says:

    pls aw will i use all that can you explain step by step

  10. errol says:

    thank you so much. excellent tutorial

  11. rra says:

    Please tell us whether jquery noconflict works for this $.post

  12. Arafat says:

    very nice tips……………………

  13. Rocka says:

    I miss url auto linking

  14. androidzone says:

    code not working properly

  15. David says:

    Thanks man, this will be a great start for my project. Thanks alot.

  16. neil says:

    how to clear ?

  17. Austin says:

    Nice tutorial, unfortunately the code lacks efficiency in many aspects.

  18. Jirka says:

    Hi,

    Am I only who can not run this script in Google chrome 16.09 and IE 9? In Firefox and the newest Opera this code is perfectly running…

    Everything is ok, but if I post message in Google chrome OR IE to log, it doesn´t work.

    Can anyone help me?

    Thanks for your support

  19. kottapallih says:

    It’s an awesome tutorial . It worked for me . But , how can I be able to chat with my users . They can login and chat . But , how can I chat with my users ?

    And I want to have multiple log.html files . I want to create multiple log.html files according to different session for each user. i din’t want to store data in same or one log.html file.
    plz help me as soon as possible .

    kottapallih.

  20. AndreM says:

    I see one small problem with the current polling approach: requests piling up if the server gets overloaded, leading to further overload.

    I think you should only be making new requests if the previous response has come back or it has timed out. The request would now need to include the time the last response was sent back from the server, to ensure the server knows how much of the log to send back.

  21. Daniele says:

    Is it possible to have a browser blinking after submitting a post?

  22. kottapallih says:

    It worked for me before , but now it’s not working . If I goto the page where that chat app is there ( on my website ) it is telling me ” Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator, webmaster@cinemaya360.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

    More information about this error may be available in the server error log.

    Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.”

    So , what should I do ?

  23. Ollie says:

    What is the file extensiton for the login page?

    • kottapallih says:

      It worked for me before , but now it’s not working . If I goto the page where that chat app is there ( on my website ) it is telling me ” Internal Server Error
      The server encountered an internal error or misconfiguration and was unable to complete your request.
      Please contact the server administrator, webmaster@cinemaya360.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.
      More information about this error may be available in the server error log.
      Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.”
      So , what should I do ?

  24. user1234 says:

    I am having problems with the code. I can’t run it using localhost. I am a beginner in programmig, please help me. Do I need to have a database for this one? Help, anyone?

  25. edward says:

    i understand the code but not how i open the text or file…

    how do i make it a chat ?

    its kinda hard it doesnt say in the end how to use this scripting …

    please help

  26. fattai says:

    PLS THE CODE IS NT WORKING FOR ME CAN SOMEONE HELP ME
    I WIL BE GREATFUL THNKS

  27. mohib says:

    nice tutorial,can i use this to make private chat with the author of a post..actually i want to create a private chat for classified ad author, so is this script can help me?

    I created gmail type chat box until now, but it does’nt make my requirement full fill.

    Waiting for reply

    Thank you,
    Mohib

  28. jorge says:

    God is good, and you do not know, but it helped a lot, God will reward this week.

  29. lekshmanan says:

    This is very useful and explain wonderfully

  30. Kumar says:

    I am new to php and got stuck in these codes.
    Please let me know where do I put the php code from step 3. Those who all have tried this example successfully, kindly tell me the file name to be given for each step mentioned above and if any modification(s) required.

    Thanks all in advance !

  31. Nico says:

    Very useful, Thanks

  32. Person says:

    Is there a way to clear the log.html file after a set interval so it doesn’t remain?

  33. Asua says:

    pls am usin ur tutorial to craate code an it giving an erro message. pls kindly help , below are the code create with the tutorial

    Chat – Customer Module

    Welcome,
    Exit Chat

    // jQuery Document
    $(document).ready(function(){
    //If user wants to end session
    $(“#exit”).click(function(){
    var exit = confirm(“Are you sure you want to end the session?”);
    if(exit==true){window.location = ‘index.php?logout=true’;}
    });
    //If user submits the form
    $(“#submitmsg”).click(function(){
    var clientmsg = $(“#usermsg”).val();
    $.post(“post.php”, {text: clientmsg});
    $(“#usermsg”).attr(“value”, “”);
    return false;
    });
    //Load the file containing the chat log
    function loadLog(){
    var oldscrollHeight = $(“#chatbox”).attr(“scrollHeight”) – 20; //Scroll height before the request
    $.ajax({
    url: “log.html”,
    cache: false,
    success: function(html){
    $(“#chatbox”).html(html); //Insert chat log into the #chatbox div

    //Auto-scroll
    var newscrollHeight = $(“#chatbox”).attr(“scrollHeight”) – 20; //Scroll height after the request
    if(newscrollHeight > oldscrollHeight){
    $(“#chatbox”).animate({ scrollTop: newscrollHeight }, ‘normal’); //Autoscroll to bottom of div
    }
    setInterval (loadLog, 2500); //Reload file every 2500 ms or x ms if you wish to change
    },
    });
    }

    });

  34. Asua says:

    the error message is this “Fatal error: Call to undefined function loginForm() in C:\wamp\www\index.php on line 9″

    Thanks

  35. Nico says:

    Hello,

    my chat works. But ä ö ü ß chairs => ü …

    need help

  36. aaar says:

    Not working scroll in chat with jQuery 1.7. How to fix?

  37. wisga says:

    i would like to add the :

    “(userxxx) is typing message…..”

    to the conversation while waiting another user complete his/her message , but i still have no idea what to do with the code… please help… :D

  38. kalpesh says:

    hi this code work not properly i want code for only chatting

  39. Parin says:

    Thnx for the help,im just 16year old now using ur clue i wil b future jukinberk….thnx alot

  40. José says:

    this code is a mess! Try downloading your own source code, follow your own instructions and see what you get. You are not being helpful to the community.

  41. Forest says:

    The server will have big problem, not being able to cope if everyone just request data from chat log every 2.5 second. Is there a way to request data from chat log only if someone post without using XMPP/jabber server? This will be more efficient.

  42. Forest says:

    The server will have big problem, not being able to cope if everyone just request data from chat log every 2.5 second. Is there a way to request data from chat log only if someone post without using XMPP/jabber server? This will be more efficient.

  43. Kyo says:

    there is no tag at first… bad tutorial..

  44. Stef says:

    Thanks, exactly what I was looking for!

  45. Albert says:

    I have a problem, i could insert the html code but when you go on css a cant do it on webs.com i think, help me and if you can see what i can do for insert the chat it could be rally good for me.

  46. Joe says:

    What an awesome tutorial this is; very in-depth and great learning source.

Comment Page 6 of 7 1 ... 4 5 6 7

Add a Comment

To add a code snippet to your comment, please wrap your code like so: <pre name="code" class="html">YOUR CODE</pre>. You can replace the class name with "js," "css," "sql," or "php." If there are any "<" or ">" within your code, please search and replace them with: &lt; and &gt; respectively.