MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4718
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen mrmarman » 06 Eki 2013 03:48

Merhabalar.

- Bir çoğumuz farklı ortamlardaki veritabanlarına bağlantı kurmuşuzdur. Mobil dünyada Android ve iOS yazılımları geliştirmek yaygınlaştıkça, veritabanı yerleşkesi olarak WEB hosting firmalarından destek alınması en uygun fiyatlı çözümlerdir.

- Bir çoğumuz farklı firmalardan host hizmeti alıyoruz. Bu hizmetlerde eskiden opsiyonel olarak ayrıca verilen MySQL veritabanı hizmeti, sonraları Joomla vb. content management sistemleri sayesinde default olarak verilmeye başlandı. Bizler gibi hosttaki MySQL veritabanına dışarıdan erişim talebi yapan yazılım geliştiricileri yaygınlaşınca da bu bağlantı imkanı yine opsiyonel iken de artık Shared IP verilerek kendi MySQL databaseinize erişmek için IP tanımı standart hale gelmeye başladı.

- Bugün buradaki bir MySQL veritabanına nasıl bağlanacağımıza ilişkin konuşucaz.
- Bir tane DLL ( libmysql.dll ) dosyasına ihtiyacınız olacak. Buradan indirebilirsiniz. Bunu program klasörünüze koyun, piyasadaki MySQL kütüphaneleri uyumsuzluk yapıyor. Bu oldukça uyumlu bir tanedir.

