[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
#2

Yo estaba pensando en hacer un tutorial de esto mismo..pero ati de todas maneras te quedт mejor :$

Nice
Reply
#3

Fuera de joda que estuve escribiendo una hora y 15 minutos clavados
Reply
#4

Jahhh...

Esta bueno yo que soy medio manco para aprender MySQL por culpa de que mi Wamp que no me deja iniciar los servicios y noce porque pero dah igual algъn dнa me servirб y aprenderй... pero igual buen tuto
Reply
#5

Puedes usar la sentencia "CREATE TABLE IF NOT EXIST ..." y asi te ahorras mucho tiempo en el wamp, solo tendrias que crear un usuario o ponerle una contraseсa al root.
Reply
#6

Bastante bueno, excelente esfuerzo.

+REP
Reply
#7

Quienes comentaron... їlo probaron?

Intente realizarlo desde un archivo en blanco, tal cual explicaste acб y me tira error de library directamente...

їJust lo probaste?

Pregunto enserio ya que mi idea era utilizarlo.

Mirando el cуdigo a simple vista de momento se ve PlayerInfo y en otros JugadorInfo
Reply
#8

Quote:
Originally Posted by killing18
Посмотреть сообщение
Quienes comentaron... їlo probaron?

Intente realizarlo desde un archivo en blanco, tal cual explicaste acб y me tira error de library directamente...

їJust lo probaste?

Pregunto enserio ya que mi idea era utilizarlo.

Mirando el cуdigo a simple vista de momento se ve PlayerInfo y en otros JugadorInfo
Que estъpida pregunta es esa la que le haces al creador del tutorial ?

se supone que al hacer el tutorial el Usuario el cual lo realizo fue
el primero en testear u o probar el tutorial o el script que esta aportando.
Reply
#9

Soy nuevito en sql y creo que entendн xD pero tengo una duda... para que sirve MYSQL en samp? mejor rapidez? alguien me explica? graicas, saludos!
Reply
#10

Bueno tutorial, aunque yo uso XAMPP envez de WAMP, es mas rapido para mi.
Reply
#11

Ya estб ya lo corregн perdonen las molestias.
Reply
#12

Habнa notado la falta de los forward pero los coloque y seguнa dбndome errores de mysql.

Ahora si, compilo a la perfecciуn, muchнsimas gracias.

Ahora te enviу un MP por unas preguntas
Reply
#13

De nada.
Reply
#14

Quote:
Originally Posted by Parka
Посмотреть сообщение
Que estъpida pregunta es esa la que le haces al creador del tutorial ?

se supone que al hacer el tutorial el Usuario el cual lo realizo fue
el primero en testear u o probar el tutorial o el script que esta aportando.
Y quien te dijo que todos los tutoriales hechos son testeados antes de publicarse, Vez, el usuario tenнa la razon, el cуdigo tenia errores..


Buen trabajo Bored
Reply
#15

Me sale esto:
C:\Users\Agustin\Desktop\AM-RP\gamemodes\CiudadLuz.pwn(29) : warning 217: loose indentation
C:\Users\Agustin\Desktop\AM-RP\gamemodes\CiudadLuz.pwn(40) : warning 217: loose indentation
C:\Users\Agustin\Desktop\AM-RP\gamemodes\CiudadLuz.pwn(50) : warning 217: loose indentation
Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase


3 Warnings.

Lineas

29: Conecction = mysql_connect(MySQL_Servidor, MySQL_Usuario, MySQL_BD,MySQL_Clave);
40: return 1;
50: return 1;

Espero que me puedan ayudar.
Reply
#16

Quote:
Originally Posted by Zohaan
View Post
Me sale esto:
C:\Users\Agustin\Desktop\AM-RP\gamemodes\CiudadLuz.pwn(29) : warning 217: loose indentation
C:\Users\Agustin\Desktop\AM-RP\gamemodes\CiudadLuz.pwn(40) : warning 217: loose indentation
C:\Users\Agustin\Desktop\AM-RP\gamemodes\CiudadLuz.pwn(50) : warning 217: loose indentation
Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase


3 Warnings.

Lineas

29: Conecction = mysql_connect(MySQL_Servidor, MySQL_Usuario, MySQL_BD,MySQL_Clave);
40: return 1;
50: return 1;

Espero que me puedan ayudar.
Agrega al incio de tu Gamemode esto: #pragma tabsize 0
Reply
#17

Tengo una duda, cuando pongo la estructura en la base de datos їtengo que poner como lo definн en el GM? osea con el "p" o "j" segъn lo tenga, ejemplo: En el GM tengo "jVida", їen la estructura tambiйn tengo que poner asн?
Reply
#18

Quote:
Originally Posted by xGrov3x
View Post
Agrega al incio de tu Gamemode esto: #pragma tabsize 0
No hagas eso! Si los warnings aparecen son por algo!

El warning te salta porque las tabulaciones en el codigo no coinciden, es decir, esta desordenado (lo mas probable es porque lo paso al foro, y ahi se movio todo) Lo que tienes que hacer es acomodarlo y ya esta
Reply
#19

Quote:
Originally Posted by redneckvideogamer
View Post
No hagas eso! Si los warnings aparecen son por algo!

El warning te salta porque las tabulaciones en el codigo no coinciden, es decir, esta desordenado (lo mas probable es porque lo paso al foro, y ahi se movio todo) Lo que tienes que hacer es acomodarlo y ya esta
Exactamente, dichos warnings salen por que la tabulaciуn del codigo no coincide, aunque ello le veo mas para ordenar, y te dara una joda siempre que agreges un codigo mal tabulado, Saludos.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)