Skip to content

Cookbook

Xyranaut edited this page Jun 1, 2026 · 3 revisions

Cookbook — copy-paste recipes

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.


Save a player's money on disconnect

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;
}

Load money on login and apply it

// 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;
}

A /stats command

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;
}

Count how many accounts exist

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;
}

Check if a name is taken (registration)

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;
}

Periodic autosave (timer)

// 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;
}

A top-10 leaderboard

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;
}

Insert and get the new id

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.

Clone this wiki locally