[Tutorial] MySQL
#1



MySQL Tutorial
Bem jб nгo venho cб a alguns tempos e eu tinha prometido que iria fazer um tutorial sobre MySQL e aqui estou eu, entгo pessoal, primeiro de tudo espero que gostem do tutorial e que nгo postem nada que nгo tenha a ver com o conteъdo do tуpico, entгo й isso, vamos lб.

Bem primeiro de tudo, muita gente nгo deve saber o que й o MySQL, entгo aqui estб o que a Wikipedia diz.

Quote:

O MySQL й um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL (Linguagem de Consulta Estruturada, do inglкs Structured Query Language) como interface. Й atualmente um dos bancos de dados mais populares, com mais de 10 milhхes de instalaзхes pelo mundo.
Entre os usuбrios do banco de dados MySQL estгo: NASA, Friendster, Banco Bradesco, Dataprev, HP, Nokia, Sony, Lufthansa, U.S. Army, U.S. Federal Reserve Bank, Associated Press, Alcatel, Slashdot, Cisco Systems, ****** e outros.

ver mais
Bem como todos podem ver MySQL й muito ъtil, mas entгo porque? Porque MySQL й usado em muitas linguagens de programaзгo, por exemplo, php, c++, vb.net, c#, pawn, entre outras.

Na minha opiniгo alem de o MySQL ser mais fбcil de usar, й dinвmico e contem muita seguranзa. Para voce usar o MySQL no sa-mp й necessбrio fazer o download do plugin que foi criado pelo BlueG, atualmente o plugin estб na R7(Realese 7), muita gente continua a usar o antigo, mas a minha intenзгo й ensinar a nova versгo, porque eu comecei a trabalhar com ela e nгo com as versхes antigas, mas eu trago aqui um post em inglкs sobre uns resultados do MySQL r7

Quote:
Originally Posted by AndreT
Посмотреть сообщение
I have only ran tests with the house loading code, and here are some results (500 rows)...
With mysql_fetch_row, no caching
1. mysql_fetch_row calls took 3065 milliseconds
2. sscanf (parsing) took 27ms in total (500 calls to function)
3. the rest of the house loading code took 129ms (irrelevant)
Total: 3221ms

With caching
1. cache functions (loading and parsing) took 166ms
2. the rest of the house loading code took 108ms (irrelevant)
Total: 274ms

From this, we can tell that using the caching functions is about 12 times faster in such example (with loops and huge rows of data being returned).
O que ele quis dizer й que com este plugin podemos usar o cache que й 11x mais rapido que usar sscanf, por isso que eu acho que esta versгo й muito mais ъtil que as outras e sem falar que foram reparados alguns bugs claro.

Mas bem apуs voce ter colocado o plugin na pasta do seu servidor, voce deverб comeзar por colocar a include no topo do gamemode.

pawn Код:
#include <a_mysql>
Depois voce deverб comeзar a declarar as seguintes variбveis.

pawn Код:
new const
    mysql_host[] = "localhost",
    mysql_user[] = "root",
    mysql_database[] = "server",
    mysql_password[] = "1234";

new Query[500];
new MysqlC;
  • mysql_host
    • Aqui usaremos o nosso localhost, mas claro que caso voce tenha o seu host vocк deve colocar o ip que irгo dar a vocк claro.
  • mysql_user
    • Aqui usaremos o nosso root, porque no nosso computador normalmente й definido como root, como eu disse caso voce tenha um host o user serб difrente claro.
  • mysql_database
    • Aqui serб o nome da sua database.
  • mysql_password
    • Por fim, voce terб que colocar a password do seu banco de dados, no meu caso eu usei 1234, mas no host serб uma difrente.
  • Query
    • Esta string й muito grande pois o MySQL requere celulas grandes, no caso do php nгo й necessбrio definir, mas no pawn sim й necessбrio, no meu caso eu jб cheguei a usar 1500 celulas.
  • MysqlC
    • Esta variбvel й utilizada para guardar os dados da conexгo a database.
