Si es SQLite tengo esto de hace unos aсos que hice para que no se me olvidara.
Код:
// BASE PARA HACER Y RECORDAR EL USO DE SQLITE
#include <a_samp>
new DB:General; // Nueva variable para almacenar la base de datos
enum UserData
{
ID,
Nombre[MAX_PLAYER_NAME],
Password[128],
Admin
}
new User[MAX_PLAYERS][UserData];
main() {}
public OnGameModeInit()
{
General = db_open("general.db"); // Defino la base de datos
db_query(General, "PRAGMA synchronous = OFF"); // Seguridad ante perdida de datos
// Si no existe la tabla ЋusersЋ la crea con los lugares:
// userid: Un integer que se autoincrementa
// username: String de 24 celdas que no distingue entre mayъsculas y minъsculas (ElGuille, elguille)
// password: String de 128 celdas
// admin: Un integer que por defecto tiene el valor 0 (cuando se registre serб 0) y no estб nulo
db_query(General, "CREATE TABLE IF NOT EXISTS users (userid INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(24) COLLATE NOCASE, password VARCHAR(128), admin INTEGER DEFAULT 0 NOT NULL)");
return 1;
}
public OnGameModeExit()
{
db_close(General);
return 1;
}
public OnPlayerConnect( playerid )
{
for( new i; i < _: UserData; ++i ) User[ playerid ][ UserData: i ] = 0; // Limpia las variables del usuario anterior
GetPlayerName(playerid, User[playerid][Nombre], MAX_PLAYER_NAME); // Obtiene el nombre del jugador y lo guarda
new DBResult:Resultado, Query[512];
// Selecciono ЋpasswordЋ de la tabla ЋusersЋ donde el ЋusernameЋ es el nombre del usuario
format(Query, sizeof(Query), "SELECT password FROM users WHERE username = '%q' LIMIT 0, 1", User[playerid][Nombre]);
Resultado = db_query(General, Query); // Almaceno el resultado del Query
if (db_num_rows(Resultado)) // Si hay una fila o mбs con el nombre del usuario significa que estб registrado
{
db_get_field_assoc(Resultado, "password", User[playerid][Password], 128); // Almacenamos la contraseсa obtenida de la base de datos a la variable
// ...
}
else
{
// El usuario no estб registrado
}
db_free_result(Resultado); // Libero el resultado
return 1;
}
public OnPlayerDisconnect( playerid, reason )
{
new Query[512];
// Actualiza el campo ЋadminЋ al nivel de admin actual
format(Query, sizeof(Query), "UPDATE users SET admin = %i WHERE username = '%q'", User[playerid][Admin], User[playerid][Nombre]);
db_query(General, Query);
for( new i; i < _: UserData; ++i ) User[ playerid ][ UserData: i ] = 0; // Limpia las variables del usuario
return 1;
}
stock Registro() // Esto es una funciуn inъtil y sin funcionalidad correcta, deberнa ser incluida en un diбlogo
{
new Query[512];
// Inserta en la tabla ЋusersЋ el nombre y contraseсa. El ID de usuario se incrementa automбticamente y el admin se pone en 0
format(Query, sizeof(Query), "INSERT INTO users (username, password) VALUES ('%q', '%q')", User[playerid][Nombre], User[playerid][Password]);
db_query(General, Query);
// USUARIO REGISTRADO
}
stock Logeo() // Esto es una funciуn inъtil y sin funcionalidad correcta, deberнa ser incluida en un diбlogo
{
new DBResult:Resultado, Query[512];
// Selecciono todos los campos de la tabla ЋusersЋ donde el usuario es el nombre del jugador
format(Query, sizeof(Query), "SELECT * FROM users WHERE username = '%q' LIMIT 0, 1", User[playerid][Nombre]);
Resultado = db_query(General, Query);
if (db_num_rows(Resultado)) // Si hay filas donde el username sea el Nombre del jugador
{
db_get_field_assoc(Resultado, "userid", Query, 5); // Obtengo del resultado el valor de ЋuseridЋ
User[playerid][ID] = strval(Query); // Y convierto el resultado en integer y lo guardo
db_get_field_assoc(Resultado, "admin", Query, 2);
User[playerid][Admin] = strval(Query);
// DATOS CARGADOS Y USUARIO LOGEADO
}
db_free_result(Resultado); // Libero el resultado (solo liberar cuando se hace SELECT)
}
// BASADO EN EL TUTORIAL DE KONSTANTINOS
// https://sampforum.blast.hk/showthread.php?tid=449536