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.";
}

ASP.NET ile Resim Boyutlandırma

Weble uğraşıpta resimlerle uğraşmayan kimse yokdur herhalde. Resmi upload et, sitenin tasarımında kullanılacak yerlere göre boyutlandır vs.. ASP.NET C# ile bu işlemi farklı bir methodla nasıl çözebilirizi anlatmaya çalışacağım. Bu mekanızmada sadece orjinal resmi upload ediyoruz ve görüntülemek istediğiniz yere göre boyutlandırıp çağırabiliyorsunuz. Bunu klasik ASP de PHP de yapmak da mümkün.

ResimBoyutlandir.aspx adında bir sayfa oluşturuyoruz ve ResimBoyutlandir.aspx.cs dosyamızın içine aşşağıdaki kodları yazıyoruz.

using System;
using System.Drawing.Imaging;
using System.Drawing;
using System.Drawing.Drawing2D;

public partial class ResimBoyutlandir : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
resimboyutlandir();
}
}

protected void resimboyutlandir() {
int yeniW = Convert.ToInt16(Request.QueryString["Genislik"]); // küçülteceğimiz genişlik değerini alıyoruz.
string gelenResim = Request.QueryString["ResimAdi"]; //resim adını alıyoruz.
string Klasor = "Resimler/Urunler/" + gelenResim; // Resimlerin bulunduğu klasörü gösteriyoruz.
Image imgPhotoVert = Image.FromFile(Server.MapPath(Klasor));
Image imgPhoto = null;
imgPhoto = ResimBoyutlandir(imgPhotoVert, yeniW); //ScaleByPercent adlı mekanızmaya yolluyoruz aldığımız bilgileri.
imgPhoto.Save(Response.OutputStream, ImageFormat.Jpeg); // Ekrana basıyoruz..
imgPhoto.Dispose();
}

static Image ResimBoyutlandir(Image imgPhoto, int Yukseklik)
{
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;

int destWidth = Yukseklik;
int destHeight = sourceHeight * Yukseklik / imgPhoto.Width; //resmin bozulmaması için en boy ayarını veriyoruz.

Bitmap bmPhoto = new Bitmap(destWidth, destHeight,PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,imgPhoto.VerticalResolution);

Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; // resmin kalitesini ayarlıyoruz. Burada InterpolationMode özelliklerini bulabilirsiniz.
grPhoto.FillRectangle(Brushes.White, 0, 0, destWidth, destHeight);

grPhoto.DrawImage(imgPhoto,new Rectangle(0, 0, destWidth, destHeight),new Rectangle(0, 0, sourceWidth, sourceHeight),GraphicsUnit.Pixel);

grPhoto.Dispose();
return bmPhoto;
}
}

Şimdi geldik nasıl kullanacağımıza,
<img src=”ResimBoyutlandir.aspx?ResimAdi=boyutlanacakresim.jpg&Genislik=200″ /> Genişlik PX cinsindendir, bu kadar basit. Bu arada resim küçüldüğünde boyutuda küçülüyor. Yani yüklendiğinde 500KB olan 1000px çözünürlüğündeki bir resmi biz ekrana 100px olarak bastığımızda, örnek veriyorum boyutuda 10kb’ ye düşüyor.

ASP.NET de Klasik ASP İşi Veritabanından Veri Çekmek

Yazdan kalma bir günden merhaba arkadaşlar. Çoğu forumda okuyorum, asp den asp.net e geçmek isteyenlerin veya asp.net de bişiyler yapmak isteyenlerin ilk önce sordukları şeylerin başında, veritabanı işlemleri geliyor. Yani veritabanına bağlanıp verileri ekrana yazdırmak. Esasında asp.net deki gelişmiş nesneleri kavradıktan sonra bu işlerin ne kadar basit olduğunu görüyorsunuz, fakat başlangıç için bu tarz bir bilgiyi öğrenmek iyi oluyor. Sonuçta asp ile veritbanı işlemleri bu şekilde ilerliyor ve geçişte de insan ister istemez bu tarz birşey görmek istiyor. Neyse uzatmadan örneğimize geçelim.