Mas claro que antes disso tudo voce deve ter algum conhecimento em MySQL, primeiro voce necessita de instalar o MySQL no seu computador, depois voce deverб usar o EasyPHP (eu sei, muita gente usa outros programas, mas й indiferente, porque alias, vocк pode entrar na sua database pelo comando do MySQL), depois disso tudo voce volta ao pawn e comeзa a declarar algumas publics, neste tutorial irei ensinar um sistema basico de login e registo.

Entгo, no inicio nуs comeзamos por definir aquelas coisas simples, agora vamos definir algumas coisas.

pawn Код:
#define MAX_SOLTS (25)
#define D_LOGIN 1
#define D_REGISTER 2

new PlayerName[25];

enum pInfo{
    pLevel,
    pMoney,
    pBank,
    pSkin,
    pWarn
};

new PlayerInfo[MAX_SOLTS][pInfo];
Bem como todos viram, isto aqui й sгo os dados o player, eu penso que todos jб sabem o que й isso certo, entгo depois de colocarem isso lб no gamemode voces devem definir as seguintes publics.

pawn Код:
forward MySQL_Start();
forward r@MySQL_Start(text[]);

forward MySQL_CheckAccount(playerid);
forward r@MySQL_CheckAccount(playerid);

forward MySQL_CheckPassword(playerid,password[]);
forward r@MySQL_CheckPassword(playerid);

forward MySQL_CreateAccount(playerid,password[]);
forward r@MySQL_CreateAccount(playerid);

forward MySQL_LoadAccount(playerid);
forward r@MySQL_LoadAccount(playerid);

forward MySQL_SaveAccount(playerid);
forward r@MySQL_SaveAccount(playerid);

forward PlayerSpawn(playerid);
  • MySQL_Start
    • Callback responsavel pela conexгo do MySQL a database.
  • MySQL_CheckAccount
    • Callback responsavel pela verificaзгo da existencia da conta do player
  • MySQL_CheckPassword
    • Callback responsavel pela verificaзгo da password da conta do player
  • MySQL_CreateAccount
    • Callback responsavel pela criaзгo da conta do player
  • MySQL_LoadAccount
    • Callback responsavel pelo load da conta do player
  • MySQL_SaveAccount
    • Callback responsavel pelo salvamento da conta do player
  • PlayerSpawn
    • Callback responsбvel por setar dinheiro,skin,nivel,etc..
  • Todas as outras publics com r@ sгo apenas respostas das outras callbacks, ou seja, a calback X manda uma pergunta e a callback r@X manda a resposta.
Apуs fazerem isso tudo, nуs iremos comeзar pela criaзгo das publics no fim do seu gamemode.

pawn Код:
public MySQL_Start(){
    MysqlC = mysql_connect(mysql_host,mysql_user,mysql_database,mysql_password);
    if(!MysqlC)
        return print("Nгo foi possivel conectar a database, verifique as definiзхes novamente.");
    else {
        mysql_function_query(MysqlC,
            "CREATE TABLE IF NOT EXISTS `users` (\
                `id` int(11) NOT NULL, AUTO_INCREMENT,\
                `name` varchar(25) NOT NULL, \
                `password` varchar(25) NOT NULL, \
                `level` int(11) NOT NULL, \
                `bank` int(11) NOT NULL, \
                `skin` int(11) NOT NULL, \
                `money` int(11) NOT NULL, \
                PRIMARY KEY(`id`)\
            )"
,false,"r@MySQL_Start","s","users");
    }
    return 1;
}

