Online Kullanıcıları ve Hangi Sayfalarda Olduklarını Gösterme

Eğer bu konu hakkında araştırma yaparsanız online üyeleri gösterirken genelde global.asa veya global.asax kullanıldığını görürsünüz, fakat sitedeki online kullanıcı sayısı arttıkça bu methot sapıtabiliyor, hatta biliyor değil sapıtıyor. Anlatmaya çalışacağım mantıkta gerçeğe yakın bir sonuç alacağız. Üstelik çokda basit, nederedeyse sadece SQL ile bu işin üstesinden geleceğiz. Bu yöntemi ASP, PHP, ASP.NET ve benzeri dillerde kullanmak mümkün. Ben ASP.Net ile bu olayı göstereceğim.

Hemen mantığı anlatayım, kullanıcı sayfamıza girdiğinde, o ip adresinin daha önce gelip gelmediğine bakıyoruz, eğer hiç gelmemiş ise veritabanımıza o ip li kullanıcının istediğimiz bilgilerini ve bulunduğu zamana 10 dakika artırarak ekliyoruz. Burdaki ince noktamız işte burası ! Eğer ip adresi veritabanımızda kayıtlıysa bu sefer kaydı güncelliyoruz. Bulunduğumuz zamana 10 dakika eklememizin sebebi şu; kullanıcı herhangi bir sayfayı ziyaret ettiğinde o sayfada bir süre bekleyecektir, bu yüzde 10 dakikalık bir karşılaştırmayla o an sitedemi değilmiyi bulabileceğiz. Siz bu süreyi istediğiniz gibi değiştirebilirsiniz. Aşşağıdaki örnekte ben web.config dosyamdaki connectionstring i kullandım. Gerekli değişikliği yapmayı unutmayın. Aklıma gelmişken burada anlattığım sql ile tarih işlemlerini burada kullanıyoruz. Benim verdiğim örnekte online üyeleri değilde IP adresinin karşısındaki kullanıcı hangi sayfada geziniyor bilgisini alabilirsiniz, eğer bir üyelik sisteminiz varsa, veritabanına uyeid adında bir alan açıp buraya sessionda tuttuğunuz bilgiyi yazıp, hangi üyenin hangi sayfalarda gezindiğinide bulabilirsiniz.

protected void online() {
SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["baglanti"].ToString());
conn.Open();
string ipadresi = HttpContext.Current.Request.UserHostAddress.ToString();
string adres = Request.Url.ToString();
SqlCommand aktifkullanicilar = new SqlCommand("if exists(select ind from onlineziyaretciler where ip = '" + ipadresi + ") "' +
"update onlineziyaretciler set zaman = DATEADD(mi, 10, getdate()), url='" + adres + "' where ip = '" + ipadresi + "' " +
"else " +
"insert into onlineziyaretciler (zaman,ip,url) values(DATEADD(mi, 10, getdate()),'" + ipadresi + "','" + adres + "') " +
"", conn);
aktifkullanicilar.ExecuteNonQuery();
conn.Close();
conn.Dispose();
}

Tablomuz;

CREATE TABLE [dbo].[onlineziyaretciler] (
[ind] int IDENTITY(1, 1) NOT NULL,
[zaman] datetime NULL,
[ip] nvarchar(50) COLLATE Turkish_CI_AS NULL,
[url] nvarchar(300) COLLATE Turkish_CI_AS NULL,
)
ON [PRIMARY]
GO

Geldik kullanıcılarımızı listelemeye, veritabanına 10 dakika arttırarak eklediğimiz zaman bilgisini, şuandaki zamanla karşılaştırıyoruz, eğer veritabanımızdaki zaman şu anki zamandan büyükse demekki kullanıcı sitede ! SQL cümlemizi yazıp bu kayıtları listeliyoruz. Ben kayıtları GridView1 içine doldurup, kayıt sayısınıda Label1 e yazdım, siz istediğiniz gibi şekillendirebilirsiniz. 2 Sql cümlesiyle saat gibi çalışan bir mekanızma yaptık. Anlamadığınız yer olursa çekindemeden sorabilirsiniz.

private void onlinekullanicilar()
{
SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["baglanti"].ToString());
conn.Open();
SqlDataAdapter sqlAdap = new SqlDataAdapter("Select * from onlineziyaretciler WHERE zaman > getdate() order by zaman desc", conn);
DataTable Ds = new DataTable();
sqlAdap.Fill(Ds);
GridView1.DataSource = Ds;
GridView1.DataBind();
conn.Close();
Label1.Text = "Toplam "+GridView1.Rows.Count.ToString() +" Kullanıcı sitede geziniyor.";
}