GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

[ANLATIM] MySQL R33+ Kullanım

Başlatan Kraus, 14 Eylül 2017, 19:18:50

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Kraus

MySQL R33+ Kullanım






Merhabalar Arkadaşlar.


MySQL R33+ hakkında sorular eşliğinde kullanış şekillerini göstermeye çalışacağım. Konuyu okumadan önce SA-MP MySQL Plugin sürümünüzün konuyla uyumlu olup olmadığını kontrol edin. Umarım istediğiniz bilgiyi alırsınız...





MySQL ile Nasıl Bağlantı Kurarım?

MySQL serverımız ile bağlantı kurmak için mysql_connect fonkiyonunu kullanırız.

[!] Öncelikle MySQL Bağlantımız için yeni bir değişken tanımlamalıyız. Bağlantı kurarken bağlantı id'sini bu değişkene eşitleyeceğiz.


PAWN Kodu: Seç
new MySQL;

Daha sonrasında bağlantı kuracağımızda bağlantımızı bu değişkene eşitleyeceğiz.

mysql_connect fonksiyonunu tanıyalım.


PAWN Kodu: Seç
mysql_connect(const host[], const user[], const database[], const password[], port = 3306, bool:autoreconnect = true, pool_size = 2)

Buradaki host kısmı bağlantı kuracağınız MySQL serverinin hostu olmalıdır. Kendi bilgisayarınızdaki MySQL serverine bağlantı kuracaksanız localhost veya 127.0.0.1 yazabilirsiniz.

user kısmı MySQL serverinizdeki kullanıcı adıdır. Genelde root olarak kullanılır.

database kısmı kullandığınız tabloların olduğu veritabanı adı olmalıdır.

password kısmı MySQL kullanıcılarında kullandığınız kullanıcı adına ait şifre olmalıdır. localhost sunucularda WAMP vs. kullananlar için genelde şifresizdir. Çünkü local olarak kullanıldığı için dışarıdan bağlantılara kapalıdır.

port kısmı genelde tüm MySQL sunucuları için 3306 olarak sabittir. Ancak MySQL sunucunuzun portunu değiştirdiyseniz buradaki portu tanımlayarak bağlantı kurabilirsiniz.

Şimdi ise tüm öğrendiklerimizi toparlayarak yukarıda tanımladığımız değişken için bir bağlantı kuralım.


PAWN Kodu: Seç
MySQL = mysql_connect("localhost", "root", "db", "");

İşte bağlantımız hazır. Bağlantımızı OnGameModeInit ya da FS kullanacak isek OnFilterScriptInit kısmından yapmalıyız.




MySQL Bağlantımı Nasıl Kontrol Ederim - Bağlantım Başarılı Mı?

mysql_errno fonksiyonu ile kontrol edebiliriz. Bu fonksiyon 0'dan farklı bir değer döndürürse bağlantımız kurulamamıştır. Bu fonksiyonu mysql_connect fonksiyonumuzun hemen arkasına yerleştirebiliriz.

PAWN Kodu: Seç
if(mysql_errno(MySQL) != 0)
{
     print("[!] MYSQL Bağlantısı Kurulamadı..!");
     return 0;
}
else
{
     print("[!] MYSQL Bağlantısı Kuruldu.");
}





MySQL'da SELECT sorgusunu kullanarak nasıl veri çekerim?

Öncelikle genel olarak kullandığımız MySQL sorgu fonksiyonumuz mysql_tquery olacaktır. Bu fonksiyonun ilk bölmesine bağlantımızı tanımladığımız değişkeni yazacağız. Bu fonksiyonda sorgumuz için bir public oluşturacağız. Sorgu işlerken bu public'ten ilerleyerek verilerimizi çekecektir.

Eğer istersek bu public için format kullanabiliriz. Örneğin sorguyu playerid için çekeceksek ve veri tanımlarken bunu kullanacaksak sorguda "i", playerid şeklinde formatlama yapabiliriz.

Ben VerileriCek şeklinde bir public kullanarak örnek bir sorgu oluşturuyorum.


PAWN Kodu: Seç
mysql_tquery(MySQL, "SELECT * FROM table", "VerileriCek", "", "");

Sorgu çalıştığında VerileriCek public'i çalışacak. Bu bölümde verileri çekmek için cache_get_data kullanacağız.

PAWN Kodu: Seç
forward VerileriCek();
public VerileriCek()
{
     new rows, fields; // buradaki rows her bir veri, fields ise verilerin her bir sütunudur.
     cache_get_data(rows, fields, MySQL);

    // Burada birden fazla veri çekeceksek while veya for döngülerini kullanabiliriz. Ben while kullanıyorum.
     new i;
     new szField[128], Float: FloatVar, IntVar; // Verilerde kullanacağımız geçici veriler;
     while(i < rows) // rows aynı zamanda veri sayısıdır. Burada i, rowsa ulaşana kadar veri çekmeye devam edecek.
     {
           /*
                   Ben göstermek adına verilerimi geçici değişkenlere tanımlıyorum.
                   Siz isterseniz kendinize göre değişkenlerinize uyarlayabilirsiniz.
           */


           // Integer (Sayısal) Veri Çekme.
           IntVar = cache_get_field_content_int(i, "field1", MySQL);
           // Eşitlik kurarsak verimizi değişkene tanımlarız. Integer = cache_get_field_content_int

          // String Veri Çekme.
          cache_get_field_content(i, "field2", szField, MYSQLCON, sizeof(szField));
          // Burada stringimizi szField değişkenine çektik.

          // Float Veri Çekme.
          cache_get_field_content(i, "field2", szField, MYSQLCON, sizeof(szField));
          FloatVar = floatstr(szField);
          // Burada verimizi string gibi çektik, sonrasında floatstr kullanarak floata dönüştürdük.
          i++;
     }
}