public r@MySQL_Start(text[])
    return printf("Tabela %s verificada com sucesso.",text);
  • mysql_connect(const host[], const user[], const database[], const password[], port = 3306)
    • const host[] - IP ou hostname do servidor MySQL.
    • const user[] - Nome de usuбrio da conta que vocк deseja se conectar.
    • const database[] - Nome da database que vocк deseja se conectar.
    • const password[] - password da conta que vocк deseja se conectar.
    • port = 3306 - porta do servidor, nгo й necessбrio preencher este espaзo, pois ele jб esta definida como 3306, use este espaзo caso a porta seja outra
    • retorna o identificador de conexгo.
  • mysql_function_query( connectionHandle, query[], bool:cache, callback[], format[], {Float,_}:... )
    • connectionHandle - conexгo que serб processado.
    • query[] - O query que vocк deseja processar.
    • bool:cache - Aqui apenas colocaremos "true" caso usaremos a cache, caso nгo usarmos colocaremos false.
    • callback[] - A callback que vocк deseja enviar a resposta
    • format[] - formataзгo da string.
    • {Float,_}:... - Nъmero indefinido de argumentos de qualquer marca.
    • retorna - 1 em sucesso, 0 em falha.
    • Exemplo feito pelo BlueG
      • Quote:
        Originally Posted by BlueG
        Посмотреть сообщение
        pawn Код:
        mysql_function_query(connectionHandle, "UPDATE `foo` SET `bar` = 1", false, "CustomResponse", "dsf", 1337, "string", 1.5634);

        public CustomResponse(integer, string[], Float:float)
        {
            printf("Query successful executed. Data: %d | %s | %f", integer, string, float);
            return 1;
        }
  • Funзгo
    • A callback MySQL_Start em como funзгo iniciar a conexгo a database e criar uma tabela caso ela nгo exista o que й muito mais ъtil, em vez de ser vocк a criar a database direto do phpmyadmin o mysql cria por vocк, logo depois serб mandada uma resposta para a callback r@MySQL_Start e assim sabermos se o funcionou ou nгo.
Bem, muitos nгo devem estar a perceber o que й esse texto dentro da funзгo mysql_function_query, esse texto й a linguagem de programaзгo SQL, que tem muitas coisas como SELECT, DELETE, UPDATE, CREATE, etc, mas a minha funзгo nгo й ensinar SQL mas sim ensinar MySQL no pawn, mas eu poderei dar algumas dicas, vamos ver algumas coisas.
  • CREATE TABLE IF NOT EXISTS `nomedatabala` (fields)
    • Esta funзгo serve para criar uma tabela caso nгo exista, mas claro que voce deve inserir os parвmetros, dentro deles voce de colocar o nome do parametro e o tipo, existem varios tipos, aqui estб alguns exemplos:
      • varchar - Um varchar ou campo de caractere variбvel й um conjunto de dados de caracteres de comprimento indeterminado.
      • int - O tipo de dados int й o tipo de dados inteiros primбrio do MySQL.
      • double - Um nъmero de ponto flutuante de tamanho normal (dupla-precisгo).
Caso usarmos varchar ou int teremos que determinar o mбximo de caracteres possives, vejamos um exemplo:
varchar(10) - Aqui estб definido com 10 ou seja, o maximo que pode ter sгo 10 caracteres.
int(10) - Aqui estб definido com 10, ou seja, o mбximo que pode ter tambem sгo 10 caracteres, mas muita gente confunde porque como й um inteiro sу contem numeros, entгo pensгo que o numero mбximo й 10, mas nгo, significa que o valor mбximo й 9999999999.

Jб o double nгo й necessбrio defenir mбximo, pois ele й um numero de ponto flutuante, o site oficial do MySQL diz o seguinte

Quote:
Originally Posted by MySQL
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

Um nъmero de ponto flutuante de tamanho normal (dupla-precisгo). Valores permitidos estгo entre -1.7976931348623157E+308 e -2.2250738585072014E-308, 0 e entre 2.2250738585072014E-308 e 1.7976931348623157E+308. Se UNSIGNED for especificado, valores negativos nгo sгo permitidos. O M й a largura do display e o D й nъmero de casa decimais. DOUBLE sem argumento ou FLOAT(X) onde 25 <= X <= 53 sгo nъmeros de ponto flutuante de dupla-precisгo.
Ao ser um numero de ponto flutuante nуs nunca saberemos qual serб a largura do display e o numero de casas decimais, por tanto o MySQL permite que definimos o Double sem argumento.