=========================================================================================
1. Hosting aldığımız alanımızın (ben cPanel'i anlatıcam linux sunucularını tercih ediyorum) kontrol ve erişim ekranları aşağıdaki gibidir. :idea:

cPanel Login Ekranı
Resim

cPanel Ana Ekranı
Resim

- cPanel Ana Ekranında öncelikli olarak ilgileneceğimiz kısım sol sütundaki SharedIP yazan yerdir. Bu IP Adresi (farazi bir IP olarak 50.100.150.200 yazdım) bizim Delphi içinden erişeceğimiz IP adresidir.Dışarıdan bu IP adresine erişildiğinde hosting firmasındaki MySQL sunucusu doğru isim / şifre girdiğinizde sizin veritabanınıza bağlantı yaptıracaktır. Yalnız bir şartla.

Resim
Databases alt başlığında veritabanınızla ilgili manager ekran linkeri bulunur. Bunlardan dışarıdan bağlantı konusunda ilgileneceğimiz başlık RemoteMySQL isimli başlıktır. Bu başlığa tıkladığınızda aşağıdaki ekran karşınıza çıkar.

Resim

- Göreceğiniz gibi listede 2 adet IP adresi var. Bunlardan birisi web sitemizin bulunduğu HOST'un IP adresidir. ( hani üzerini boyayıp farazi vermiştim ya 50.100.150.200) Bu sayede web sitemizin veritabanı bağlantısı varsayılan olarak kabul edilir. Bu IP silerseniz web siteniz MySQL destekli ise çalışmaz olur.

- İkinci IP adresi de kendi eklediğimiz / ekleyeceğimiz IP adresimizdir. (onu da örnek olsun diye 60.110.160.210 şeklinde değiştirdim.). Bu da şu demek oluyor. Bir hosting firmasındaki MySQL veritabanına erişmek için kendi (client) IP'nizin buraya sizin tarafınızdan eklenmesi gerekmektedir. Müşterileriniz dahil.

- Sizin ve/veya müşterinizin statik bir IP adresi yoksa ne yapıcaz ?!
- Yazılımınız erişim yapmadan önce buraya bakacak, kendi IP adresi yoksa ekleyecek şekilde bir yazılım fonksiyonu geliştirmeniz lazım demektir.
- Ben kendimce bunu geliştirdim. (göreceli olarak) Basit bir WEB PARSE sistemidir. Makalenin sonunda sizinle paylaşıcam.
=========================================================================================
2. Artık DELPHI yakasına geçebiliriz. :idea:

- Yeni bir proje oluşturup FORM üzerine aşağıdaki bileşenleri koyucaz.
(Standart Delphi Bileşenleri kullanıcam. Ekstra bileşenlerin bir çoğu paralı. Ücretsiz olanlar da Delphi sürümü XE5'e geldi, her sürümde uyum sağlayamayabiliyor. Zaten biliyorum ki, %99 delphi programcısı MySQL bağlantısı için yerel kaynakları kullanmayıp 3.parti VCL tabanlı çözümler arıyor. Ben yerli malı embarcadero malı diyorum) :alsana:
Resim

1 Adet TSQLConnection
1 Adet TSQLQuery
1 Adet TDataSetProvider
1 Adet TClientDataSet
1 Adet TDataSource
ve
1 Adet TDBGrid

:idea: Bileşenler dokunmanıza/birbirine bağlamanıza gerek yok, ben aşağıda kod içerisinden yapılacak ayarları yaptırıcam.

SQLConnection1 ile MySQL veritabanı bağlantı şeması şu şekilde.

Kod: Tümünü seç

   With SQLConnection1 do begin
     Connected            := False;
     DriverName           := 'MySQL';
     ConnectionName       := 'MySQLConnection';

     Params.Clear;
     Params.Values['DriverName'] := 'MySQL';
     Params.Values['HostName']   := '50.100.150.200'; // Buraya SharedIP yazılacak.
     Params.Values['Port']       := '3306';
     Params.Values['Database']   := 'bizim_data';
     Params.Values['User_Name']  := 'bizim_user';
     Params.Values['Password']   := 'bizim_password';
     Params.Values['Compressed'] := 'True';
     Params.Values['ErrorRessourceFile']:='0000';
     Params.Values[' VendorLib'] := 'libmysql.dll';
     GetDriverFunc := 'getSQLDriverMySQLDirect';
     LibraryName   := 'dbexpmda.dll';
     VendorLib     := 'not used';
     LoginPrompt   := False;
     ParamsLoaded  := True;
     Connected     := True;
   end;
Bu da bağlantı şeması

Kod: Tümünü seç

    DataSetProvider1.DataSet    := SQLQuery1;
    DataSetProvider1.Options    := [poIncFieldProps, poAutoRefresh, poAllowCommandText];
    ClientDataSet1.ProviderName := 'DataSetProvider1';
    DataSource1.DataSet         := ClientDataSet1;
    DBGrid1.DataSource          := DataSource1;
DataSetProvider1 ile bu bağlantı hizmetinin kimden alınacağını tanımlıyoruz.
ClientDataSet1 de gölge hizmet olarak DataSetProvider1 taşeronluğu / aracılığıyla SQLQuery1'e ilişkilendirildi.
DataSource1 veri içeriğini ClientDataSet1'den devraldı.
DBGrid1 de son olarak DataSource1'deki veriyi ekrana yansıtıp ete kemiğe bürüdü... :roll:

Geriye sorgumuz kaldı. Ben kendi web sitemdeki Joomla tablo listesini alayım örnek olarak.

Kod: Tümünü seç

    With SQLQuery1 do begin
      SQLConnection := SQLConnection1;
      ClientDataSet1.Active := False;
      SQL.Clear;
      SQL.Add('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE 1=1 AND TABLE_SCHEMA = ''bizim_data'' ');
      ClientDataSet1.Active := True;
    end;
Ürün : :idea:
Resim

=======================================================================================================================
3. Ekstra birinci fonksiyon.
WWW üzerindeki IP Adresinizi veren ( WhatIsMyIP.com ) adresini parse ederek IP adresini döndüren bir fonksiyon.

Kod: Tümünü seç

Function WhatIsMyIp( WebBrowser: TWebBrowser ): String;
  function TagTemizle(strIcerik: string): string;
  var
    Tag1, Tag2: integer;
  begin
    Tag1 := Pos( '<', strIcerik);
    while (Tag1 > 0) do begin
      Tag2 := Pos('>', strIcerik);
      Delete(strIcerik, Tag1, Tag2 - Tag1 + 1);
      Tag1:= Pos( '<', strIcerik);
    end;
    Result := Trim(strIcerik);
  end;
Var
  strIcerik, strAra : String;
begin
  Result := '';
  WebBrowser.Navigate( 'http://www.whatismyip.com');
  while WebBrowser.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
  strIcerik := WebBrowser.OleObject.Document.Body.InnerHTML;
  strAra := '>Your IP:</TD>';
  if Pos( strAra, strIcerik ) > 0 then
  begin
    System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
    strIcerik := TagTemizle( Copy( strIcerik, 1, Pos('</TD>', strIcerik)-1 ) );
    Result := Trim(strIcerik);
  end;
end;
Kullanımı :

Kod: Tümünü seç

   Edit1.Text := WhatIsMyIp( WebBrowser1 );
=======================================================================================================================
Aşağıdaki Fonksiyon(lar) cPanel ile uyumludur. cPanel'in farklı sürümlerine göre manüpilasyon yapılması gerekebilir.
=======================================================================================================================
4. Ekstra ikinci fonksiyon.
cPanel'e login olarak Hosts listesine vereceğiniz kendi IP adresi bilgisini ekleyen procedure
Not : Formunuzda en az (1) WebBrowser olacaktır. Buna aşağıdaki şekilde bir ekleme yapmayı ihmal etmeyin.
Fonksiyon'da kullanacağınız WebBrowser da bu eklediğiniz olsun.
Örnekte WebBrowser1 dedik ancak sizdeki adı ne ise ona adapte ediniz.

Kod: Tümünü seç

Var
  xDocComp : Boolean = False; // global değişkendir.

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
begin
  xDocComp := True;
end;

Function HostEkle( strHost, StrIp, strName, strPass: String; var strSharedIP, strMySQLVer:String; boolHostsEklensin:Boolean; WebBrowser:TWebBrowser ):Boolean;
Const
  Yukleniyor1 = 'href="sql/managehost.html">';
  Yukleniyor2 = 'Remote Database Access Hosts';
  Yukleniyor3 = 'was added to the access list.';
Var
  strIcerik, strAra, strHIP, strSilHIp : String;
  Liste : TStringList;
begin
  Result := False;
  WebBrowser.Navigate( strHost );
  while WebBrowser.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
  strIcerik := WebBrowser.OleObject.Document.Body.InnerHTML;

  WebBrowser.OleObject.Document.GetElementByID('user').Value := strName;
  WebBrowser.OleObject.Document.GetElementByID('pass').Value := strPass;
  xDocComp := False;
  WebBrowser.OleObject.Document.GetElementByID('login').click;
  while NOT xDocComp do Application.ProcessMessages;

  while ( Pos( Yukleniyor1, WebBrowser.OleObject.Document.body.InnerHtml ) <= 0 )
   do Application.ProcessMessages;
  strIcerik := WebBrowser.OleObject.Document.Body.InnerHTML;

  strAra := '>MySQL version<';
  System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
  strAra := '<TD title=';
  System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
  strAra := '>';
  System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
  strMySQLVer := Copy( strIcerik, 1, Pos('<', strIcerik)-1);

  strAra := '>Shared IP Address<';
  System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
  strAra := '<TD title=';
  System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
  strAra := '>';
  System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
  strSharedIP := Copy( strIcerik, 1, Pos('<', strIcerik)-1);

  if boolHostsEklensin then
  begin
    xDocComp := False;
    WebBrowser.OleObject.Document.GetElementByID('item_mysql-remoteaccess').click;
    while NOT xDocComp do Application.ProcessMessages;

    while ( Pos( Yukleniyor2, WebBrowser.OleObject.Document.body.InnerHtml ) <= 0 )
     do Application.ProcessMessages;

    strIcerik := WebBrowser.OleObject.Document.Body.InnerHTML;
    strAra    := '<TH scope=col>Access Hosts</TH>';
    System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
    strIcerik := Copy(strIcerik, 1, Pos('<UL class="links footer_ul">', strIcerik)-1);

    Liste := TStringList.Create;

    while pos('<DIV align=center>', strIcerik) > 0 do
    begin
      strAra    := '<DIV align=center>';
      System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
      strHIp    :=  Trim( Copy( strIcerik, 1, Pos('<', strIcerik)-1 ) );
      strAra    := '<A href="';
      System.Delete( strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );
      strSilHIp := Copy( strIcerik, 1, Pos('">', strIcerik)-1 );
      Liste.AddObject( strHIp, TObject( String(strSilHIP) ) );
    end;

    if Liste.IndexOf(Trim(strIp)) >= 0 then
    begin
      Result := False;
    end else
    begin
      WebBrowser.OleObject.Document.GetElementByID('host').Value := strIP;

      xDocComp := False;
      WebBrowser.OleObject.Document.GetElementByID('submit-button').click;
      while NOT xDocComp do Application.ProcessMessages;

      while ( Pos( Yukleniyor3, WebBrowser.OleObject.Document.body.InnerHtml ) <= 0 )
       do Application.ProcessMessages;
      strIcerik := WebBrowser.OleObject.Document.Body.InnerHTML;

      Result := Pos( Yukleniyor3, strIcerik ) >0;
    end;
    Liste.Free;
  end; // if boolHostsEklensin
end;
Kullanımı :
Bu fonksiyonu çift taraflı hazırladım.
a- Aşağıdaki kullanım ile IP adresini eklemeye yarıyor. TRUE boolean ifadesi sunucuya IP bilgisini yazma yapacağı anlamına geliyor.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  strIP, strSharedIP, strMySQLVer, strHost, strName, strPass : String;
begin
    strIp   := Edit1.Text;
    strHost := 'http://'+ Edit2.Text;
    strName := Edit3.Text;
    strPass := Edit4.Text;

    if HostEkle( strHost, strIP, strName, strPass, strSharedIP, strMySQLVer, True, WebBrowser1 )
      then ShowMessage( 'Başarıyla Eklendi' )
      else ShowMessage( 'IP''niz sistemde tanımlı veya eklenemedi.' );
end;
b- Aşağıdaki kullanım ile ise de Sunucunun SharedIP bilgisi ile MySQL veritabanı sürüm bilgisini çekiyoruz. IP adresini ekleme yapmıyor. FALSE boolean ifadesi sunucuya müdahale edilmeyecek anlamına geliyor.

Kod: Tümünü seç

procedure TForm1.BitBtn2Click(Sender: TObject);
Var
  strIP, strSharedIP, strMySQLVer, strHost, strName, strPass : String;
begin
    strIp   := '';
    strHost := 'http://'+ Edit2.Text;
    strName := Edit3.Text;
    strPass := Edit4.Text;

    HostEkle( strHost, strIP, strName, strPass, strSharedIP, strMySQLVer, False, WebBrowser1 );

   ShowMessage(' SharedIP = ' + strSharedIP );
   ShowMessage(' MySQL Sürün Bilgisi = ' + strMySQLVer );
end;
=======================================================================================================================
:arrow: Herkese başarılar. Umarım bir çoğunuzun işine yarayacak türden bir makale olmuştur. :bravo:
Resim Resim

Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 08:41
Konum: Güneyden
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen White Rose » 11 Eki 2013 05:07

Elinize ve zihninize sağlık, her zamanki gibi döktürmüşsünüz. :)

bilal.celik
Üye
Mesajlar: 1
Kayıt: 18 Nis 2012 10:08

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen bilal.celik » 30 Eki 2014 12:30

Merhaba biraz zaman geçmiş konunun üstünden :) farkındayım bir sorum olacak mobil uygulamalar için ne yapmamız lazım?