Satır içi/CallBack olmadan nasıl SELECT sorgusu işlerim?

Bunun için örnek bir fonksiyon atacağım.

PAWN Kodu: Seç
stock KarakterSayisi()
{
new szResult[64], rows, fields;
format(szResult, sizeof(szResult), "SELECT `id` FROM `karakterler`");
new Cache:result = mysql_query(MySQL, szResult);
cache_get_data(rows, fields, MySQL);
cache_delete(result);
if(rows)
{
    return rows;
}
return 0;
}


Bu fonksiyon örnek olarak yapılmıştır. Kullandığınızda karakter sayısını döndürür. Kendinize göre bu şekilde sorgu yapabilirsiniz.




MySQL'da UPDATE sorgusu nasıl işlerim?

Update sorgusu MySQL'da olan bir verinin alt verilerini değiştirmek için kullanılır. Örnek olarak bir sorgu atacağım. Tüm verilerimizi küçük tırnak işaretiyle kullanabiliriz. '127.0.0.1' şeklinde.

new strQuery[64], oyuncuIP[16];
GetPlayerIp(playerid, oyuncuIP, sizeof(oyuncuIP);
format (strQuery, sizeof(strQuery), "UPDATE karakterler SET IP = '%s'", oyuncuIP);
mysql_tquery(MySQL, strQuery, "", "", "");


Burada callback kullanmadığımız için son 3 bölmeyi boş bıraktık.




mysql_real_escape_string Nerelerde, Nasıl Kullanılır?

MySQL sorgularında string veriler kullanılırken tırnak işareti gibi işaretler kullanıldığında sorgu çökebilir ve çöktüğünde sorgu işlemez. Bu gibi durumlarda mysql_real_escape_string kullanarak bunun önüne geçebiliriz. Örnek olarak kullanım yöntemi olarak bir sorgu atıyorum.

new birlikAd[24], strSorgu[64];
mysql_real_escape_string(BirlikBilgi[birlikAdi], birlikAd, sizeof(birlikAd));
format(strSorgu, sizeof strSorgu, "UPDATE birlik SET BirlikAdi = '%s'", birlikAd);
mysql_tquery(MySQL, strSorgu, "", "", "");





MySQL'da INSERT sorgusunun SQL ID'sini nasıl çekeceğim?
(INSERT ID)


INSERT sorgularda da aynı şekilde callback kullanarak SQL ID'sini çekebilirsiniz. Örnek olarak bir kullanım şekli atıyorum.

forward VeriOlustu(sayi)
public VeriOlustu(sayi)
{
     new x = BosVeri();
     Veri[x][vID] = cache_insert_id(MySQL);
     Veri[x][vSayi] = sayi;
}

stock VeriOlustur(sayi)
{
     new sorgu[64];
     format(sorgu, sizeof sorgu, "INSERT INTO veriler (sayi) VALUES ('%d')", sayi);
     return mysql_tquery(MySQL, sorgu, "VeriOlustu", "i", sayi);
}





MySQL'da DELETE sorgusunu nasıl işlerim?

Bunun için de yukardaki örneğe uygun bir örnek oluşturuyorum.

forward VeriSilindi(SQLid)
public VeriSilindi(SQLid)
{
     for(new i = 0; i < MAX_VERI; i++)
     {
          if(Veri[x][vID] == SQLid)
          {
                 Veri[x][vID] = 0;
                 Veri[x][vSayi] = 0;
          }
     }
}

stock VeriSil(SQLid)
{
     new sorgu[64];
     format(sorgu, sizeof sorgu, "DELETE FROM veriler WHERE ID = '%d'", SQLid);
     return mysql_tquery(MySQL, sorgu, "VeriSilindi", "i", SQLid);
}





Temel MySQL kullanımları için aklıma gelenler bunlar. Yanlışım var ise veya eklemeyi unuttuğum, eklemenizi istediğiniz bir şey varsa konu altından yazarsanız ekleyebilirim.

Saygılarımla, Kraus

Safari Gaming © sɪɴᴄᴇ 2014
www.sf-gaming.net

Cagatay.Bey

Başarılı bir anlatım - Teşekkürler.


Zoxy

Bilmeyenler için yararlı, eline sağlık.  :helal:


enes020020

Eline sağlık abi muhteşem anlatmışsın.


Christian

Tell your men they work for me now, this is my city!

Tunahan


darkshadow


kidmaestro

Eline sağlık çok açıklayıcı bir anlatım olmuş


NikolaiS

Yeni başlayanlar veya bilmeyenler için güzel bir konu.


Kraus

Yorumlarınız için teşekkürler.

Safari Gaming © sɪɴᴄᴇ 2014
www.sf-gaming.net

ace

Eline emeğine sağlık abi çok güzel bir anlatım olmuş. :helal:


pag

Açıklayıcı, anlaşılabilir bir anlatım olmuş, eline sağlık.


Adolphe

«      miss out on fun  »

MehmetAKAR

  Efsaneler Asla Ölmez Sadece Şekil Değiştirir..!        
     
   

FelleR