07.05.2013, 04:09
(
Последний раз редактировалось JustBored; 02.08.2014 в 02:58.
Причина: Fixed
)
Creando un sistema de login/registro en MySQL(R7)
Introducciуn
Bien, la idea de este tutorial es enseсar a los usuarios nuevos en MySQL a manipular el mismo y a poder crear un sistema de registro / login utilizando la ъltima versiуn de MySQL la cual es la R7. El mismo fue realizado por BlueG lanzando su primera versiуn el 29 de noviembre de 2008 y desde ese momento lo ha estado actualizando hasta llegar a la release nъmero 7 (R7).
їQuй necesitaremos?
Necesitaremos los siguientes plugins/includes:
Includes:
a_mysql
Plugins:
libmysql.dll
mysql.dll
msvcr100 (Opcional)
Programas:
WAMP
Descargas:
mysql.dll | a_mysql.inc
Nota: el include y el plugin vienen incluidos en el .rar
libmysql.dll
msvcr100.dll
WAMP
Comenzando:
Bien, abriremos nuestro GM o en su defecto un nuevo archivo .pwn borraremos el contenido y aсadiremos el siguiente include:pawn Код:
#include <a_mysql>
Bien luego crearemos una funciуn para poder iniciar la conexiуn al servidor MySQL y a la database. Yo a mi tabla le pondrй 'usuarios' y a la base de datos le pondrй db mi usuario serб root y lo pondrй en localhost. Bien en la callback OnGameModeInit pondremos el siguiente cуdigo
pawn Код:
#define MySQL_Servidor "localhost"
#define MySQL_Usuario "root"
#define MySQL_BD "db"
#define MySQL_Clave "" //no le ponemos clave ya que no tendrнa sentido.
#define LOGIN 1
#define REGISTRO 2
new Conecction;
public OnGameModeInit()
{
printf("Iniciando conexiуn MySQL: (Servidor: '%s', Usuario: '%s', Clave: '%s', Base de Datos: '%s')", MySQL_Servidor, MySQL_Usuario, MySQL_Clave, MySQL_BD);
Conecction = mysql_connect(MySQL_Servidor, MySQL_Usuario, MySQL_BD,MySQL_Clave);
if(mysql_ping() == 1) //Comprobamos si se conectу
{
printf("Conexiуn a la base de datos realizada correctamente.");
}
else //Caso contrario:
{
print("Conexiуn a la base de datos no realizada.");
mysql_close(); //Cerramos la conexiуn
SendRconCommand("exit"); //Cerramos la consola para evitar bug's
}
return 1;
}
pawn Код:
public OnPlayerConnect(playerid)
{
CheckPlayer(playerid);
return 1;
}
Ahн clickeamos en 'Iniciar servicios' y una ves que el icono del WAMP estй en color verde
clickearemos en phpMyAdmin y nos aparecerб una ventana masomenos asн (Yo lo uso con Mozilla, aunque me arrepiento debido a su lentitud.)
http://i.imgur.com/2Qw6WKH.png (Lo pongo asн porque sino me desfigura toda la pбgina)
Bien ahн clickearemos en Base de Datos y nos aparecerб una ventana masomenos asн
Y ahн donde dice 'Crear Base de datos' le pondremos el nombre yo le puse db y el 'Cotejamiento' lo dejaremos como estб luego clickeamos en 'Crear' y nos llevarб a una ventana que dice que no hay tablas creadas, nosotros crearemos una llamada 'usuarios'.
Bien estб ventana nos aparecerб:
Yo harй estos campos:
Nombre
Contraseсa
Admin
Score
Vida
Chaleco
Posiciуn-x
Posiciуn-y
Posiciуn-z
Asн que pondremos lo siguiente:
En el primer campo le pondremos de nombre 'Nombre' despuйs en tipo 'VARCHAR' y en longitud 30.
En el segundo campo pondremos de nombre 'Contraseсa' y serб de tipo 'VARCHAR' y longitud 128.
Tercer campo le pondremos de nombre 'Admin' y serб de tipo 'INT' y 4 en longitud.
Cuarto que serб el score de nombre le pondremos 'Score' y serб de tipo INT y 4 en longitud.
Despuйs en el quinto le ponemos de nombre 'Vida' tipo 'FLOAT' y longitud 4
NOTA: Para evitar que el jugador muera tendrбn que abrir la casilla que dice 'Predeterminado' y clickear en 'Personalizado' y ahн poner la cantidad de vida que querrбn que tenga el jugador cuando spawnee por primera vez. Lo mismo puede aplicarse a 'Chaleco'
Sexto que es el chaleco pondremos lo mismo que en 'vida' pero le cambiamos el nombre a 'Chaleco'.
Despuйs las posiciones que son las ъltimas 3 le ponemos de tipo 'FLOAT' y sin longitud de nombre le ponemos a la primera 'Posx' a la segunda 'Posy' a la tercera 'Posz' y despuйs clickearemos en 'Guardar'.
Cuando hayan completado todo tendrбn algo asн:
Una ves completado todo esto ya tendrбn creada su database con su tabla correspondiente.
Bien ahora crearemos 2 callbacks, una para un error y otra para chequear si los jugadores estбn registrados.
Esta callback estб para cuando ocurre un error en un query.
pawn Код:
public OnQueryError(errorid, error[], callback[], query[], connectionHandle )
{
printf("[ERROR] ID: %d - Error: %s - Callback - %s - Query: %s", errorid, error, callback, query); //Imprimimos el mensaje en la consola
return 1;
}
pawn Код:
forward CheckPlayer(playerid);
public CheckPlayer(playerid)
{
new pName[24], Query[256];
GetPlayerName(playerid, pName, 24);
format(Query, sizeof(Query), "SELECT * FROM `usuarios` WHERE Nombre='%s'", pName);
mysql_function_query(Conecction, Query, true, "OnQueryFinish", "ii",2, playerid);
return 1;
}
pawn Код:
enum pInfo
{
pPassword[128],
pAdmin,
pScore,
Float:pVida,
Float:pChaleco,
Float:pPosx,
Float:pPosy,
Float:pPosz
};
new PlayerInfo[MAX_PLAYERS][pInfo];
pawn Код:
forward OnQueryFinish(resultid, extraid, ConnectionHandle);
public OnQueryFinish(resultid, extraid, ConnectionHandle)
{
new Rows, Field, string[256];
if(resultid != 0)
{
cache_get_data(Rows, Field);
}
switch(resultid)
{
case 1:
{
if(Rows == 1)
{
new content[20];
cache_get_field_content(0, "Password", PlayerInfo[extraid][pPassword]);
cache_get_field_content(0, "Score", content); PlayerInfo[extraid][pScore] = strval(content);
cache_get_field_content(0, "Vida", content); PlayerInfo[extraid][pVida] = floatstr(content);
cache_get_field_content(0, "Chaleco", content); PlayerInfo[extraid][pChaleco] = floatstr(content);
cache_get_field_content(0, "posX", content); PlayerInfo[extraid][pPosx] = floatstr(content);
cache_get_field_content(0, "posY", content); PlayerInfo[extraid][pPosy] = floatstr(content);
cache_get_field_content(0, "posZ", content); PlayerInfo[extraid][pPosz] = floatstr(content);
SetSpawnInfo(extraid,0,0, PlayerInfo[extraid][pPosx],PlayerInfo[extraid][pPosy],PlayerInfo[extraid][pPosz],0.0,0,0,0,0,0,0);
SetPlayerScore(extraid, PlayerInfo[extraid][pScore]);
SetPlayerArmour(extraid, PlayerInfo[extraid][pChaleco]);
SetPlayerHealth(extraid, PlayerInfo[extraid][pVida]);
}
else if(!Rows)
{
//
}
}
case 2:
{
if(Rows == 1)
{
new pName[24]; GetPlayerName(extraid, pName, 24);
cache_get_field_content(0, "Password", PlayerInfo[extraid][pPassword]);
format(string, sizeof(string), "El personaje %s estб registrado en la base de datos. Pon los datos para iniciar sesiуn:", pName);
ShowPlayerDialog(extraid, LOGIN, DIALOG_STYLE_PASSWORD,"Login",string,"Enviar","Salir");
}
else if(!Rows)
{
new pName[24]; GetPlayerName(extraid, pName, 24);
format(string, sizeof(string), "El jugador %s no estб registrado en el servidor, pon aquн la contraseсa para registrarlo:", pName);
ShowPlayerDialog(extraid, REGISTRO, DIALOG_STYLE_PASSWORD,"Registro:",string,"Enviar","Salir");
}
}
}
return 1;
}
Esto va en OnDialogResponse
pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new string[256];
new pName[24], Query[256]; GetPlayerName(playerid, pName, 24);
switch(dialogid)
{
case LOGIN:
{
if(!response)
{
Kick(playerid);
}
if(strcmp(PlayerInfo[playerid][pPassword], inputtext, true, 128) == 0)
{
format(Query, sizeof(Query), "SELECT * FROM `usuarios` WHERE `Nombre` = '%s'", pName);
mysql_function_query(Conecction, Query, true, "OnQueryFinish", "ii", 1, playerid);
SetSpawnInfo(playerid,0,0,PlayerInfo[playerid][pPosx], PlayerInfo[playerid][pPosy], PlayerInfo[playerid][pPosz],0,0,0,0,0,0,0);
SetPlayerHealth(playerid, PlayerInfo[playerid][pVida]);
SetPlayerArmour(playerid, PlayerInfo[playerid][pChaleco]);
SetPlayerScore(playerid, PlayerInfo[playerid][pScore]);
SpawnPlayer(playerid);
}
else
{
SendClientMessage(playerid, -1, "CONTRASEСA INCORRECTA");
Kick(playerid);
}
}
case REGISTRO:
{
if(!response)
{
SendClientMessage(playerid, -1, "Kicked");
Kick(playerid);
}
if(response)
{
if(!strlen(inputtext))
{
Kick(playerid);
}
new string2[128];
format(string2, sizeof(string2), "%s", inputtext); PlayerInfo[playerid][pPassword] = string2;
format(Query, sizeof(Query), "INSERT INTO `usuarios` (Nombre, Contraseсa) VALUES ('%s', '%s')",pName, PlayerInfo[playerid][pPassword]);
mysql_function_query(Conecction, Query, true, "OnQueryFinish", "ii", 0, playerid);
format(string, sizeof(string), "Has registrado el personaje %s en nuestro servidor.\n\nAhora inicia sesiуn", pName);
ShowPlayerDialog(playerid, LOGIN, DIALOG_STYLE_PASSWORD,"Iniciar sesiуn",string,"Enviar","Salir");
}
}
}
return 1;
}
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
SaveAccount(playerid);
return 1;
}
pawn Код:
forward SaveAccount(playerid);public SaveAccount(playerid)
{
new query[200];GetPlayerPos(playerid, PlayerInfo[playerid][pPosx], PlayerInfo[playerid][pPosy], PlayerInfo[playerid][pPosz]);
new pName[24]; GetPlayerName(playerid, pName, 24); GetPlayerHealth(playerid, PlayerInfo[playerid][pVida]), GetPlayerArmour(playerid, PlayerInfo[playerid][pChaleco]);
format(query, 200, "UPDATE `usuarios` SET `Vida`='%f', `Chaleco`='%f', `Admin`='%d', `Score`='%d', `Posx`='%f', `Posy`='%f', `Posz`='%f' WHERE `Nombre`='%s'", PlayerInfo[playerid][pVida], PlayerInfo[playerid][pChaleco],
PlayerInfo[playerid][pAdmin], PlayerInfo[playerid][pScore], PlayerInfo[playerid][pPosx], PlayerInfo[playerid][pPosy], PlayerInfo[playerid][pPosz], pName);
mysql_function_query(Conecction, query, true, "OnQueryFinish", "ii", 0, playerid);
return 1;
}
Bien gracias por leer.