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

MySQL R41 İle Kayıt Sistemi Oluşturmak

Başlatan jensen, 23 Temmuz 2018, 04:39:37

« önceki - sonraki »

0 Üye ve 2 Ziyaretçi konuyu incelemekte.

jensen

SAMP MySQL Kayıt Sistemi Yapma


Selamlar, bu anlatımda son sürüm mysql ile cache mantığını kullanarak kayıt sistemi oluşturacağız.

MySQL nedir?
Açık kaynak kodlu, hızlı ve güvenilir veritabanı yönetim sistemidir.

Gerekli Dosyalar
MySQL R41-4

Kurulum
1. Yukarıdaki dosyayı indirip içerisindeki herşeyi sunucunuzun ana dizinine atın.

2. Modun include'ları arasına mysql include'ını tanıtalım.

  • #include    <a_mysql>



3. MySQL bağlantı ayarlarını yapalım.

  • #define      MYSQL_HOST                "127.0.0.1"

  • #define      MYSQL_USER                "root"

  • #define      MYSQL_PASSWORD         "123"

  • #define      MYSQL_DATABASE         "sampturk"



4. MySQL bağlantısını tutacak değişkeni tanımlayalım;

  • new MySQL: g_SQL;



5. Oyuncu verilerini tutacak enum'u tanımlayalım;

  • enum OyuncuVerileri

  • {

  •       SQLID,

  •       Isim[MAX_PLAYER_NAME],

  •       Sifre[65],

  •       SifreSakla[17],

  •       Float: Pos[3],

  •       Interior,

  •       Silah,

  •       Cache: Cache_ID

  • };

  • new Oyuncu[MAX_PLAYERS][OyuncuVerileri];



6. Dialog verilerini tutacak enum'u tanımlayalım.

  • enum

  • {

  •       DIALOG_GECERSIZ,

  •       DIALOG_GIRIS,

  •       DIALOG_KAYIT,

  • };



6. OnGameModeInit MySQL bağlantısını yapmayı sağlayacak kodları ekleyelim.

  • new MySQLOpt: option_id = mysql_init_options();

  • mysql_set_option(option_id, AUTO_RECONNECT, true); // MySQL bağlantısında kopma gibi durumlar olduğu zaman otomatik tekrar bağlanır.

  • g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id);

  • if(g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)

  • {

  •       print("MySQL bağlantısı başarısız, server.exe kapanıyor.");

  •       SendRconCommand("exit");

  •       return 1;

  • }

  • print("MySQL bağlantısı başarılı.");



7. OnGameModeExit oyuncu verilerinin kayıt etmesini sağlayacak kodları ekleyelim.

  • for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)

  • {

  •       if(IsPlayerConnected(i))

  •       {

  •             OnPlayerDisconnect(i, 1);

  •       }

  • }

  • mysql_close(g_SQL); // MySQL bağlantısını kapatıyoruz.



8. OnPlayerConnect oyuncu verilerinin yüklenmesini sağlayacak kodları ekleyelim.

  • static const empty_player[OyuncuVerileri];

  • Oyuncu[playerid] = empty_player;

  • GetPlayerName(playerid, Oyuncu[playerid][Isim], MAX_PLAYER_NAME);

  • new sorgu[120]; // Aşağıda oyuncunun kayıtlı olup olmadığını kontrol edecek sorguyu gönderiyoruz.

  • mysql_format(g_SQL, sorgu, sizeof(sorgu), "SELECT * FROM `oyuncular` WHERE `isim` = '%s' LIMIT 1", Oyuncu[playerid][Isim]);

  • mysql_tquery(g_SQL, sorgu, "OyuncuVeriYukle", "d", playerid);



9. OnPlayerDisconnect oyuncu çıkış yaptığında verilerinin kayıt olmasını sağlayacak kodları ekleyelim.

  • OyuncuGuncelle(playerid);

  • if(cache_is_valid(Oyuncu[playerid][Cache_ID]))

  • {

  •       cache_delete(Oyuncu[playerid][Cache_ID]); // Önbellekte ki verileri siliyoruz.

  •       Oyuncu[playerid][Cache_ID] = MYSQL_INVALID_CACHE;

  • }



10. OnPlayerSpawn oyuncu spawn olduğunda son kaydedilen konumda spawn olmasını sağlayacak kodları ekleyelim.

  • SetPlayerInterior(playerid, Oyuncu[playerid][Interior]);

  • SetPlayerPos(playerid, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2]);

  • SetCameraBehindPlayer(playerid);

  • GivePlayerWeapon(playerid, Oyuncu[playerid][Silah], 30);



