- 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.

cPanel Login Ekranı

cPanel Ana Ekranı

- 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.

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.

- 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.

- 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)


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

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;
Kod: Tümünü seç
DataSetProvider1.DataSet := SQLQuery1;
DataSetProvider1.Options := [poIncFieldProps, poAutoRefresh, poAllowCommandText];
ClientDataSet1.ProviderName := 'DataSetProvider1';
DataSource1.DataSet := ClientDataSet1;
DBGrid1.DataSource := DataSource1;
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ü...

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;


=======================================================================================================================
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;
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;
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;
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;