Depois de definirmos se й varchar, int, ou double vem outra coisa importante, definir se й NOT NULL e AUTO_INCREMENT
  • NOT NULL devemos usar sempre, ou seja, significa que o field nгo й nulo.
  • AUTO_INCREMENT serve apenas para o id, ou seja, o auto_increment tem a funзгo de colocar o numero automaticamente sendo que nуs nгo necessitamos de setar o id, ou de modificar o id, ele coloca automaitcamente.
  • Por fim nуs devemos colocar o PRIMARY KEY, significa que o a primeira coisa que irб aparecer naquela row serб o id.
Apуs criar esta public voce deve colocar no OnGameModeInit ou no OnFilterScriptInit
pawn Код:
public OnFilterScriptInit()
{
    MySQL_Start();
    return 1;
}
ou

pawn Код:
public OnGameModeInit()
{
    MySQL_Start();
    return 1;
}
Apуs voce entender isto tudo nуs iremos comeзar com a parte da criaзгo dos dados do jogador, entгo iremos comeзar por checar a conta no OnPlayerConnect e salvar a conta no OnPlayerDisconnect.
pawn Код:
public OnPlayerConnect(playerid)
{
    MySQL_CheckAccount(playerid);
    return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
    MySQL_SaveAccount(playerid);
    return 1;
}

Depois criamos as publics.

pawn Код:
public MySQL_CheckAccount(playerid){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"SELECT * FROM `users` WHERE name='%s'",PlayerName);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_CheckAccount","d",playerid);
    return 1;
}

public r@MySQL_CheckAccount(playerid){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);
    if(rows){
        ShowPlayerDialog(playerid,D_LOGIN,3,"login","insira a sua password para logar","logar","sair");
    } else {
        ShowPlayerDialog(playerid,D_REGISTER,3,"registro","insira uma password para registrar","registrar","sair");
    }
    return 1;
}
  • cache_get_data(&num_rows, &num_fields , connectionHandle = 1);
    • &num_rows - Digamos que row й uma prateleira e na prateleira contem os fields.
    • &num_fields - Digamos que fields й uma gaveta que estгo dentro da row.
    • connectionHandle - conexгo que serб processado.
    • retorna - 1 em sucesso, 0 em falha.
  • SELECT * FROM `nomedatabela` WHERE field=valor
    • Esta funзгo й muito facil de entender, basta eu traduzir para portugues, entгo vejamos a traduзгo.
      SELECIONAR * DE `nomedatabela` ONDE field=valor, o * significa ALL, TUDO, ou seja, vejamos ainda mais especifico
      SELECIONAR TUDO DE `nomedatabela` ONDE field й igual ao valor, como podem ver й muito simples de entender, entгo agora outras coisas, o field serб os parametros que criamos no inicio, neste caso eu seleccionei tudo, ou seja, nome,password,level,skin,money,bank da tabela users onde o nome й igual ao playername.
      Depois o MySQL manda a resposta e nуs pegamos a data com o cache_get_data e verificamos se existe alguma row com esse o nome igual ao do PlayerName.
Agora vamos para a parte do dialog e checar a password do jogador.

pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid){
        case D_LOGIN:{
            if(!response)
                Kick(playerid);
            else {
                if(strlen(inputtext) < 4)
                    return ShowPlayerDialog(playerid,D_LOGIN,3,"login","insira a sua password para logar","logar","sair");
                else
                    MySQL_CheckPassword(playerid,inputtext);
            }
        }
        case D_REGISTER:{
            if(!response)
                Kick(playerid);
            else {
                if( 5 < (strlen(inputtext)) > 25)
                    return ShowPlayerDialog(playerid,D_REGISTER,3,"registro","insira uma password para registrar","registrar","sair");
                else
                    MySQL_CreateAccount(playerid,inputtext);
            }
        }
    }
    return 1;
}