Default.aspx sayfamıza bir adet Label ekliyoruz. Bu labelin adı varsayılan olarak gelen Label1 olsun.

Default.aspx.cs sayfamız

using System;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection("Data Source=bilgisayar_adi;Initial Catalog=veritabani;User ID=kullaniciadi;Password=şifre"); //mssql veritabanımıza bağlanıyoruz.
SqlCommand sql = new SqlCommand("Select * from tablo_adi",conn); // sql cümlemizi yazıp, bağlantımızla ilişkilendiriyoruz.
conn.Open(); //bağlantıyı açıyoruz.
SqlDataReader rs = sql.ExecuteReader(); //rs diye adlandırdım, asp ye yakın olsun diye ;)
int i=0; // i değişkeninin integer olark tanımlayıp 0 a eşitliyoruz.
string renk; // renk diye bir değişken tanımlıyoruz.

while (rs.Read()) //döngümüzü başlatıyoruz.
{
i++; //i değişkenini artırıyoruz. 1-2-3-4-5..

if (i == 5) // burada da if yapısını anlamak adına bir if bloğu.
{
renk = "red";
}
else
{
renk = "";
}

//default.aspx sayfamızdaki label1 nesnesine verileri yazdırıyoruz.
//burdaki += ifadesi şu; label1 üzerine yaz, eğer + işaretini kaldırırsanız ekrana 1 adet veri gelecektir.
Label1.Text += "<span>"+ i +"-"+ rs["alanadi"].ToString()+"</span>
";
}
//kapanışlar..
rs.Close();
conn.Close();
}
}

MasterPage’ den diğer sayfadaki bir nesneye erişmek. FindControl

Geçtiğimiz haftalarda apostylee.com un .Net versiyonunu sizlere duyurmuştum. Header kısmındaki arama kutusuna girilen değeri veritabanında aratıp sonucu default.aspx sayfamdaki DataList te göstermek istediğimde, direk dataliste erişemediğimi farkettim. Halbuki windows form da nesnenin özelliklerine girip Modifiers kısmından Private değerini Public ile değiştirdiğimizde erişebiliyorduk. Web Form da durum biraz daha farklı ! Belki başka bir yoluda fakat benim bildiğim ve incelediğim kadarıyla herkesin kullandığı yöntem FindControl. Esasında Javascript deki getElementById ifadesine benziyor. Adından da anlaşılacağı gibi kontrolü arayıp bulmaya yarıyor :) Sadece sayfalar arasında değil nesne içindeki nesneyede bu sayede erişebiliyoruz. Örneğin bir GridList imiz var ve içinde de TextBox ımız. Textboxa erişmek için bu yöntemi kullanabiliyoruz. Yani öğrenilmesi anlanması gereken bir konu.

Kullanımı bir örnekle görelim;

		//Normalde bu datalist default.aspx sayfasında, bu kodlar ise MasterPage.Master.cs sayfamızda.
		//dl adındaki değişkene; ContentPlaceHolder1 içinde bulunan Datalist1 adındaki DataList nesnesini buluyoruz.
        DataList dl = ((DataList)ContentPlaceHolder1.FindControl("DataList1"));
        dl.DataSource = ds; // Data Sourcesini belirliyoruz veya ne istiyorsak..
        dl.DataBind();

		// Yine default.aspx sayfasında bulunan sayfalama adındaki Label Nesnesini görünmez yapıyoruz.
       ((Label)ContentPlaceHolder1.FindControl("sayfalama")).Visible = false;