makine4256
Üye
Mesajlar: 4
Kayıt: 02 May 2015 05:55

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen makine4256 » 15 Tem 2015 07:40

Merhaba hocam. Web veritabanına yazma işlemi yapmaya çalıştığı zaman "SQLQuery: Cannot modify a read-onlydataset" uyarısı aldım. Bunu nasıl çözebilirim. Yardımcı olabilir misiniz.

mkysoft
Kıdemli Üye
Mesajlar: 2928
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen mkysoft » 15 Tem 2015 02:59

@bilal.celik ip adresi olarak eğer izin veriyorsa * yazabilirsiniz. Ancak veri tabanınız her IP'ye açık olduğu için risklere açık hale gelecektir.
@makine4256 kullandığınız MySQL kullanıcısının yetkisi yok, cpanel'de kullanıcı yarattığınız ekranda grant user seçeneği olması lazım.

makine4256
Üye
Mesajlar: 4
Kayıt: 02 May 2015 05:55

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen makine4256 » 21 Ağu 2015 06:18

bahsettiğiniz seçenek yok ama onun yerine kullanıcıya bütün yetkileri verdim ama hala aynı hatayı alıyorum.

hakanharbeli
Üye
Mesajlar: 76
Kayıt: 01 Nis 2016 02:58

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen hakanharbeli » 10 Nis 2016 12:18