public MySQL_CheckPassword(playerid,password[]){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"SELECT * FROM `users` WHERE name='%s' AND password='%s'",PlayerName,password);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_CheckPassword","ds",playerid);
    return 1;
}

public r@MySQL_CheckPassword(playerid){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);
    if(rows)
        MySQL_LoadAccount(playerid);
    else
        ShowPlayerDialog(playerid,D_LOGIN,3,"login","insira a sua password para logar","logar","sair");
    return 1;
}

public MySQL_CreateAccount(playerid,password[]){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"INSERT INTO `users` (name,password,level,money,bank,skin) VALUES ('%s','%s','2','4500','0','240');",PlayerName,password);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_CreateAccount","s",playerid);
    return 1;
}

public r@MySQL_CreateAccount(playerid){
    SendClientMessage(playerid,-1,"Registrado com sucesso, aguarde um pouco...");
    MySQL_LoadAccount(playerid);
    return 1;
}
  • INSERT INTO `nomedatatabela` (fields) VALUES (valores);
    • Bem esta "funзгo" serve para inserir algo na tabela, vejamos a traduзгo:
      • INSERIR EM `nomedatabela` (fields) VALORES (valores); e bem й sу isto, pelo nome jб diz o qual a funзгo das publics, agora vamos criar a public que faz o load de contas, spawn de player e o salvamento do player.
pawn Код:
public MySQL_LoadAccount(playerid){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"SELECT * FROM `users` WHERE name='%s'",PlayerName);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_LoadAccount","d",playerid);
    return 1;
}

public r@MySQL_LoadAccount(playerid){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);
    if(rows){
        cache_get_field_content(0,"level",Query,MysqlC);
        PlayerInfo[playerid][pLevel] = strval(Query);
       
        cache_get_field_content(0,"money",Query,MysqlC);
        PlayerInfo[playerid][pMoney] = strval(Query);
       
        cache_get_field_content(0,"bank",Query,MysqlC);
        PlayerInfo[playerid][pBank] = strval(Query);
       
        cache_get_field_content(0,"skin",Query,MysqlC);
        PlayerInfo[playerid][pSkin] = strval(Query);
       
        PlayerSpawn(playerid);
    }
    else
        SendClientMessage(playerid,-1,"Houve um erro com a sua conta"),Kick(playerid);
    return 1;
}

public PlayerSpawn(playerid){
    SpawnPlayer(playerid);
   
    GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
    SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
    SetPlayerSkin(playerid,PlayerInfo[playerid][pSkin]);
   
    SendClientMessage(playerid,-1,"Seja bem vindo!");
    return 1;
}

public MySQL_SaveAccount(playerid){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"UPDATE `users` SET level='%d',money='%d',bank='%d',skin='%d' WHERE name='%s'",PlayerInfo[playerid][pLevel],PlayerInfo[playerid][pMoney],PlayerInfo[playerid][pBank],PlayerInfo[playerid][pSkin],PlayerName);
    mysql_function_query(MysqlC,Query,false,"r@MySQL_SaveAccount","d",playerid);
    return 1;
}

public r@MySQL_SaveAccount(playerid)
    return printf("Conta %d salva com sucesso.",playerid);
Bem existe uma coisa aqui que eu nгo referi, segundo a variavel PlayerInfo[playerid][pWarn] й apenas uma variavel de seguranзa, porque й o seguinte caso voce tenha uma conta lб na database e imaginamos que voce seleciona sair, ele vai executar a funзгo OnPlayerDisconnect e irб salvar a sua conta e os valores serгo todos nulos, por isso o que fazemos й setamos uma variavel, congelamos o jogador, fazemos o load da conta e kickamos para a conta nгo ter valores nulos.

Agora sobre a funзгo do MySQL, й muito simples
  • UPDATE `nomedatabela` SET fields='valores'
    • traduзгo ficaria assim: ATUALIZAR `nomedatabela` CONFIGURAR/MODIFICAR/SETAR fields='valores
Sobre a public LoadAccount
  • cache_get_field_content(row, const field_name[], dest[], connectionHandle = 1)
    • row - Digamos que a row serб a parteleira neste caso a conta do jogador.
    • const field_name[] - Aqui serб o nome da nossa gaveta, como definimos poderб ser name,password,level,money,bank ou skin
    • dest[] - Aqui serб o destino para qual os dados serгo mandados, aqui claro deveremos usar a variavel Query
    • connectionHandle = 1 - conexгo que serб processado.
Por fim voce deve obter algo como isto.

pawn Код:
///////////////////////////////////////////////////////////////////////////////
//
//
//        #### ########   ######     ######## ########    ###    ##     ##
//         ##  ##     ## ##    ##       ##    ##         ## ##   ###   ###
//         ##  ##     ## ##             ##    ##        ##   ##  #### ####
//         ##  ########   ######        ##    ######   ##     ## ## ### ##
//         ##  ##              ##       ##    ##       ######### ##     ##
//         ##  ##        ##    ##       ##    ##       ##     ## ##     ##
//        #### ##         ######        ##    ######## ##     ## ##     ##
//
//
//                              Criado por @BlueX
//
//              Seja membro da melhor equipe de programaзгo
//         http://ips-team.forumeiros.com/t2-inform...cao-na-ips
//
//                    [iPs]TeaM soluзхes de programaзгo em geral
//
//
//                              [MySQL Tutorial}
//
//
/////////////////////////////////////////////////////////////////////////////////
#define FILTERSCRIPT

#include <a_samp>
#include <a_mysql>

#define MAX_SOLTS (25)
#define D_LOGIN 1
#define D_REGISTER 2

new const
    mysql_host[] = "localhost",
    mysql_user[] = "root",
    mysql_database[] = "server",
    mysql_password[] = "1234";

new Query[500];
new MysqlC;

new PlayerName[25];

enum pInfo{
    pLevel,
    pMoney,
    pBank,
    pSkin,
    pWarn
};

new PlayerInfo[MAX_SOLTS][pInfo];

forward MySQL_Start();
forward r@MySQL_Start(text[]);

forward MySQL_CheckAccount(playerid);
forward r@MySQL_CheckAccount(playerid);

forward MySQL_CheckPassword(playerid,password[]);
forward r@MySQL_CheckPassword(playerid);

forward MySQL_CreateAccount(playerid,password[]);
forward r@MySQL_CreateAccount(playerid);

forward MySQL_LoadAccount(playerid);
forward r@MySQL_LoadAccount(playerid);

forward MySQL_SaveAccount(playerid);
forward r@MySQL_SaveAccount(playerid);

forward PlayerSpawn(playerid);

public OnFilterScriptInit()
{
    print("\n--------------------------------------");
    print(" MySQL Tutorial @BlueX");
    print("--------------------------------------\n");
    MySQL_Start();
    return 1;
}

public OnFilterScriptExit()
{
    return 1;
}

public OnPlayerConnect(playerid)
{
    MySQL_CheckAccount(playerid);
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    MySQL_SaveAccount(playerid);
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid){
        case D_LOGIN:{
            if(!response)
                Kick(playerid);
            else {
                if(strlen(inputtext) < 4)
                    return ShowPlayerDialog(playerid,D_LOGIN,3,"login","insira a sua password para logar","logar","sair");
                else
                    MySQL_CheckPassword(playerid,inputtext);
            }
        }
        case D_REGISTER:{
            if(!response)
                Kick(playerid);
            else {
                if( 5 < (strlen(inputtext)) > 25)
                    return ShowPlayerDialog(playerid,D_REGISTER,3,"registro","insira uma password para registrar","registrar","sair");
                else
                    MySQL_CreateAccount(playerid,inputtext);
            }
        }
    }
    return 1;
}

public MySQL_Start(){
    MysqlC = mysql_connect(mysql_host,mysql_user,mysql_database,mysql_password);
    if(!MysqlC)
        return print("Nгo foi possivel conectar a database, verifique as definiзхes novamente.");
    else {
        mysql_function_query(MysqlC,
            "CREATE TABLE IF NOT EXISTS `users` (\
                `id` int(11) NOT NULL, AUTO_INCREMENT,\
                `name` varchar(25) NOT NULL, \
                `password` varchar(25) NOT NULL, \
                `level` int(11) NOT NULL, \
                `bank` int(11) NOT NULL, \
                `skin` int(11) NOT NULL, \
                `money` int(11) NOT NULL, \
                PRIMARY KEY(`id`)\
            )"
,false,"r@MySQL_Start","s","users");
    }
    return 1;
}

public r@MySQL_Start(text[])
    return printf("Tabela %s verificada com sucesso.",text);

public MySQL_CheckAccount(playerid){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"SELECT * FROM `users` WHERE name='%s'",PlayerName);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_CheckAccount","d",playerid);
    return 1;
}

public r@MySQL_CheckAccount(playerid){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);
    if(rows){
        ShowPlayerDialog(playerid,D_LOGIN,3,"login","insira a sua password para logar","logar","sair");
    } else {
        ShowPlayerDialog(playerid,D_REGISTER,3,"registro","insira uma password para registrar","registrar","sair");
    }
    return 1;
}

public MySQL_CheckPassword(playerid,password[]){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"SELECT * FROM `users` WHERE name='%s' AND password='%s'",PlayerName,password);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_CheckPassword","ds",playerid);
    return 1;
}

public r@MySQL_CheckPassword(playerid){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);
    if(rows)
        MySQL_LoadAccount(playerid);
    else
        ShowPlayerDialog(playerid,D_LOGIN,3,"login","insira a sua password para logar","logar","sair");
    return 1;
}

public MySQL_CreateAccount(playerid,password[]){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"INSERT INTO `users` (name,password,level,money,bank,skin) VALUES ('%s','%s','2','4500','0','240');",PlayerName,password);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_CreateAccount","s",playerid);
    return 1;
}

public r@MySQL_CreateAccount(playerid){
    SendClientMessage(playerid,-1,"Registrado com sucesso, aguarde um pouco...");
    MySQL_LoadAccount(playerid);
    return 1;
}

public MySQL_LoadAccount(playerid){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"SELECT * FROM `users` WHERE name='%s'",PlayerName);
    mysql_function_query(MysqlC,Query,true,"r@MySQL_LoadAccount","d",playerid);
    return 1;
}

public r@MySQL_LoadAccount(playerid){
    new rows,fields;
    cache_get_data(rows,fields,MysqlC);
    if(rows){
        cache_get_field_content(0,"level",Query,MysqlC);
        PlayerInfo[playerid][pLevel] = strval(Query);
       
        cache_get_field_content(0,"money",Query,MysqlC);
        PlayerInfo[playerid][pMoney] = strval(Query);
       
        cache_get_field_content(0,"bank",Query,MysqlC);
        PlayerInfo[playerid][pBank] = strval(Query);
       
        cache_get_field_content(0,"skin",Query,MysqlC);
        PlayerInfo[playerid][pSkin] = strval(Query);
       
        PlayerSpawn(playerid);
    }
    else
        SendClientMessage(playerid,-1,"Houve um erro com a sua conta"),Kick(playerid);
    return 1;
}

public PlayerSpawn(playerid){
    SpawnPlayer(playerid);
   
    GivePlayerMoney(playerid,PlayerInfo[playerid][pMoney]);
    SetPlayerScore(playerid,PlayerInfo[playerid][pLevel]);
    SetPlayerSkin(playerid,PlayerInfo[playerid][pSkin]);
   
    SendClientMessage(playerid,-1,"Seja bem vindo!");
    return 1;
}

public MySQL_SaveAccount(playerid){
    GetPlayerName(playerid,PlayerName,25);
    format(Query,sizeof(Query),"UPDATE `users` SET level='%d',money='%d',bank='%d',skin='%d' WHERE name='%s'",PlayerInfo[playerid][pLevel],PlayerInfo[playerid][pMoney],PlayerInfo[playerid][pBank],PlayerInfo[playerid][pSkin],PlayerName);
    mysql_function_query(MysqlC,Query,false,"r@MySQL_SaveAccount","d",playerid);
    return 1;
}

public r@MySQL_SaveAccount(playerid)
    return printf("Conta %d salva com sucesso.",playerid);
Crйditos
  • BlueX
    • Criaзгo deste tutorial.
  • BlueG
    • Criaзгo do plugin MySQL
  • AndreT
    • Criaзгo de um post sobre a velocidade do MySQL,
  • Stewie`
    • Um grande amigo e foi quem me ensinou MySQL.
  • Paulo_TerroR
    • Esclarecimento de umas duvidas.
  • [iPs]TeaM
    • A melhor equipe de programaзгo.
  • SA-MP Team
    • Dedicaзгo e trabalho para fazer uma das melhores comunidades.
  • MySQL Website
    • Esclarecimento de duvidas sobre MySQL-
  • Wikipedia
    • Alguns conhecimentos sobre MySQL.
  • SA-MP Wiki
    • Esclarecimento de duvidas sobre alguns parвmetros do MySQL no pawn.
  • birazn
    • Criaзгo do video no ******* sobre EASY PHP
Reply
#2

Muito bem explicado cara. Deve ter demorado um tempгo !! Parabйns pelo tutorial Blue
Reply
#3

Excelente Gonзalo, hб pouco tempo fiz um tutorial contendo um sistema de registro, mas parece que nгo foi muito ъtil, porйm este й bem explicativo e aparentemente possui cуdigos funcionais, parabйns.

@OFF

Tambйm tenho essa mania do r@. Acho que peguei com o Miki lendo o MyRPG xD.
Reply
#4

Excelente!
Reply
#5

Quote:
Originally Posted by [FeK]DraKiNs
Посмотреть сообщение
Muito bem explicado cara. Deve ter demorado um tempгo !! Parabйns pelo tutorial Blue
Eu gosto de fazer tudo ao pormenor e ajudar os membros desta board, o tutorial demorou-me 3 dias, mas nгo foram 3 dias a fazer o tutorial, porque umas vezes parava ia sair e fazer as minhas coisas, por isso que demorou os 3 dias, mas obrigado Bruno, daqui a diante estou a pensar fazer projetos sу em MySQL.

Quote:
Originally Posted by Pedro_Miranda
Посмотреть сообщение
Excelente Gonзalo, hб pouco tempo fiz um tutorial contendo um sistema de registro, mas parece que nгo foi muito ъtil, porйm este й bem explicativo e aparentemente possui cуdigos funcionais, parabйns.

@OFF

Tambйm tenho essa mania do r@. Acho que peguei com o Miki lendo o MyRPG xD.
Sim eu tambem, mas acho muito mais explicativo esse r@, porque r faz lembrar de resposta mais nada, Obrigado Pedro.


Quote:
Originally Posted by sanalex
Посмотреть сообщение
Excelente!
Obrigado sanalex.
Reply
#6

Bom .
Parabens.....
Reply
#7

Quote:
Originally Posted by Y_Seven
Посмотреть сообщение
Bom .
Parabens.....
Obrigado Y_Seven.
Reply
#8

So uma pergunta! Se caso eu colocar como um Rank no servidor
Isso serб lido sу apуs que o valor estiver escrito no arquivo?
Reply
#9

Nice Project BlueX .

Thanks.
Reply
#10

Ajudarб Novatos que querem aprender algo...

abs.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)