JavaScript teki getElementById metodunda direk id yi bulup işlem yapabiliyoruz fakat; burada ilk önce aranan nesnenin ne olduğunu belirtmemiz gerekiyor. C# adı üstünde nesne tabanlı bir yazılım dili. Umarım faydalı olmuştur. Bir sonraki .Net macerasında görüşmek üzere..

ASP.NET MasterPage

ASP den ASP.Net’ e geçiş sürecinde beni en çok MasterPage olayı şaşırttı. Gerçekten süper düşünülmüş. Kabaca MasterPage için sitemizin şablonu diyebiliriz. ASP ile sitemizin tasarımını sabit tutmak için genellikle include file yöntemini kullanıyorduk. MasterPage yi gördükten sonra bu işin hamallıktan başka bişiy olmadığını gördüm. Heleki aradan zaman geçtikten sonra araki hangi sayfa nerde bulasın :) MasterPage ler .master uzantısında oluyor ve kodlama kısmı içinde .master.cs şeklinde oluşturuluyor. Oluşturuluyor diyorum Visual Studio kullanıyorsanız ve yeni MasterPage ekle derseniz otomatik olarak bu dosyalar oluşuyor. Örneğin; sitemizin üst (header) , alt (footer) ve menü kısmını MasterPage mizde tasarlıyoruz, değişken olan kısımımız  etiketleri arasında yer alıyor, birden fazla ContentPlaceHolder kullanmamız mümkün. Biraz karışıkmış gibi geliyor biliyorum, belkide ben karıştırdım. Eğer uygulamaya geçip bir deneme yaparsanız olayın çok zevkli ve kolay olduğunu anlayacaksınız. Hatta sırf bu olay için .Net e geçmek isteyenler bile olacaktır. Kabaca MasterPage ye değinmeye çalıştım, öğrendikçe daha detaylı yazılarla görüşmek üzere..

MasterPage.Master

Default.aspx

MasterPage hakkında çok daha ayrıntılı bilgilere buralardan ulaşabilirsiniz..

http://www.nedirtv.com/etiket/MasterPage.aspx

http://www.csharpnedir.com/makalegoster.asp?MId=354

http://www.kariyervideo.com/VideoAciklama.asp?id=347

ASP.Net GridView Sıralama Sayfalama İşlemleri..

Veritabanı ile GridView’ i doldurup, sayfalama ve sıralama işlemine göz atacağız. Öncelikle şunu belirtmekte fayda var diye görüyorum eğer editör olarak Visual Studio kullanıyorsanız sadece sürükle bırak yaparak bu işlemleri yapabilirsiniz, ama biz asp den geldiğimiz için kodu göre göre ne olduğunu anlaya anlaya yapmaya çalışacağız. Şunu itiraf  etmeliyim sıralama işlemini yapan bloğu http://www.forxy.net/ adresindeki http://www.forxy.net/ViewKonuDetay.aspx?KonuID=22 örneğinden gördüm :) İlk yapmaya çalıştığım örnek olduğu için daha kolay bir şekilde yapılabilirmiydi şuanlık bilemiyorum, ama saat gibi çalıştığını söyleyebilirim. Kodlara baktığınızda hemen hemen herşeyi anlayacaksınız zaten, eğer anlamazsanız sorun bildiğim kadarıyla açıklamaya çalışırım :)

Default.aspx

<form id="form1" runat="server">
	    <div>
	        <asp:gridview id="GridView1" runat="server" allowpaging="True" onpageindexchanging="GridView1_PageIndexChanging" allowsorting="True" onsorting="GridView1_Sorting">
	        </asp:gridview>
	    </div>
	    </form>

Default.aspx.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
doldur("ind"," desc");
}
}

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
doldur("ind", " desc");
}

public SortDirection GridViewSortDirection
{
get
{
if (ViewState["sortDirection"] == null)
ViewState["sortDirection"] = SortDirection.Ascending;
return (SortDirection)ViewState["sortDirection"];
}
set { ViewState["sortDirection"] = value; }
}

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) {
if (GridViewSortDirection == SortDirection.Descending)
{
GridViewSortDirection = SortDirection.Ascending;
doldur(e.SortExpression, " desc");
}
else
{
GridViewSortDirection = SortDirection.Descending;
doldur(e.SortExpression, " asc");
}
}