hocam benim anlamadığım şimdi bir web hosting alsak onun phpmyadmini mysql'i olsa orada nasıl wordpres kuruyor ve database'imizi tanıtıyorsak aynını delphi için yapamıyor muyuz? ben söylediklerinizden tereddüt edip gittim bir free mysql hosting sitesi buldum tsqlconnection ile bağlan dedim bağlandı burada öyle olmuyor mu?

mkysoft
Kıdemli Üye
Mesajlar: 2928
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen mkysoft » 10 Nis 2016 06:37

@hakanharbeli mysql'de kullanıcıların bağlanacağı IP'ye kısıtlama getirilebiliyor. Default olarak kısıtlı olarak açılır. Free olarak kullandığınız yerde bu ayar kapalı olabilir. Ancak hosting firmaları güvenlik nedeniyle genelde veri tabanlarını dışarı açmaz.
wordpress veri tabanınında çalıştığı makinada yada aynı ağda bulunur, default yetki buna göre ayarlanır.

hakanharbeli
Üye
Mesajlar: 76
Kayıt: 01 Nis 2016 02:58

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen hakanharbeli » 10 Nis 2016 07:35

mkysoft yazdı:@hakanharbeli mysql'de kullanıcıların bağlanacağı IP'ye kısıtlama getirilebiliyor. Default olarak kısıtlı olarak açılır. Free olarak kullandığınız yerde bu ayar kapalı olabilir. Ancak hosting firmaları güvenlik nedeniyle genelde veri tabanlarını dışarı açmaz.
wordpress veri tabanınında çalıştığı makinada yada aynı ağda bulunur, default yetki buna göre ayarlanır.

