Database & Penyimpanan
SQLite dan MySQL dari gamemode, sinkron dan asinkron.
SQLite
knight
system::start() {
let db = sqlite_open("data/accounts.db");
sqlite_exec(db, "CREATE TABLE IF NOT EXISTS accounts (name TEXT PRIMARY KEY, score INTEGER)");
};
player::command("/save", int score) {
let db = sqlite_open("data/accounts.db");
sqlite_exec(db, "INSERT OR REPLACE INTO accounts VALUES (?, ?)", PlayerName(playerid), score);
};
player::command("/load") {
let db = sqlite_open("data/accounts.db");
let idx = sqlite_query(db, "SELECT score FROM accounts WHERE name = ?", PlayerName(playerid));
if (idx != null) {
SendClientMessage(playerid, "skor = {cache_get_value_name_int(idx, 0, "score")}");
}
};
Query asinkron
Untuk query lambat, gunakan varian asinkron dengan callback bernama. Berjalan di luar tick loop.
knight
function onScore(result, err) {
if (err == "") {
Log("baris = " + str(cache_get_row_count(result)));
}
}
player::command("/load") {
let db = sqlite_open("data/accounts.db");
sqlite_query_async(db, "onScore", "SELECT score FROM accounts");
};
Password
knight
let hash = hash_password(password);
if (verify_password(input, hash)) {
SendClientMessage(playerid, "Berhasil login.");
}
Warning
Selalu gunakan placeholder
? untuk input pengguna. Jangan menyusun SQL dari penggabungan string.Database mana?
| Backend | Cocok untuk | Detail |
|---|---|---|
| SQLite | Satu server, data kecil/menengah | Panduan SQLite |
| MySQL | Database eksternal, banyak server, data besar | Panduan MySQL |