[Tutorial] Creando un sistema de Login/Registro [MySQL - R7]
#1

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>
Ahн importamos las funciones del include al archivo .pwn
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;
}
Despuйs en OnPlayerConnect pondremos este cуdigo para que se muestre el dialog correctamente:
pawn Код:
public OnPlayerConnect(playerid)
{
   CheckPlayer(playerid);
   return 1;
}
Bien, todavнa no inicien el samp-server ya que como no tienen creada su base de datos ni sus tablas no podrбn realizar nada. Asн que suponiendo que el WAMP estб instalado lo iniciaremos y luego haremos click derecho en el icono que nos aparecerб en la barra de tareas al lado del reloj de la PC
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;
}
Esta callback sirve para fijarse si el jugador existe en la base de datos
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;
}
Bien aun nos queda por armar el enum para poder registrar los datos, pondremos esto arriba de todo debajo de los includes
pawn Код:
enum pInfo
{
    pPassword[128],
    pAdmin,
    pScore,
    Float:pVida,
    Float:pChaleco,
    Float:pPosx,
    Float:pPosy,
    Float:pPosz
};
new PlayerInfo[MAX_PLAYERS][pInfo];
Aquн viene la parte mбs importante de todo, esto es lo que comprueba y registra al jugador.

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;
}
Ahora la parte mбs sencilla:
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;
}
Despuйs en OnPlayerDisconnect:
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    SaveAccount(playerid);
    return 1;
}
Y luego el public para guardar la cuenta:
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 ahн ya tendrнa que estar terminado el login/registro obviamente pueden aсadir mбs campos y variables usandolo como ejemplo o lo que sea. Todo queda a su imaginaciуn, en caso de que me falte algo favor de avisarme y lo corregirй lo mismo si hayan algъn bug (yo no encontrй ninguno).
Bien gracias por leer.
Reply


Messages In This Thread
Creando un sistema de Login/Registro [MySQL - R7] - by JustBored - 07.05.2013, 04:09
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by pinpon - 07.05.2013, 04:13
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by JustBored - 07.05.2013, 04:15
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by Dreyfuz - 07.05.2013, 13:31
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by xSDx - 07.05.2013, 15:28
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by Loox - 07.05.2013, 16:31
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by killing18 - 07.05.2013, 17:19
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by Parka - 07.05.2013, 17:49
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by Matyaas - 07.05.2013, 19:35
Re: Creando un sistema de Login/Registro [MySQL - R7] - by Onfroi - 07.05.2013, 22:50
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by JustBored - 08.05.2013, 00:10
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by killing18 - 08.05.2013, 01:20
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by JustBored - 08.05.2013, 02:10
Re: Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by Jovazxc - 08.05.2013, 02:43
Re: Creando un sistema de Login/Registro [MySQL - R7] - by Zohaan - 17.02.2014, 19:33
Respuesta: Re: Creando un sistema de Login/Registro [MySQL - R7] - by xGrov3x - 18.02.2014, 03:45
Respuesta: Creando un sistema de Login/Registro [MySQL - R7] - by Zohaan - 20.02.2014, 21:47
Re: Respuesta: Re: Creando un sistema de Login/Registro [MySQL - R7] - by redneckvideogamer - 20.02.2014, 22:36
Respuesta: Re: Respuesta: Re: Creando un sistema de Login/Registro [MySQL - R7] - by xGrov3x - 21.02.2014, 04:07

Forum Jump:


Users browsing this thread: 1 Guest(s)