public void doldur(string alanadi, string siralama)
{
SqlConnection cnn = new SqlConnection("Server=SqlServerAdresi; Database=VeriTabanıAdı; uid=KullanıcıAdı;pwd=Şifre;pooling=true; connection lifetime=10; connection timeout=5; packet size=1024;");
SqlDataAdapter da = new SqlDataAdapter("select * from TabloAdi", cnn);
DataTable dt = new DataTable("TabloAdi");
da.Fill(dt);
DataView dv = new DataView(dt);
dv.Sort = alanadi + siralama;
GridView1.DataSource = dv;
GridView1.DataBind();
};   }
}

ASP den ASP.NET e Geçmek yada Geçmemek

Merhabalar, yaklaşık 2 – 2,5 yıldır emektar ASP den ASP.Net e geçmek için dönem dönem uğraşıyorum. İlk başta isimlerin benzerliği geçişin çok basit olacağını hissettiriyor fakat öyle birşey söz konusu bile değil. ASP.Net çok daha farklı bir yapı, okadar farklı ki web programcılığının mantığına doğasına aykırı bile denilebilir. Eğer önceden windows form ortamında çalışmışsanız bu yapı size çok tanıdık gelebilir, çünkü temel burda da web form lar. Burdaki Form ibaresini html deki form ile karıştırmayın :) ASP.NET sayfalarının en büyük özelliği C#, Visual Basic, J#  vb.. diller ile programlama yapılabilmesi. Zaten eğer ASP.Net e geçmek için karar verdiyseniz bunları biliyorsunuzdur, ön bilgi olsun diye bunları yazdım.

ASP den ASP.Net e geçiş için yazacak okadar fazla şey varki nerden başlayacağımı bilemiyorum. En iyisi bildiğim kadarını sıralıyayım.

  1. Öncelikle veritabanına bağlanıp Do while ile döndürüp veriyi ekrana basmayı unutun. Artık GridView, DataList vb.. nesneler ile verilerilisteletiyoruz.
  2. ASP de a=1, b=2 diye iki değişkeni response.Write a+b şeklinde toplayabilirdik. Bu devir kapandı, her değişkenin veri tipini belirtmeniz gerekiyor. int a = 1 gibi..
  3. ASP ile Response.Write “Merhaba” derdik ASP.Net de Response.Write(“Merhaba”); diyoruz. En sondaki noktalı virgülü iyi ezberleyiniz :)
  4. ASP.Net de iki çeşit programlama şekli var. Bizim kullandığımız asp ve html kodları iç içe şeklinde birde CodeBehind denilen tasarımla kod sayfası ayrı yerde. Örneğin Default.aspx sayfasında tasarım kısmı Default.aspx.cs kısmında kodlarınız bulunuyor. Bu tasarımcı ile programlayan için tek kelimeyle bulunmaz bir nimet.

Aklıma şimdilik bunlar geldi. İlk başta olaya hakimiyet kuramadığınızdan dolayı sıkkınlık bıkkınlık geliyor fakat şunu söylemeliyim ki alıştıktan sonra işler, asp ye göre çok daha zevkli ve hızlı ilerliyor. Öğrendikçe bildiklerimi buradan sizlerle paylaşmaya çalışacağım, emin olun .Net e geçmek için çok geç kaldık ;)

Türkçe Kaynaklar:

http://www.aspnedir.com/
http://www.yazilimgunlugu.com/
http://www.forxy.net/
http://www.yazilimuzmani.com/
http://daron.yondem.com/tr/
http://www.evcil.net/

Yabancı Kaynaklar:

http://www.asp.net/