Anladım hocam teşekkür ederim herhalde hosting almadan önce hosting sahibinden bu konuda bilgi istemeliyim dışarı açan bildiğiniz bir hosting firması var mı ? Hocam çünkü bir uygulama yapıyorum günde en az 200 300 kişi girecek 1000 e yakın sorgu gerçekleştirecek free hosting dayanmaz buna

mkysoft
Kıdemli Üye
Mesajlar: 2928
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen mkysoft » 10 Nis 2016 11:16

Hem dayanmaz hemde veri kaybı olabilir. Parayla alacağınız yerde bile sorunlar yaşabilirsiniz:
Hosting firmaları mysql'in ücretsiz versiyonunu kullanır. Ücretsiz versiyon MyISAM db yapısını kullanılır. MyISAM'da foreign key, transaction yoktur. Çoğu host firmasının yedekleme sıklığı düşüktür. Eğer verileriniz kritik ise hosting firmasından bile almanızı tavsiye etmem. Bildiğim tek yer kullandığım yer olan oxio.net

jakarta2
Üye
Mesajlar: 63
Kayıt: 20 Nis 2015 05:51
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen jakarta2 » 30 Kas 2016 05:35

Android telefonlar için yaptığım mysql bağlantısında Data.DBXMySQL not founds hatası veriyor. Ne yapmam gerekiyor?

mkysoft
Kıdemli Üye
Mesajlar: 2928
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen mkysoft » 02 Ara 2016 10:12

dbExpress anladığım kadarıyla native bir bağlantı sağlayamıyor, MySQL bağlantı dll'i olan libmysql.dll ihtiyacı duyuyor. Eğer native desteği yoksa mobilde çalışmaması normal.
Aşağıdaki adreste native desteği olduğu yazıyor ancak nasıl ayarlanır, sizdeki versiyon destekliyor mu kontrol etmelisiniz.
https://www.devart.com/dbx/mysql/

MySQL'e bağlanmak için kullanıcı adı ve şifreyi uygulama içine gömeceğiniz için ele geçirilebilir, güvenlik açığı olur.

jakarta2
Üye
Mesajlar: 63
Kayıt: 20 Nis 2015 05:51
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen jakarta2 » 07 Ara 2016 02:41

Malesef dbexpress'in devartmysql'inde de not found hatası veriyor. Ben anlamıyorum. google play'de Mysql client uygulaması var. Onlar nasıl bağlanmış? Datasnapla değil heralde...

mkysoft
Kıdemli Üye
Mesajlar: 2928
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen mkysoft » 07 Ara 2016 03:25

Kesinlikle, zaten datasnap kullanıyorsanız mysql bağlantısına ihtiyacınız olmaz.

bulent1453
Üye
Mesajlar: 3
Kayıt: 02 Oca 2008 11:26

Re: MySQL Bağlantı (WEB Veritabanına) Nasıl Yapılır.

Mesaj gönderen bulent1453 » 04 Ağu 2018 10:53

sa. mysql weritabanına uzaktan bağlantı yapmaya çalıştım ama olmadı bir örnek proje hazırlarsanız çok iyiliğe geçersiniz. malum resimler görünmüyor. rica edeceğim.

Cevapla