07.10.2016, 18:20
Код:
// 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