Ajax ile Basit Sohbet Sayfası

27 Ocak 2006 tarihli, Ajax, Programlama köşesine ait yazı.

AjaxBu aralar pek moda Ajax kullanmak. Çok sevdiğim mad4milk grubunun da Ajax için bir class yazdığını öğrendiğimde, ayrıca sayın Onur Köse’nin sitesini gezdikten ve Ajax yazısını okuduktan sonra daha bir heveslenip ilk denememi yaptım.

Neler Gerekli?

  • Prototype .js kodu - burada
  • moo.ajax kodu - burada
  • Biraz mysql bilgisi (tablo yaratabilecek, php kodu içinde sorgulayabilecek kadar-daha ne kaldı?!)
  • Ajax’ın ne olduğu hakkında bilgi (girişteki bağlantıyı kullanabilirsiniz)
  • Denemek için apache, php ve mysql yüklü bilgisayar

Veritabanımızı Kuralım

Tabii önce neler yapmak istediğimizi bir düşünmemiz lazım. Basitçe sistemimiz kullanıcı ilk giriş yaptığında ismini alıp bir users tablosuna eklemesi lazım. Farklı kullanıcıların aynı isimle ve/veya IP adresiyle giriş yapabilecek olup olmamasını şimdilik önemsemiyoruz. Onun için bize lazım olan kullanıcı adı (name) ve birazdan kullanacağımız bilgileri son aldığı tarih (lastcheck). Şu şekilde veritabanımızı ve users tablomuzu oluşturabiliriz:

CREATE DATABASE msgdb

CREATE TABLE users (
name tinytext NOT NULL,
lastcheck int(10) unsigned NOT NULL default ‘0′,
PRIMARY KEY (name)
)

Bunun yanında kullanıcılardan gelen mesajları tutacağımız başka bir tablomuz olması lazım. Mesajın içeriği (text), kimden geldiği (from) ve ne zaman geldiği (date) gerekli özellikler.

CREATE TABLE msgs (
msgid int(10) unsigned NOT NULL auto_increment,
`text` text NOT NULL,
`date` int(15) NOT NULL default ‘0′,
`from` tinytext NOT NULL,
PRIMARY KEY (msgid)
)

Veritabanımızı sorunsuz yarattıysak biraz Ajax işlerine bakalım…

moo.ajax Nesnesi

Prototype veya prototype.lite nesnelerine bağımlı çalışan moo.ajax nesnesi bizim için çoğu işi kolaylaştırıyor. Bir ajax isteği oluşturmak için tek yapmamız gereken javascript kodumuza

new ajax(url, {options});

eklemek. Biraz açıklamak gerekirse:

  • url: İsteği yapacağımız dosya, muhtemelen bir .php dosyası
  • postBody: options içinde tanımlanır, istek dosyasına göndereceğimiz parametreleri belirtir. Örnek ‘isim=Onur&status=2′
  • method: post ya da get olarak tanımlanabilir. Varsayılan posttur.
  • onComplete: İstek tamamlandığında çağırılacak javascript fonksiyonudur. Dönen değer fonksiyona request parametresiyle yollanır.
  • update: Dönen değerin bir DOM nesnesine atanmasını sağlayabilirsiniz.

Veritabanı bağlantısı

Veritabanı bağlantısını db.php dosyasında yapıp kullanacağımız yerlere include("db.php"); ekliyoruz. Dosyanın içeriği şöyle:

<?
$dbhost=’localhost’;
$dbuser=’root’;
$dbpass=”;
$dbname=’msgdb’;
$connection = @mysql_connect($dbhost, $dbuser, $dbpass)
or die (”DB Error”);
$db = @mysql_select_db($dbname, $connection)
or die (”DB Error”);
?>

Giriş sayfası - index.php

index.php sayfasında yalnızca kullanıcının ismini sorup login.php sayfasına yönlendiriyoruz:

<?php include(”db.php”); ?>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-9″ />
<title>Mesaj Sayfası</title>
</head>
<body>
Lütfen isminizi girin:<br />
<form method=”get” action=”login.php”>
<input type=”text” name=”isim” id=”isim” size=”30″ />
</form>
</body>
</html>

send.php

send.php olarak kaydedeceğimiz sayfayı her mesaj gönderdiğimizde Ajax yardımıyla çağıracağız.