11. OnDialogResponse oyuncunun giriş ve kayıt işlemlerini diyalog üzerinden yapılmasını sağlayacak kodları ekleyelim.

  • switch(dialogid)

  • {

  •       case DIALOG_GECERSIZ: return 1;

  •       case DIALOG_GIRIS:

  •       {

  •             if(!response) return Kick(playerid);

  •             new sifresakla[65];

  •             SHA256_PassHash(inputtext, Oyuncu[playerid][SifreSakla], sifresakla, 65);

  •             if(strcmp(sifresakla, Oyuncu[playerid][Sifre]) == 0)

  •             {

  •                   SendClientMessage(playerid, -1, "Başarıyla giriş yaptınız.");

  •                   cache_set_active(Oyuncu[playerid][Cache_ID]); // Verileri çekmek için önbelleği aktif ediyoruz.

  •                   cache_get_value_int(0, "id", Oyuncu[playerid][SQLID]);

  •                   cache_get_value_float(0, "x", Oyuncu[playerid][Pos][0]);

  •                   cache_get_value_float(0, "y", Oyuncu[playerid][Pos][1]);

  •                   cache_get_value_float(0, "z", Oyuncu[playerid][Pos][2]);

  •                   cache_get_value_int(0, "interior", Oyuncu[playerid][Interior]);

  •                   cache_get_value_int(0, "silah", Oyuncu[playerid][Silah]);

  •                   cache_delete(Oyuncu[playerid][Cache_ID]); // Verileri çektikten sonra önbelleği siliyoruz.

  •                   Oyuncu[playerid][Cache_ID] = MYSQL_INVALID_CACHE;

  •                   SetSpawnInfo(playerid, NO_TEAM, 0, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2], 0, 0, 0, 0, 0, 0, 0);

  •                   SpawnPlayer(playerid);

  •             }

  •             else

  •             {

  •                   ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_PASSWORD, "Giriş", "Hatalı şifre!\nGiriş yapmak için lütfen şifrenizi girin:", "Giriş", "Çıkış");

  •             }

  •       }

  •       case DIALOG_KAYIT:

  •       {

  •             if(!response) return Kick(playerid);

  •             if(strlen(inputtext) <= 5) return ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_PASSWORD, "Kayıt", "Şifrenizin uzunluğu 5 karakterden fazla olmalıdır.\nKayıt olmak için lütfen şifrenizi girin:", "Kayıt", "Çıkış");

  •             for(new i = 0; i < 16; i++) Oyuncu[playerid][SifreSakla] = random(94) + 33; // Şifreyi hashliyoruz yani karmaşık bir düzene sokuyoruz.

  •             SHA256_PassHash(inputtext, Oyuncu[playerid][SifreSakla], Oyuncu[playerid][Sifre], 65);

  •             new sorgu[250]; // Aşağıda oyuncunun veritabanına kayıt olması için bir sorgu gönderiyoruz.

  •             mysql_format(g_SQL, sorgu, sizeof(sorgu), "INSERT INTO `oyuncular` (`isim`, `sifre`, `sifresakla`) VALUES ('%s', '%s', '%e')", Oyuncu[playerid][Isim], Oyuncu[playerid][Sifre], Oyuncu[playerid][SifreSakla]);

  •             mysql_tquery(g_SQL, sorgu, "OyuncuKaydet", "d", playerid);

  •       }

  • }



12. OyuncuVeriYukle oyuncu verilerinin yüklenmesini sağlayacak publici oluşturalım.

  • forward OyuncuVeriYukle(playerid);

  • public OyuncuVeriYukle(playerid)

  • {

  •       new mesaj[150];

  •       if(cache_num_rows() > 0) // Sorgudan gelen verinin var olup olmadığını kontrol ediyoruz, var ise oyuncunun kayıtlı olduğu dialogu göstereceğiz.

  •       {

  •             cache_get_value(0, "sifre", Oyuncu[playerid][Sifre], 65);

  •             cache_get_value(0, "sifresakla", Oyuncu[playerid][SifreSakla], 17);

  •             Oyuncu[playerid][Cache_ID] = cache_save(); // Önbelleği kayıt ediyoruz, tekrar kullanmak için.

  •             format(mesaj, sizeof(mesaj), "%s adlı oyuncu kayıtlı. Giriş için lütfen şifrenizi girin:", Oyuncu[playerid][Isim]);

  •             ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_PASSWORD, "Giriş", mesaj, "Giriş", "Çıkış");

  •       }

  •       else

  •       {

  •             format(mesaj, sizeof(mesaj), "Hoşgeldin %s, şifreni girerek kayıt olabilirsin:", Oyuncu[playerid][Isim]);

  •             ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_PASSWORD, "Kayıt", mesaj, "Kayıt", "Çıkış");

  •       }

  •       return 1;

  • }



13. OyuncuKaydet oyuncu verilerinin yüklenmesini sağlayacak publici oluşturalım.

  • forward OyuncuKaydet(playerid);

  • public OyuncuKaydet(playerid)

  • {

  •       Oyuncu[playerid][SQLID] = cache_insert_id(); // Oyuncu yeni kayıt olduğu zaman AUTO_INCREMENT ile sıradaki ID'yi SQLID'değişkenine atıyoruz.

  •       SendClientMessage(playerid, -1, "Başarıyla kayıt oldunuz, otomatik giriş yapıldı.");

  •       Oyuncu[playerid][Pos][0] = 1510.3158;

  •       Oyuncu[playerid][Pos][1] = -1668.4236;

  •       Oyuncu[playerid][Pos][2] = 14.0469;

  •       SetSpawnInfo(playerid, NO_TEAM, 0, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2], 0, 0, 0, 0, 0, 0, 0);

  •       SpawnPlayer(playerid);

  •       return 1;

  • }



14. OyuncuGuncelle oyuncu verilerinin güncellenmesini sağlayacak fonksiyonu oluşturalım.

  • OyuncuGuncelle(playerid)

  • {

  •       Oyuncu[playerid][Silah] = GetPlayerWeapon(playerid);

  •       GetPlayerPos(playerid, Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2]);

  •       new sorgu[190];

  •       mysql_format(g_SQL, sorgu, sizeof(sorgu), "UPDATE `oyuncular` SET `x` = %f, `y` = %f, `z` = %f, `interior` = %d, `silah` = %d WHERE `id` = %d LIMIT 1", Oyuncu[playerid][Pos][0], Oyuncu[playerid][Pos][1], Oyuncu[playerid][Pos][2], GetPlayerInterior(playerid), Oyuncu[playerid][Silah], Oyuncu[playerid][SQLID]);

  •       mysql_tquery(g_SQL, sorgu);

  •       return 1;

  • }



15. Şimdi phpMyAdmin üzerinden veritabanı ve sütunları oluşturalım.

  • 15.1 Yeni butonuna basarak yeni bir veritabanı oluşturuyoruz.


  • 15.2 Veritabanına bir isim veriyoruz.


  • 15.3 Oyuncular adında tablo oluşturuyoruz.


  • 15.4 Sütunları verilerimize göre ayarlıyoruz.


  • 15.5 Sütunları verilerimize göre ayarlıyoruz.


  • 15.6 Kaydet butonuna tıklayıp tablomuzu oluşturuyoruz.


  • 15.7 Tablonun son hali ise şu şekilde olmalıdır.




Son
Anlatımda kafanıza takılan soruları veya hataları konu altından belirtebilirsiniz, adımları takip ederseniz sorunsuz bir şekilde yapabilirsiniz. İyi kullanımlar.


İçerik kodlarının kullanıldığı ve eklemeler yapıldığı kaynak; https://goo.gl/5KUSuX
Son düzenlenme: 23 Temmuz 2018, 04:41:06 jensen

pag

Anlatım için teşekkürler, kod içeren kısımları [/pawn] içerisine alırsan daha iyi olabilir.


jensen

Alıntı yapılan: ReDDooM - 23 Temmuz 2018, 09:56:41

Anlatım için teşekkürler, kod içeren kısımları [/pawn] içerisine alırsan daha iyi olabilir.

Bu şekilde daha sade bir görünüm veriyor, konu zaten add-on konusu değil.


ace

Alıntı yapılan: jensen - 23 Temmuz 2018, 09:59:18

Alıntı yapılan: ReDDooM - 23 Temmuz 2018, 09:56:41

Anlatım için teşekkürler, kod içeren kısımları [/pawn] içerisine alırsan daha iyi olabilir.

Bu şekilde daha sade bir görünüm veriyor, konu zaten add-on konusu değil.

Bencede [/pawn ] veya [ /code] görünümünden daha güzel görünüyor.
Ellerine sağlık ÖM bakarmısın?


Matite

https://sampmobile.com
179.61.147.180:7777

starhan01


Akro

Eline, emeğine sağlık güzel anlatım olmuş. :)

Akro

[R]ussell_Savrinn

Eline sağlık! Çok yararlı bir konu olmuş  :helal:


SpooK

Paylaşım için teşekkürler

Oyundan çıkarken çıktığımız yeri kaydetmiyor x y z olarak
Son düzenlenme: 25 Ağustos 2018, 15:00:23 SpooK
YOTUBUE KANALIM
ABONE OL

_Code

Hoş bir anlatım olmuş, eline sağlık.





SA:MP Turkiye CnR IP: server.sampturkiyecnr.com:7777

Zoxy


Mehmet!

↬ MedceziR

jensen


Codes.

Böyle bir hata alıyorum ama anlamadım

PAWN Kodu: Seç
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(91) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(92) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(115) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(168) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(169) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(171) : warning 219: local variable "sorgu" shadows a variable at a preceding level
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(182) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(183) : warning 217: loose indentation
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(390) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(392) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(393) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(395) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(397) : error 021: symbol already defined: "SHA256_PassHash"
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(398) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(413) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(418) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(420) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(421) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(422) : error 010: invalid function or declaration
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(425) : error 021: symbol already defined: "mysql_format"
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(464) : warning 219: local variable "sorgu" shadows a variable at a preceding level
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(396) : warning 203: symbol is never used: "sifresakla"
D:\BordoBereli Gaming - Hırsız Polis\gamemodes\BordoBereliHP.pwn(424) : warning 203: symbol is never used: "sorgu"
Pawn compiler 3.10.9 Copyright (c) 1997-2006, ITB CompuPhase


12 Errors.


hex