27 Haziran 2008Ajax ile sayfa degişmeden belli aralıklarla veri çekmesi
Merhabalar yeniden yeniden yazı yazıyor olmak beni heyecanlandırdı
hani derler ya ilk gördüğüm zamandaki heyecan hala içimde benimki de öyle olsa gerek neyse komikliği bırakıp işimize bakalım.
Bir çoğumuzun başına gelebilecek bir konuya değinmek istiyorum. Sayfa değişmeden bir başka sayfadaki verileri belli aralıklarla istediğimiz alan içinde güncellememiz gerekebilir. Ben de bu durum için bir örnek vereceğim.
Örneğimiz istek.php dosyasına istek yapıp çıkan sonucu bizim istediğimiz alanda gösterecek. Örneğimiz php ve javascript frameworku olan jquery ve onun bir eklentisi jquery.timer i kullanacağız.
Öncelikle istek yapacağımız dosyamızı bir tanımlayalım.
istek.php dosya içeriğimiz aşağıdaki gibi olucaktır.
echo str_shuffle(uniqid(md5(mt_rand())));
istek dosyamız kendisine her istek yapıldığında uniq ( benzersiz ) bir md5 sum oluşturacaktır. str_shuffle() fonksiyonu ise oluşturulan md5 stringi karıştıracaktır ve en sonunda da echo ile elde ettiğimiz stringi ekrana yazıyoruz.
Şimdi ise sıra geldi isteği yapacak olan sayfamızı yapmaya. İsteği yapacak olan sayfamız bir adet javascript fonksiyondan oluşacak. Bu fonksiyon ajax yöntemi kullanarak istek.php ye istek yapıp dönen sonucu almamızı sağlıcak.
index.php:
<html> <head> <title>Ajax ile Refresh:: www.ysfkc.com</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src="jquery.js" type="text/javascript"></script> <script src="jquery.timer.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function () { $.timer(3000,function() { a(); }); }); function a() { $.ajax({ type:'GET', url:'istek.php', success: function (msg) { $('div#adi').html(msg); } }); } </script> </head> <body> <div id="adi">Mesaj Güncellencek Bekleyiniz...</div> </body> </html>
isteği yapacak olan index dosyamızıda bitirdik. İşlemlerden bahsedelim.
<script src="jquery.js" type="text/javascript"></script> <script src="jquery.timer.js" type="text/javascript"></script>
satırları ile javascript kütüphanemizi ve onun eklentisini sayfamıza dahil ediyoruz. Ardından
$(document).ready(function () { $.timer(3000,function() { a(); }); });
kısmı ile jquery nin sayfa yüklendiğin de çalışmasını sağlayacak olan document.ready özelliğini kullanarak tetiklenmesi gereken metodlarımızı belirtiyoruz. burda $.time() fonksiyonu jquer.timer.js den gelmektedir. kullanımı ise $.timer(süre,function) şeklindedir. Biz burada kendimizin tanımlamış olduğumuz a() fonksiyonunu her 3 saniye de bir tetikle şeklinde bir ifade belirttik.
function a() { $.ajax({ type:'GET', url:'istek.php', success: function (msg) { $('div#adi').html(msg); } }); }
a() isimli fonksiyonumuzda ise jquery kütüphanesinin ajax metodu kullandık. Aldığı metodları bir gözden geçirelim kısaca
type: Ajaxın istek yapacağı method. GET ya da POST
url: Ajaxın istek yapacagı sayfa url si
success: Ajaxın tamamlandığında tetiklenecek işlemlerimizi burada belirtiyoruz. buradaki msg istek sonucunda dönen veri msg ye aktarılıyor.
Evet arkadaşlar göründüğü üzere çok basit 1 fonksiyonla sayfamız değişmeden bir başka sayfadaki verileri belli saniye aralıkları ile yenileyerek alabiliyoruz.
Kullandığımız örneğimize buradan bakabilir ve buradan da indirebilirsiniz.


bu jquery.timer.js’yi nerden indiriyoruz bulamadım ben
Aşağıdaki Linkte örneğimizin dosyaları mevcut indirip bakabilirsiniz.
http://www.ysfkc.com/dosyalar/ajax.tar.gz
peki şöyle birşeyi nasıl yapabiliriz? istek.php sayfasında rand(1,10) olsun sadece. Eğer istek.php’den gelen değer 10 olursa sayfa yenilenmesin. ajaxla çektiğimiz sayfanın değerine göre sayfamızdaki js kodlarını şekillendirebilirmiyiz?
ajax ın durdurma fonksiyonu abort u inceleyebilirsin mehmet.
abort uda bulamadım ben.jquery kütüphanesinin bi özelliğimi?
vede ben bu kütüphaneyi kullanmak istemiyorum.kendi işime yarayacak kadar bi ajax fonksiyonum var ama onuda “setTimeout(‘fonkisyon()’,15000);” kullanarak çalıştıramıyorum.niye olmuyor? jquery kütüphanesini inceliyorum, hiçbirşey anlamıyorum
aşağıdaki linkteki bilgileri araştırabilirsiniz.
http://docs.jquery.com/Ajax/ajaxStop#callback
ama sanırım bu benim istediğim şey değil. istek.php’den gelen bi değere göre ajax scriptlerinde işlem yaptırmak istiyorum.dediğim gibi istek.php’de sadece rand(1,10) olsun, eğer gelen değer 10 ise tekrar etmekten vazgeçsin.Bu değeri nasıl js kodlarında işleme sokabilirim.
istek.php nin en altına;
$(document).ready(function () {
$.timer(3000,function() {
a();
});
});
fonksiyonunu iptal ettiren bir kod lazım sanırım…
a() fonksiyonunu silip dediğim şekilde düzenleme yaparsanız istediğiniz olacaktır.
if (msg == 1) bu satırda eğer dönen mesaj 1 ise timer olayını stop ediyorum siz artık oraya kendi özel değerinizi belirtirsiniz.
hazıra konmaya çalışmıyorum.deniyorum gerçekten ama bulamıyotum hiçbirşey..
benim istek.php’den gelen değerim çok fazla ama içine $deger = 1; dedim buna göre yapmam gerek.js içine php değişkenini nasıl koyabilirim?
[...] merak etti
teşekkürler Yusuf KOÇ güzel ve anlaşılır bi döküman olmuş, ama artık içinde ilk günkü heycan kalmadı heralde ?
@serkan
yoğun iş temposu ve bayram tatilinin araya girmesi etkiledi biraz..
Şimdi bunu çalıştırdım ancak şimdi sürekli yenileniyor mu yoksa veri güncellendiği zaman mı yenileniyor.Örneğin ben veritabanından çekiyorum bilgiyi yönetici onayı geldiğinde yenilenmesini istiyorum yani bunu nasıl yapabilirim??
Belirttiğiniz süre içerisinde sürekli yenilemektedir.
Tam olarak istediğim bu değil yani belirlediğim sürede sürekli yenilenmesini istemiyorum, veritabanında değişiklik olduğu zaman bu kodun çalışması için ne yapmalıyım ?
Örneğin;
ben yorum yazdım buray sizde onayladınız yönetim panelinden ben sayfadan çıkmadan ve yenilemeden yorumum otamatik olarak onaylanmış olarak gözükecek.
Bu anlattığım bir örnek bunun gibi birşey istiyorum, yardımlarınız için teşekkürler!
@NetHaLiL
bunun için ajax a gerek yok örneğin yorumlarınızın kontrolünü yaparak onaylayan bir php betiği yazıldıktan sonra cronjob ile bu yazılan betik belli zaman aralıkları ile sunucuya otomatik çalıştırılıp yeni eklenen bir yorum var ise onu update ederek onaylı hale getirilir.
Öncelikle cronjob hakkında bilgi edinmeniz gerekiyor. Google de cronjob diye aratırsanız bilgilere ulaşabilirsiniz..
bunun moontools la çalışanı lazım :/
@serkan’cım
mootools timer diye bak mutlaka vardır
Merhaba,
Kod işime yaradı. Amacım belirlediğim div içini belli aralıklar ile yenilemekti. 2 gündür arıyordum, bişe yarar olarak birtek bunu bulabildim. Teşekkür ederim.
Kodla alakalı olarak birşey sormak istiyorum. Cevaplarsanız memnun olurum. Bu kod çeşitli hack olaylarına neden olabilir mi ?
Aklıma takıldı emin olmak için sormak istiyorum.
type:’GET’,
url:’istek.php’,
metodu ile istek gönderiyoruz. Burasının get olması kötü niyetli kişiler tarafından kullanılarak farklı sayfalar çağırtılabilir mi ? Çünkü çekeceğim veri mysql’den veri çekmekte.
@ilker
methodun GET ya da POST olması birşey farketmez ikisi de istenildiği anda aşılabilen şeylerdir. Bunun için sizin php kısmında gerekli filtrelemeleri yapmanız gerekmekte. Sonuç itibari ile ziyaretçiden alınan her bilginin gerekli filtrelerden geçirilerek işleme alınması gerekir.
İlginize teşekkür ederim. Galiba sorumu tam olarak anlatamadım.
Verinin yenileceği yerde (istem.php)’e herhangi bir get, post göndermiyorum. Yukarıdan anlatmış olduğunuz ajax üzerinden bu işlem yapılabilir kötü niyetli kişiler tarafından bir işlem yapılabilir mi ?
Yani bu ajax kodları bir açık oluşturur mu ?
@ilker
yok eğer dışardan veri almıyorsan ( GET, POST ) herhangi bir açık oluşturmaz.
Raiden ilginize çok teşekkür ederim,
Başarılarınızın devamnı dilerim.
Kolay gelsin.
teşekkürler işime yaradı tebrikler
kardeş, ben senin
success: function (msg) {
$(‘div#adi’).html(msg);
if (msg == 1) timer.stop(); <<<<<<<<<<
yazdığın yeri
success: function (msg) {
$('div#adi').html(msg);
timer.restart(); <<<<<<<<<<<<<
yaptım.
sence bu şekilde sayfayımı yeniler yoksa varolan veriyimi yeniler?
neden yaptım??
çünkü bir sayfada durmadan veriler değişiyor. bende o verileri göstermek istiyorum. ancak senin yazmış olduğun kodlarda sayfayı elle yenilesemde hep ilk baştaki veri çıkıyordu. yani yeni veri görünmüyordu.
sence bu şekilde, insanların sayfayı kullanması problemli olurmu???
mail adresime cevabını yazarsan sevinirim. teşekkür ederim
timer pluginin restart diye bir parametresi yoktu diye hatırlıyorum… eğer varsada heralde dediğiniz yapar..
hocam bunu bir baska sitedeki sayfayi cekmek icin nasil kullanabiliriz ??
belirtilen bir butona tiklayarak belirtilen urldeki sayfayi oanki sayfaya nasil cekebiliriz ?
@kuaza
cross domain olarak çalışmadığı için 2 aşamada yapcaksın önce istediğin sayfayi okuyup ekrana bascaksın sonrada ajax ile kendi sayfana gidip getirceksin.
Teşekkürler Yusuf bey güzel bir çalışma
teşekkürler. güzel çalışma olmuş.
Öncelikle makaleniz için teşekkürler benim sorunum ve uzun bir süredir çözemediğim bana kafayı yedirtme noktasına gelen bir sorun ben daha önce jquery in window.setInterval medhoduylada ekrana yazdırdığım buna benzer bir örnektede aynı sorunu yaşadım bi türlü çözemedim.
Makeladeki örneği uyguladım,
Sorunumu şöyle açıklayayım default.asp de bir div ‘in içeriğini listele.asp den çekiyorum ve bu div 1 saniyede bir yenileniyor.
Bu işlem Google Chrome’da sorunsuz gerçekleşiyor.İnternet Explorer ‘da default.asp’yi açtığımda bilgiler listeleniyor ama listele.asp güncellendiğinde(veri tabanına yeni veri eklendiğinde) bu default.asp ye yansımıyor ancak yeni sekmede listele.asp yi açıp F5 le sayfayı yenileyip tekrardan default.asp sekmesine tıklayınca yeni veri gelmiş oluyor. Bu sorunumu nasıl çözebilirim.Yardımlarınız için şimdiden teşekkürler.
@öner
bunun için jquery livequery kullan. Internet explorer bir defaya mahsus yapıp sanırım cache ediyor ve bi daha yenilemiyor. Ya da işe yararmı bilmiyorum ama istek yaptığın listele.asp ye random query stringler göndererek dene.
evet büyük ihtimalle cache ediyor yoksa yeni sekmede açıp yenile diyincede düzelmemesi lazım ben livequery i bi araştırıyım ve ayrıca hemen yanıt verdiniz için teşekkürler
livequery kütüphanesini indirdim ama makaledeki örneğe uygulayamadım yardımcı olabilirmisiniz.
@öner
sanırım aşağıdaki gibi olacak..
Malesef işe yaramadı
http://groups.google.com/group/jquery-turkish/browse_thread/thread/8fa35da3e4e47c89
bu adreste bi kaç yöntem var
type:’GET’,
cache: false,
bunu denedim ama olmadı.Biliyorum sizide uraştırıyorum ama çok önemli benim için
yenilenen sayfanin icine su kodlari yerlestirin problem cozulur sanirsam.
ASP:
PHP:
header(“Cache-Control: no-cache”);
yorumda asp taglari arasindaki kisimlar gozukmuyodu tekrardan yaziyorum
Response.CacheControl = “no-cache”
Response.AddHeader “Pragma”, “no-cache”
Response.Expires = -1
Response.Expires = -1 kodunu eklemem yeterli oldu çok teşekkür ederim büyük sevaba girdiniz kaç gündür arıyordum bulamamıştım
konuyu açan arkadaşa teşekkürler.. şimdi bende deniycem
arkadaşlar kodlar çalışıyor ama türkçe karakterleri desteklemiyor ne yapmamız lazım
olmadı… aslında benim tam olarak yapmaya çalıştığım şey şu.. chat programı yazdım phpden ben yazı yazdığımda mysqle ekleniyor ve karşı tarafın sayfası yenilenmeden karşı tafaf yazdıklarımı göremiyor.. benim istediğim karşı taraftaki sayfanın değilde yazıların gözüktüğü div alanının sürekli yenilenmesi veya başka bir çözüm yolu var mı?
bilen arkadaş acil yardımcı olursa sevinirim dünden beri araştırıyorum işe yarayan bir kod bulamadım.. en sonunda java derslerine başlıycam..
Şuna inanın; Her ne konuda olursa olsun sizin gibi bilgiyi paylaşmakta tereddütsüz insanlar, bu ülkenin geleceğini karanlıklardan arındıracak mucize varlıklardır.
ff, opera, chrome ve safari’de problem yok ama ie de yenilemiyor :S yazık ki ie de önemli bir browser… yukarıdaki yöntemlerin hepsini denedim fakat çalışmıyor bir türlü. Bana da bir önerisi olan var mı?
random query string göndererek deneyin veya istek yaptığınız sayfa da cache olayını header başlıkları ile kapatın.
Raiden teşekkür ederim. Bir sitede kullanmak üzere benzer bir özellik ararken rastladım.
IE de sorun yaşayan arkadaşlar istek.php’nin ilk satırına
header(“Cache-Control: no-cache”); ‘ekleyin. Sorun gidecektir.
Yani istek.php şu şekilde olsun ;
Ya da ;
IE 7 ve 8 de, FF, Opera, Chrome ve Safari’de sorunsuz bu şekilde çalışmaktadır.
Bir üst mesajda örnek istek.php’ler çıkmamış. Tekrar yazıyorum.
Yani istek.php şu şekilde olsun ;
Ya da ;
Php taglarını açıp kapatmayı unutmayın.
< ?php
header("Cache-Control: no-cache");
echo str_shuffle(uniqid(md5(mt_rand())));
?>
Ya da;
< ?php header("Cache-Control: no-cache");
echo rand();
?>
Php taglarını açıp kapatmayı unutmayın.
Yeter artık bu yazdığımı kabul etsin.
ya dostum cok sağol ama anlamadım ben hiç birşey yenileme yapmıyor aynı sayı duruyo ben 500 yaptım yani 0.5 sadisede bir güncelleme yap diye ama olmuyor yardım edebilirmisin
dostum bak firefox calışıyor ama ie calışmıyor bu yardım edebilirmisn
sayfa yenilenmeden belirli aralıklarla databaseden veri çekilmesi olayını jsp ile nasıl yapabilirim. Acil yardımcı olabilirseniz sevinirim. Örnek bir kod filan varsa ve yollayabilirseniz çok iyi olur. İyi çalışmalar.
jsp bilmiyorum lakin aynı mantık bunda da geçerlidir.
İçerik güncellememe probleminden ben de muzdaribim.yazılan tüm yolları denedim ama maalesef ie de çalışmıyor.Problemi çözen varsa yardımlarını bekliyoruzz…
Selam bunu kurdum, ama bir sorum var bu script hosta çok yüklenirmi, yani Hosta aşırı CPU yaparmı, eğer yaparsa, scripti 10 saniyeye ayarladıkdan sonra 9 cu saniyede kendisini Stoplasın, sayfa her yenilenmede scrip çalışır ve 9 saniyede durur bunu nasıl yapabilirim, teşekürler şimdikden yardımlarınız için
paylaşım için teşekkürler