-
Notifications
You must be signed in to change notification settings - Fork 0
Cookbook
Xyranaut edited this page Jun 1, 2026
·
3 revisions
Small, practical snippets for everyday tasks. They assume you have a connected
g_DB (see Getting started) and a logged-in player with a known
account id in g_AccountId[playerid].
All player-input examples use prepared statements or
%e— never glue strings.
public OnPlayerDisconnect(playerid, reason)
{
if (g_AccountId[playerid] == 0) return 1; // not logged in
new PreparedStatement:st = mysql_prepare(g_DB,
"UPDATE accounts SET money = ? WHERE id = ?");
mysql_stmt_set_int(st, 1, GetPlayerMoney(playerid));
mysql_stmt_set_int(st, 2, g_AccountId[playerid]);
mysql_stmt_execute(st); // fire-and-forget; no callback needed
return 1;
}// after verifying the password:
new PreparedStatement:st = mysql_prepare(g_DB, "SELECT money FROM accounts WHERE id = ?");
mysql_stmt_set_int(st, 1, g_AccountId[playerid]);
mysql_stmt_execute(st, "OnMoneyLoaded", "d", playerid);
forward OnMoneyLoaded(playerid);
public OnMoneyLoaded(playerid)
{
new money;
mysql_rs_get_int_by(0, "money", money);
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, money);
return 1;
}public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp(cmdtext, "/stats", true) == 0)
{
new PreparedStatement:st = mysql_prepare(g_DB,
"SELECT money, score FROM accounts WHERE id = ?");
mysql_stmt_set_int(st, 1, g_AccountId[playerid]);
mysql_stmt_execute(st, "OnStats", "d", playerid);
return 1;
}
return 0;
}
forward OnStats(playerid);
public OnStats(playerid)
{
new money, score, msg[96];
mysql_rs_get_int_by(0, "money", money);
mysql_rs_get_int_by(0, "score", score);
format(msg, sizeof msg, "Money: $%d | Score: %d", money, score);
SendClientMessage(playerid, 0x33CCFFFF, msg);
return 1;
}mysql_execute(g_DB, "SELECT COUNT(*) AS c FROM accounts", "OnCount");
forward OnCount();
public OnCount()
{
new c; mysql_rs_get_int_by(0, "c", c);
printf("Total accounts: %d", c);
return 1;
}new PreparedStatement:st = mysql_prepare(g_DB,
"SELECT id FROM accounts WHERE name = ? LIMIT 1");
mysql_stmt_set_string(st, 1, name);
mysql_stmt_execute(st, "OnNameCheck", "d", playerid);
forward OnNameCheck(playerid);
public OnNameCheck(playerid)
{
new rows; mysql_rs_row_count(rows);
if (rows > 0)
SendClientMessage(playerid, 0xFF6666FF, "That name is already registered.");
// else: free to register
return 1;
}// in OnGameModeInit / OnFilterScriptInit:
SetTimer("AutoSave", 120000, true); // every 2 minutes
forward AutoSave();
public AutoSave()
{
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (!IsPlayerConnected(i) || g_AccountId[i] == 0) continue;
new PreparedStatement:st = mysql_prepare(g_DB,
"UPDATE accounts SET money = ?, score = ? WHERE id = ?");
mysql_stmt_set_int(st, 1, GetPlayerMoney(i));
mysql_stmt_set_int(st, 2, GetPlayerScore(i));
mysql_stmt_set_int(st, 3, g_AccountId[i]);
mysql_stmt_execute(st);
}
return 1;
}mysql_execute(g_DB,
"SELECT name, score FROM accounts ORDER BY score DESC LIMIT 10", "OnTop10");
forward OnTop10();
public OnTop10()
{
new rows; mysql_rs_row_count(rows);
for (new r = 0; r < rows; r++)
{
new name[24], score, line[64];
mysql_rs_get_string_by(r, "name", name, sizeof name);
mysql_rs_get_int_by(r, "score", score);
format(line, sizeof line, "#%d %s - %d", r + 1, name, score);
// print or send to a player...
}
return 1;
}mysql_execute(g_DB, "INSERT INTO vehicles (model, owner_id) VALUES (411, 5)", "OnVehAdded");
forward OnVehAdded();
public OnVehAdded()
{
printf("new vehicle row id = %d", mysql_rs_insert_id());
return 1;
}More patterns are in the full mysql-admin demo. Stuck? See Troubleshooting.
Understand
Use
- Installing MySQL
- Docker Compose
- Getting started
- Configuration
- SQL crash course
- Designing your tables
- Storing game data
- Dates & times
- First queries
- Async patterns
- Reading results
- Prepared statements
- Passwords & hashing
- Transactions
- Models (active-record)
- Tutorial: login system
- mysql-admin demo
Deeper
Reference