<?php
include(”db.php”);
$user=$HTTP_POST_VARS[’user’];
$msg=$HTTP_POST_VARS[’msg’];
mysql_query(”INSERT INTO msgs VALUES (”,’$msg’,'”.time().”‘,’$user’)”);
?>

online.php

Programımızın, verilen zaman kadar bekleyip çevrimiçi kullanıcıları sohbet sayfamıza bildiren kısmıdır. Kullanıcılar listenin elemanları olarak gönderilirler.

<?php
sleep($HTTP_POST_VARS[’sleep’]);
include(”db.php”);
$msg_query = mysql_query(”SELECT * FROM users”);
$retval = “”;
if(mysql_numrows($msg_query)>0) {
while($msg = mysql_fetch_array($msg_query)){
$retval .= “<li><strong>”.$msg[’name’].”</strong></li>\n”;
}
}
echo $retval;
?>

check.php

Yeni bir mesaj var mı diye kontrol ettiğimiz dosyadır. Girişte çevrimdışı olan kullanıcıları ve üzerinden 2dk geçmiş mesajları tablolardan temizler. Sonra kullanıcının en son ne zaman mesajları kontrol ettiğini öğrenir. Bu zamandan sonraki mesajları seçip yine liste elemanları şeklinde gönderir.

<?php
sleep($HTTP_POST_VARS[’sleep’]);
include(”db.php”);
$user=$HTTP_POST_VARS[’user’];
$timeout = time() - 30; // 30 saniyede timeout
$delete = mysql_query(”DELETE FROM users WHERE lastcheck<$timeout”);
$timeout -= 90; // 2 dakika önce gönderilen mesajları temizle
$delete = mysql_query(”DELETE FROM msgs WHERE date<$timeout”);

$lastcheck_query = mysql_query(”SELECT lastcheck FROM users WHERE name=’$user’”);
$lastcheck = mysql_fetch_array($lastcheck_query);
$lastcheck = $lastcheck[’lastcheck’];
mysql_query(”UPDATE users SET lastcheck=’”.time().”‘ WHERE name=’$user’”);

$msg_query = mysql_query(”SELECT * FROM msgs WHERE date>$lastcheck ORDER BY date ASC”);
$retval = “”;
if(mysql_numrows($msg_query)>0) {
while($msg = mysql_fetch_array($msg_query)){
$retval .= “<li><strong>$msg[from]:</strong> $msg[text]</li>\n”;
$lastcheck=$msg[’date’];
}
mysql_query(”UPDATE users SET lastcheck=’$lastcheck’ WHERE name=’$user’”);
}
echo $retval;
?>

login.php

Bu sayfa giriş sayfasından sonra yüklenir ve tüm mesajlaşma olaylarını kontrol eder. Bölüm bölüm gitmek gerekirse, öncelikle veritabanı bağlantısını yapıp giriş yapan kullanıcıyı users tablosuna eklememiz gerekiyor:

<?php include(”db.php”);
$user=$HTTP_GET_VARS[’isim’];
$insert = mysql_query(”INSERT INTO users VALUES (’$user’,'”.time().”‘)”);
?>

Daha sonra sayfa header’ını ve stilleri tanımlamamız, .js dosyalarını eklememiz ve Ajax kodlarını yazmamız gerekiyor.

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-9″ />
<title>Mesaj Sayfası > <?=$user?></title>

/* Javascript Tanımlamaları */
<script type=”text/javascript” src=”prototype.js”></script>
<script type=”text/javascript” src=”moo.ajax.js”></script>

/* Kullanacağımız Ajax fonksiyonları */
<script type=”text/javascript”>
function parse(request){
new Insertion.Bottom(’msglist’, request.responseText);
new ajax(’check.php’, {postBody: ’sleep=5&user=<?=$user?>’, onComplete: parse});
}
function online(request){
Element.update(’onlineusers’, request.responseText);
new ajax(’online.php’, {postBody: ’sleep=10′, onComplete: online});
}
window.onload = function(){
new ajax(’send.php’, {postBody: ‘user=AcikBilgi&msg=<?=$user?> odaya giris yapti’, onComplete: clear});
new ajax(’check.php’, {postBody: ’sleep=0&user=<?=$user?>’, onComplete: parse});
new ajax(’online.php’, {postBody: ’sleep=0′, onComplete: online});
Element.hide(’statusContainer’);
}
function send(){
$(’statusMsg’).innerHTML = “Gönderiliyor…”;
Element.show(’statusContainer’);
new ajax(’send.php’, {postBody: ‘user=<?=$user?>&msg=’+$F(’msg’), onComplete: clear});
}
function clear(){
Element.hide(’statusContainer’);
Field.clear(’msg’);
}
</script>

/* Stil tanımlamaları */
<style type=”text/css” media=”screen”>
#page {
width: 600px;
margin: 0 auto 0 auto;
position: relative;
border: 1px solid #EAEAEA;
font-family: Verdana, Arial, sans;
font-size: 0.8em;
}
#online {
background-color: #eeeeee;
width: 150px;
padding: 0px 10px 10px 10px;
float:right;
}
#online h2 {
font-size: 12px;
}
.statusContainer {
background-color: #ffd363;
width: 100px;
}
span.statusMsg {
font-family: Verdana;
font-size: 11px;
font-weight: bold;
margin: 2px 6px;
}
ul {
list-style: none;
}
</style>
</head>

Dosyanın geri kalan kısmında ise dokümanın body’si var. Dikkat ederseniz listelerin içleri boş.

<body>
<div id=”page”>
<div id=”online”>
<h2>Online Kişiler</h2>
<ul id=”onlineusers”>

</ul>
</div>
<ul id=”msglist”>

</ul>
<br />
<form name=”msgform” id=”msgform” method=”get” action=”" onsubmit=”javascript:send(); return false;”>
<input type=”text” name=”msg” id=”msg” size=”60″ />
</form>
<div id=”statusContainer” class=”statusContainer”>
<span class=”statusMsg” id=”statusMsg”>Yükleniyor…</span>
</div>
</div>
</body>
</html>

Sonuç?

Çok basit, çok üstünkörü bir Ajax uygulaması yapmış oldum. Farklı sekmelerde kendi kendime yaptığım sohbetten bir görüntüyü koymayı ihmal etmiyorum.
Ajax Sohbet Programı

Kaynaklar



Yorumlar - Başa Dön

slay3r
3 Şubat 2006

Eline sağlık, güzel bir örnek oldu. delicious’daki hesabıma bu sayfayı ekledim. :^D Birde çalışan halini görebilseydik güzel olacaktı.

Onur
3 Şubat 2006

Ya güzel olurdu tabii ki ama maalesef çoğu host gibi benimki de rails çalıştırmama izin vermiyor. Kodu direkt kopyalarsanız çalışır, demek isterim ama garanti veremem, hem tavsiye de etmem. Mantığını anlayıp kendiniz basit ToDoList veya Blog tarzı uygulamalar geliştirirseniz çok daha yararlı olacaktır.

muhammet boztepe
7 Şubat 2006

çok iti bir sohbet aği hep böyle anması tileğiyle

Faruk
7 Mart 2006

üstad, elinize sağlık. çok hoş bir makale. onurun yazısından sonra php ile ilintili bir yazı çok iyi oldu. tebrik ediyorum.

gokhan
19 Haziran 2006

selam
Benim html de sohbet sayfası yapmam lazım.acilen bunu yapmak zorundayım okulu bıtırebılmem için ama bu konuda hiç bir bilgim yok sizin yardımlarınızı beklıyorum.tşk.

esra
3 Temmuz 2006

selam
Benim html veya php de sohbet sayfası yapmam lazım.acilen bunu yapmak zorundayım okulu bıtırebılmem için ama bu konuda hiç bir bilgim yok sizin yardımlarınızı beklıyorum.tşk.

Onur
3 Temmuz 2006

Sanırım okulu bitirebilmeniz için bunları öğrenip kendi uygulamanızı yazmanız en iyi yöntem olacaktır. Size yol göstermesi açısından php ve js ile çalışan, database’e ihtiyaç duymayan, çok basit bir shoutbox önerebilirim: YShout. Kolaylıklar…

deniz
5 Kasım 2006

merhaba
yeni yeni ajax öğreniyorum ve örneğinize ihtiyacım var yapmayı denedim olmadı bana yapılmış olarak bu örneği gönderebilirseniz yada biryere link olarak verebilirseniz çok sevinirim
teşekkürler

Bahadır
10 Kasım 2006

Bende örneği denedim. Eğer direkt olarak copy-paste yaptıysan tırnaklar işaretleri sorun çıkartıyor bunları düzeltmen lazım. Ayrıca veri tabanınıda kodla değil elle yapmanı öneririm

Emre
21 Aralık 2006

merhaba arkadaşlar. tamamını ajax ile yaptığım siteye bir de chat sayfası koymak istiyordum. buradaki örneği incelemeye çalıştım. acak hatalarla karşılaştım. sanırım sorun tırnaklarda. ama tek tek baktım. bi türlü kağnağını bulamadım. sizden bi ricam olacak. bana bu scriptın tırları düzeltilmiş bir biçimde(:D) emrekayit@yahoo.com adresine gönderirseniz sevinirim. şimdiden teşekkürler.

emre
6 Ekim 2007

çok sağolun demek isterdim ama gerçekden çalışmıyor hep ” ve ‘ karakterlerinin yanlış süzülmesi yüzünden olmuş onları ben düzelttim ama yinede çalışmadı … çalışan örneği mailime atarsanız sevinirim… qhostemre@hotmail.com

tekingun
18 Kasım 2007

merhaba diğer arkadaşlarla yanı kanıdayım baya düzeltme yaptım amam kod yinede
çalışmada bencede düzelttikten sonra site upload edip o şekilde örnek kodlar yayınlarsan seviniriz
tekrar teşk.

sevil
14 Ocak 2008

selam
bu yazdığınız uygulamanın tek kişiyle yani anlatayım.üye girişi yaptıktan sonra üyeleri aratıp buluyorum.istediğim üyenin sayfasındaki bir butona tıklayınca sadece onunla sohbet etmek istiyorum.siberalem.com da var.bu istediğim tarzda sohbet yazılımı varmı?

seyran
22 Haziran 2008

innerHTML ile yazdıramıyorum. div alanında tıkladıgımda gönderiliyor yazmıyor.

Bodrum Otel
7 Ağustos 2008

merhaba

teşekkürler çok güzel bir bilgi… elinize sağlık



Yorum Yazın

(gerekli)

(gerekli)


Yorum yapacaklar için bilgi:
Verdiğiniz mail adresi sitede asla görüntülenmeyecektir. Sonraki yorumlarınız için isim, e-posta gibi bilgiler cookie olarak bilgisayarınızda saklanacaktır.



Önizleme: