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 DosyalarMySQL R41-4 (https://github.com/p#4180e2G/SA-MP-MySQL/releases/download/R41-4/mysql-R41-4-win32.zip)
Kurulum1. 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.
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;
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.
- (https://www.upload.ee/image/8659189/resim1.png)
- 15.2 Veritabanına bir isim veriyoruz.
- (https://www.upload.ee/image/8659194/resim2.png)
- 15.3 Oyuncular adında tablo oluşturuyoruz.
- (https://www.upload.ee/image/8659198/resim3.png)
- 15.4 Sütunları verilerimize göre ayarlıyoruz.
- (https://www.upload.ee/image/8659181/resim4.png)
- 15.5 Sütunları verilerimize göre ayarlıyoruz.
- (https://www.upload.ee/image/8659213/resim7.png)
- 15.6 Kaydet butonuna tıklayıp tablomuzu oluşturuyoruz.
- (https://www.upload.ee/image/8659209/resim5.png)
- 15.7 Tablonun son hali ise şu şekilde olmalıdır.
- (https://www.upload.ee/image/8659247/resim6.png)
SonAnlatı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
Anlatım için teşekkürler, kod içeren kısımları [/pawn] içerisine alırsan daha iyi olabilir.
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.
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?
Eline sağlık.
Anlatım için Teşekkürler.
Eline, emeğine sağlık güzel anlatım olmuş. :)
Eline sağlık! Çok yararlı bir konu olmuş :helal:
Paylaşım için teşekkürler
Oyundan çıkarken çıktığımız yeri kaydetmiyor x y z olarak
Hoş bir anlatım olmuş, eline sağlık.
Anlatım için teşekkürler.
Teşekkürler.
Böyle bir hata alıyorum ama anlamadım
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.
ANlatımın için teşekür ederim
Güzel bir anlatım olmuş eline sağlık 🙏
Güzel anlatım :helal:
Teşekkürler.
Güzel anlatım, teşekkürler.
Anlatımın çok iyiymiş, yararlı. Başarılarının devamını dilerim. ;)
Teşekkürler.
Anlatım için teşekkürler. :helal:
Anlatım için teşekkürler.
Anlatım çok iyi olmuş teşekkürler.
Yararlı.
Konuyu hortlatıyorum fakat bu hatayı alıyorum.
[19:25:53] --- Server Shutting Down.
[19:25:53] plugin.mysql: Unloading plugin...
[19:25:53] plugin.mysql: Plugin unloaded.
Alıntı yapılan: smalark - 18 Aralık 2019, 19:28:36Konuyu hortlatıyorum fakat bu hatayı alıyorum.
[19:25:53] --- Server Shutting Down.
[19:25:53] plugin.mysql: Unloading plugin...
[19:25:53] plugin.mysql: Plugin unloaded.
MySQL Bağlantısını yap.
MySQL bağlantısını yaptım fakat bunu diyor, kesin yine bir şeyleri gözden kaçırıyorum.
admin, skor, para öldürme, ölüm gibi şeylerin eklenmiş hali olan var mıdır?
15. adım olan phpmyadmin kısmı anlatımında sanırsam resim eklediğin için gözükmüyor resimler olmaması dolayısıyla hiçbirşey anlayamadım..
konuyu güncellemeni veya alıntılayarak anlatmanı rica edebilir miyim ?
eyv
Hoş iyi bir anlatım sağol :)
sağol
Eyv jensen abi :helal: