[Ajuda] Consultar uma coluna especifica de uma tabela (MYSQL)
#1

Minha primeira experiencia com mysql to desde a tarde pesquisando
achei uns tutoriais mas sem chance ;/

tive que apelar D: rs

to com um problema aqui:

Quero pegar os dados das colunas spawnblueX, spawnblueY e spawnblueZ da tabela maps
e colocar em seguida nas variaveis px , py e pz para depois setar o player na posiзгo que foi buscada.

" mapaid " й a variavel que ta guardando o id do mapa global

sу um exemplo do que eu quero fazer:





PHP код:
        
           px 
=    mysql_query("SELECT `spawnblueX` FROM `maps` WHERE `id` = '%d'"mapaid);
           
           
py =    mysql_query("SELECT `spawnblueY` FROM `maps` WHERE `id` = '%d'"mapaid);
        
pz =    mysql_query("SELECT `spawnblueZ` FROM `maps` WHERE `id` = '%d'"mapaid);
           
                
SetPlayerPos(playeridpxpypz); 
Agradeзo desde jб quem puder quebrar essa ;]
Reply
#2

Caso esteja usando a versгo mais recente do plugin MySQL (BlueG) R33 ou R34, vocк deverб fazer da seguinte forma:

PHP код:
new mapaid 1;
new 
QuerySQL[500];
new 
conexaoHandle;
new 
Float:XFloat:YFloat:Z;
conexaoHandle mysql_conect(......);
// para efetuar a consulta vocк deve fazer assim:
format(QuerySQL68"select spawnblueX, spawnblueY, spawnblueZ from maps where id = %i"mapaid);
mysql_tquery(conexaoHandleQuerySQL"sql_algumacoisa""");
// e para receber os valores vocк vai precisar de uma callback:
forward sql_algumacoisa(); public sql_algumacoisa()
{
    static 
numlinhasnumcolunas;
    
cache_get_data(numlinhasnumcolunasconexaoHandle);
    
    if(!
numlinhas) return print("nao tem esse mapa");
    
    
cache_get_field_content_float(0"spawnblueX"conexaoHandle);
    
cache_get_field_content_float(0"spawnblueY"conexaoHandle);
    
cache_get_field_content_float(0"spawnblueZ"conexaoHandle);
    
    
printf("-- resultados:\n\nX = %f\nY = %f\nZ = %f"XYZ);
    return 
0x01;

й isso...
Reply
#3

Muito obrigado vйi, vou tentar aqui
Reply
#4

Amigo teria um tutorial explicando melhor essa atualizaзгo?

eu tava usando a R7, vou te que mudar tudo o que eu ja fiz uhashuashuash D:
Reply
#5

Ainda quando o projeto era hospedado pela ****** havia um pacote de exemplos de script(usando cache e outro usando ORM).

Vou deixar eles aqui, pode lhe ser ъtil.

Com cache:
pawn Код:
#include <a_samp>
#include <a_mysql>

native WP_Hash(buffer[], len, const str[]);

#define WHITE 0xFFFFFFAA
#define GREY 0xAFAFAFAA
#define RED 0xFF0000AA
#define YELLOW 0xFFFF00AA
#define LIGHTBLUE 0x33CCFFAA

#define CHAT_WHITE "{FFFFFF}"
#define CHAT_GREY "{AFAFAF}"
#define CHAT_RED "{FF0000}"
#define CHAT_YELLOW "{FFFF00}"
#define CHAT_LIGHTBLUE "{33CCFF}"

forward OnPlayerDataLoaded(playerid, race_check);
forward OnPlayerRegister(playerid);


//MySQL configuration
#define SQL_HOST "127.0.0.1"
#define SQL_DB "test"
#define SQL_USER "root"
#define SQL_PASS "1234"

//MySQL connection handle
new SQL = -1;

//player data
enum E_PLAYERS
{
    ID,
    Name[MAX_PLAYER_NAME],
    Password[129],
    Money,
   
    bool:IsLoggedIn,
    bool:IsRegistered,
    LoginAttempts,
    LoginTimer
};
new Player[MAX_PLAYERS][E_PLAYERS];
new MysqlRaceCheck[MAX_PLAYERS];

//dialog data
enum {
    DIALOG_UNUSED,
   
    DIALOG_LOGIN,
    DIALOG_REGISTER,
};

public OnGameModeInit()
{
    mysql_log(LOG_ERROR | LOG_WARNING, LOG_TYPE_HTML); //logs errors and warnings into a nice .html log file
    SQL = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
   
    SetupPlayerTable();
    return 1;
}

public OnGameModeExit()
{
    //save all player data before closing connection
    for(new p=0; p < MAX_PLAYERS; ++p)
        if(IsPlayerConnected(p))
            UpdatePlayerData(p);

    mysql_close();
    return 1;
}

public OnPlayerConnect(playerid)
{
    MysqlRaceCheck[playerid]++;
    //reset player data
    for(new E_PLAYERS:e; e < E_PLAYERS; ++e)
        Player[playerid][e] = 0;

    new query[128];
    GetPlayerName(playerid, Player[playerid][Name], MAX_PLAYER_NAME);

    //send a query to recieve all the stored player data from the table
    mysql_format(SQL, query, sizeof(query), "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", Player[playerid][Name]);
    mysql_tquery(SQL, query, "OnPlayerDataLoaded", "dd", playerid, MysqlRaceCheck[playerid]);
    return 1;
}

public OnPlayerDataLoaded(playerid, race_check)
{
    /*  race condition check:
        player A connects -> SELECT query is fired -> this query takes very long
        while the query is still processing, player A with playerid 2 disconnects
        player B joins now with playerid 2 -> our laggy SELECT query is finally finished, but for the wrong player
       
        what do we do against it?
        we create a connection count for each playerid and increase it everytime the playerid connects or disconnects
        we also pass the current value of the connection count to our OnPlayerDataLoaded callback
        then we check if current connection count is the same as connection count we passed to the callback
        if yes, everything is okay, if not, we just kick the player
    */

    if(race_check != MysqlRaceCheck[playerid])
        return Kick(playerid);
   
   
    new string[128];
    if(cache_num_rows() > 0)
    {
        AssignPlayerData(playerid);
       
        format(string, sizeof(string), CHAT_WHITE "This account (" CHAT_YELLOW "%s" CHAT_WHITE ") is registered. Please login by entering your password in the field below:", Player[playerid][Name]);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", string, "Login", "Abort");
        Player[playerid][IsRegistered] = true;
    }
    else
    {
        format(string, sizeof(string), CHAT_WHITE "Welcome " CHAT_YELLOW "%s" CHAT_WHITE ", you can register by entering your password in the field below:", Player[playerid][Name]);
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", string, "Register", "Abort");
        Player[playerid][IsRegistered] = false;
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_LOGIN:
        {
            if(!response)
                return Kick(playerid);

            if(strlen(inputtext) <= 5)
                return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login",
                    CHAT_RED "Your password must be longer than 5 characters!\n" CHAT_WHITE "Please enter your password in the field below:",
                    "Login", "Abort");

            new hashed_pass[129];
            WP_Hash(hashed_pass, sizeof(hashed_pass), inputtext);
           
            if(strcmp(hashed_pass, Player[playerid][Password]) == 0)
            {
                //correct password, spawn the player
                ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", "You have been successfully logged in.", "Okay", "");
                Player[playerid][IsLoggedIn] = true;
               
                SetSpawnInfo(playerid, 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
                SpawnPlayer(playerid);
            }
            else
            {
                Player[playerid][LoginAttempts]++;
                if(Player[playerid][LoginAttempts] >= 3)
                {
                    ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", CHAT_RED "You have mistyped your password too often (3 times).", "Okay", "");
                    DelayedKick(playerid);
                }
                else
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", CHAT_RED "Wrong password!\n" CHAT_WHITE "Please enter your password in the field below:", "Login", "Abort");
            }
        }
       
        case DIALOG_REGISTER:
        {
            if(!response)
                return Kick(playerid);
               
            if(strlen(inputtext) <= 5)
                return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration",
                    CHAT_RED "Your password must be longer than 5 characters!\n" CHAT_WHITE "Please enter your password in the field below:",
                    "Register", "Abort");
                   
            new query[256];
            WP_Hash(Player[playerid][Password], 129, inputtext);
            mysql_format(SQL, query, sizeof(query), "INSERT INTO `players` (`username`, `password`) VALUES ('%e', '%s')", Player[playerid][Name], Player[playerid][Password]);
            mysql_tquery(SQL, query, "OnPlayerRegister", "d", playerid);
        }
       
        default:
            return 0;
    }
    return 1;
}

public OnPlayerRegister(playerid)
{
    Player[playerid][ID] = cache_insert_id();
   
    ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Registration", "Account successfully registered, you have been automatically logged in.", "Okay", "");
    Player[playerid][IsLoggedIn] = true;
    Player[playerid][IsRegistered] = true;
   
    SetSpawnInfo(playerid, 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    return 1;
}

public OnPlayerSpawn(playerid)
{
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid, Player[playerid][Money]);
   
    return 1;
}

public OnPlayerDisconnect(playerid,reason)
{
    MysqlRaceCheck[playerid]++;
    UpdatePlayerData(playerid);
    return 1;
}


stock AssignPlayerData(playerid)
{
    Player[playerid][ID] = cache_get_field_content_int(0, "id");
    cache_get_field_content(0, "password", Player[playerid][Password], SQL, 129);
    Player[playerid][Money] = cache_get_field_content_int(0, "money");
    return 1;
}

stock UpdatePlayerData(playerid)
{
    if(Player[playerid][IsLoggedIn] == false)
        return 0;
       
    new query[256];
    mysql_format(SQL, query, sizeof(query), "UPDATE `players` SET `money` = '%d' WHERE `id` = '%d' LIMIT 1", Player[playerid][Money], Player[playerid][ID]);
    mysql_tquery(SQL, query, "", "");
    return 1;
}

stock SetupPlayerTable()
{
    mysql_query(SQL, "CREATE TABLE IF NOT EXISTS `players` (`id` int(11) NOT NULL auto_increment PRIMARY KEY,`username` varchar(30) NOT NULL,`password` varchar(130) NOT NULL,`money` int(10) NOT NULL default '0')", false);
    return 1;
}


stock DelayedKick(playerid, time=500)
{
    SetTimerEx("_KickPlayerDelayed", time, false, "d", playerid);
    return 1;
}

forward _KickPlayerDelayed(playerid);
public _KickPlayerDelayed(playerid)
{
    Kick(playerid);
    return 1;
}

main() {}
Com ORM:
pawn Код:
#include <a_samp>
#include <a_mysql>

native WP_Hash(buffer[], len, const str[]);

#define WHITE 0xFFFFFFAA
#define GREY 0xAFAFAFAA
#define RED 0xFF0000AA
#define YELLOW 0xFFFF00AA
#define LIGHTBLUE 0x33CCFFAA

#define CHAT_WHITE "{FFFFFF}"
#define CHAT_GREY "{AFAFAF}"
#define CHAT_RED "{FF0000}"
#define CHAT_YELLOW "{FFFF00}"
#define CHAT_LIGHTBLUE "{33CCFF}"

forward OnPlayerDataLoaded(playerid, race_check);
forward OnPlayerRegister(playerid);


//MySQL configuration
#define SQL_HOST "127.0.0.1"
#define SQL_DB "database"
#define SQL_USER "username"
#define SQL_PASS "password"

//MySQL connection handle
new SQL = -1;

//player data
enum E_PLAYERS
{
    ORM:ORM_ID,
   
    ID,
    Name[MAX_PLAYER_NAME],
    Password[129],
    Money,
   
    bool:IsLoggedIn,
    bool:IsRegistered,
    LoginAttempts,
    LoginTimer
};
new Player[MAX_PLAYERS][E_PLAYERS];

new MysqlRaceCheck[MAX_PLAYERS];

//dialog data
enum {
    DIALOG_UNUSED,
   
    DIALOG_LOGIN,
    DIALOG_REGISTER,
};

public OnGameModeInit()
{
    mysql_log(LOG_ERROR | LOG_WARNING, LOG_TYPE_HTML); //logs errors and warnings into a nice .html log file
    SQL = mysql_connect(SQL_HOST, SQL_USER,SQL_DB, SQL_PASS);
   
    SetupPlayerTable();
    return 1;
}

public OnGameModeExit()
{
    //save all player data before closing connection
    for(new p=0; p < MAX_PLAYERS; ++p)
        if(IsPlayerConnected(p) && Player[p][IsLoggedIn] && Player[p][ID] > 0)
            orm_save(Player[p][ORM_ID]);

    mysql_close();
    return 1;
}

public OnPlayerConnect(playerid)
{
    MysqlRaceCheck[playerid]++;
    //reset player data
    for(new E_PLAYERS:e; e < E_PLAYERS; ++e)
        Player[playerid][e] = 0;

    GetPlayerName(playerid, Player[playerid][Name], MAX_PLAYER_NAME);
   
    //create orm instance and register all needed variables
    new ORM:ormid = Player[playerid][ORM_ID] = orm_create("players", SQL);

    orm_addvar_int(ormid, Player[playerid][ID], "id");
    orm_addvar_string(ormid, Player[playerid][Name], MAX_PLAYER_NAME, "username");
    orm_addvar_string(ormid, Player[playerid][Password], 129, "password");
    orm_addvar_int(ormid, Player[playerid][Money], "money");
    orm_setkey(ormid, "username");
   
    //tell the orm system to load all data, assign it to our variables and call our callback when ready
    orm_load(ormid, "OnPlayerDataLoaded", "dd", playerid, MysqlRaceCheck[playerid]);
    return 1;
}

public OnPlayerDataLoaded(playerid, race_check)
{
    /*  race condition check:
        player A connects -> SELECT query is fired -> this query takes very long
        while the query is still processing, player A with playerid 2 disconnects
        player B joins now with playerid 2 -> our laggy SELECT query is finally finished, but for the wrong player
       
        what do we do against it?
        we create a connection count for each playerid and increase it everytime the playerid connects or disconnects
        we also pass the current value of the connection count to our OnPlayerDataLoaded callback
        then we check if current connection count is the same as connection count we passed to the callback
        if yes, everything is okay, if not, we just kick the player
    */

    if(race_check != MysqlRaceCheck[playerid])
        return Kick(playerid);
       
    orm_setkey(Player[playerid][ORM_ID], "id");
   
    new string[128];
    switch(orm_errno(Player[playerid][ORM_ID]))
    {
        case ERROR_OK:
        {
            format(string, sizeof(string), CHAT_WHITE "This account " CHAT_YELLOW "(%s)" CHAT_WHITE " is registered. Please login by entering your password in the field below:", Player[playerid][Name]);
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", string, "Login", "Abort");
            Player[playerid][IsRegistered] = true;
        }
        case ERROR_NO_DATA:
        {
            format(string, sizeof(string), CHAT_WHITE "Welcome " CHAT_YELLOW "%s" CHAT_WHITE ", you can register by entering your password in the field below:", Player[playerid][Name]);
            ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration", string, "Register", "Abort");
            Player[playerid][IsRegistered] = false;
        }
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_LOGIN:
        {
            if(!response)
                return Kick(playerid);

            if(strlen(inputtext) <= 5)
                return ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login",
                    CHAT_RED "Your password must be longer than 5 characters!\n" CHAT_WHITE "Please enter your password in the field below:",
                    "Login", "Abort");

            new hashed_pass[129];
            WP_Hash(hashed_pass, sizeof(hashed_pass), inputtext);
           
            if(strcmp(hashed_pass, Player[playerid][Password]) == 0)
            {
                //correct password, spawn the player
                ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", "You have been successfully logged in.", "Okay", "");
                Player[playerid][IsLoggedIn] = true;
               
                SetSpawnInfo(playerid, 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
                SpawnPlayer(playerid);
            }
            else
            {
                Player[playerid][LoginAttempts]++;
                if(Player[playerid][LoginAttempts] >= 3)
                {
                    ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login", CHAT_RED "You have mistyped your password too often (3 times).", "Okay", "");
                    DelayedKick(playerid);
                }
                else
                    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", CHAT_RED "Wrong password!\n" CHAT_WHITE "Please enter your password in the field below:", "Login", "Abort");
            }
        }
       
        case DIALOG_REGISTER:
        {
            if(!response)
                return Kick(playerid);
               
            if(strlen(inputtext) <= 5)
                return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Registration",
                    CHAT_RED "Your password must be longer than 5 characters!\n" CHAT_WHITE "Please enter your password in the field below:",
                    "Register", "Abort");

            WP_Hash(Player[playerid][Password], 129, inputtext);
            orm_save(Player[playerid][ORM_ID], "OnPlayerRegister", "d", playerid);
        }
       
        default:
            return 0;
    }
    return 1;
}

public OnPlayerRegister(playerid)
{
    ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Registration", "Account successfully registered, you have been automatically logged in.", "Okay", "");
    Player[playerid][IsLoggedIn] = true;
    Player[playerid][IsRegistered] = true;
   
    SetSpawnInfo(playerid, 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    return 1;
}

public OnPlayerSpawn(playerid)
{
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid, Player[playerid][Money]);
   
    return 1;
}

public OnPlayerDisconnect(playerid,reason)
{
    MysqlRaceCheck[playerid]++;
    if(Player[playerid][IsLoggedIn] && Player[playerid][ID] > 0)
        orm_save(Player[playerid][ORM_ID]); //if Player[playerid][ID] has a valid value, orm_save sends an UPDATE query, else an INSERT query
    return 1;
}

stock SetupPlayerTable()
{
    mysql_query(SQL, "CREATE TABLE IF NOT EXISTS `players` (`id` int(11) NOT NULL auto_increment PRIMARY KEY,`username` varchar(30) NOT NULL,`password` varchar(130) NOT NULL,`money` int(10) NOT NULL default '0')", false);
    return 1;
}


stock DelayedKick(playerid, time=500)
{
    SetTimerEx("_KickPlayerDelayed", time, false, "d", playerid);
    return 1;
}

forward _KickPlayerDelayed(playerid);
public _KickPlayerDelayed(playerid)
{
    Kick(playerid);
    return 1;
}

main() {}
Reply
#6

Vlw mesmo pelo material
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)