Mysql Duplicate Entry & Not registering correctly(?)
#1

Hello,

Yesterday my login&register system was working perfectly but it is now bugged and I couldn't figure out what the issue was unfortunately. I am still a bit rusty with PAWN as I've left it for a few years so it won't surprise me if it's something dumb lol, anyway, the issue is the system asks you to register again if you register into the system and rejoin the server, here is the codes for login&register system;

OnPlayerConnect;
pawn Код:
public OnPlayerConnect(playerid)
{
    g_MysqlRaceCheck[playerid]++;
    ChatBosalt(playerid);
    SendClientMessage(playerid,-1, "{FFBF00}(( {00FF00}[BILGI]: {FFFFFF}Sunucu ve sizin aranizda baglanti saglaniyor. Lutfen bekleyin. {FFBF00}))");
    HataMesajiGonder(playerid,"Test");
    SetTimerEx("Senkronize", 2000, false, "i", playerid);
    return 1;
}
Senkronize timer;
pawn Код:
forward Senkronize(playerid);
public Senkronize(playerid)
{
    static const empty_player[E_PLAYERS];
    pInfo[playerid] = empty_player;
    GetPlayerName(playerid, pInfo[playerid][Name], MAX_PLAYER_NAME);
    new query[103];
    mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `name` = '%e' LIMIT 1", pInfo[playerid][Name]);
    mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
    return 1;
}
OnPlayerDataLoaded;
pawn Код:
forward OnPlayerDataLoaded(playerid, race_check);
public OnPlayerDataLoaded(playerid, race_check)
{
    TextDrawShowForPlayer(playerid, Text: TDEditor_TD[0]);
    TextDrawShowForPlayer(playerid, Text: TDEditor_TD[1]);
    TextDrawShowForPlayer(playerid, Text: TDEditor_TD[2]);
    TextDrawShowForPlayer(playerid, Text: TDEditor_TD[3]);
   
    if (race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);

    new string[115];
    if(cache_num_rows() > 0)
    {
        cache_get_value(0, "password", pInfo[playerid][Password], 65);
        cache_get_value(0, "salt", pInfo[playerid][Salt], 17);
        pInfo[playerid][Cache_ID] = cache_save();
        strreplace(pInfo[playerid][Name],'_',' ');
        format(string, sizeof string, "{FFFFFF}Sunucuya tekrar hosgeldin {FFBF00}%s{FFFFFF}. Lьtfen asagidaki kutucuga sifreni girerek giris yap:", pInfo[playerid][Name]);
        ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{0174DF}[T-RP]: {FFFFFF}Giris", string, "Giris", "Зikis");
        SendClientMessage(playerid, -1, "{FFBF00}(( {FE2E9A}[UYARI]: {FFFFFF}30 saniye icerisinde giris yapmazsaniz sunucudan atilacaksiniz. {FFBF00}))");
        pInfo[playerid][LoginTimer] = SetTimerEx("OnLoginTimeout", SECONDS_TO_LOGIN * 1000, false, "d", playerid);
    }
    else
    {
        strreplace(pInfo[playerid][Name],'_',' ');
        format(string, sizeof string, "{FFFFFF}Hosgeldin {FFBF00}%s{FFFFFF}, asagidaki kutucuga sifreni girerek kaydolabilirsin:", pInfo[playerid][Name]);
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{0174DF}[T-RP]: {FFFFFF}Kayit", string, "Kaydol", "Зikis");
    }
    return 1;
}
DIALOG_REGISTER;

pawn Код:
case DIALOG_REGISTER:
        {
            if (!response) return Kick(playerid);

            if (strlen(inputtext) <= 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "{0174DF}[T-RP]: {FFFFFF}Kayit", "{FF0000}Sifreniz 5 karakterden uzun olmalidir!\n{FFFFFF}Lьtfen sifrenizi asagidaki kutucuga giriniz:", "Kaydol", "Зikis");
            for (new i = 0; i < 16; i++) pInfo[playerid][Salt][i] = random(94) + 33;
            SHA256_PassHash(inputtext, pInfo[playerid][Salt], pInfo[playerid][Password], 65);

            new query[221];
            mysql_format(g_SQL, query, sizeof query, "INSERT INTO `players` (`name`, `password`, `salt`) VALUES ('%e', '%s', '%e')", pInfo[playerid][Name], pInfo[playerid][Password], pInfo[playerid][Salt]);
            mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
            SpawnPlayer(playerid);
        }
DIALOG_LOGIN;

pawn Код:
case DIALOG_LOGIN:
        {
            if (!response) return Kick(playerid);

            new hashed_pass[65];
            SHA256_PassHash(inputtext, pInfo[playerid][Salt], hashed_pass, 65);
            if (strcmp(hashed_pass, pInfo[playerid][Password]) == 0)
            {
                cache_set_active(pInfo[playerid][Cache_ID]);
                    AssignPlayerData(playerid);
                cache_delete(pInfo[playerid][Cache_ID]);
                pInfo[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
                KillTimer(pInfo[playerid][LoginTimer]);
                pInfo[playerid][LoginTimer] = 0;
                pInfo[playerid][IsLoggedIn] = true;
                SpawnPlayer(playerid);
                TogglePlayerSpectating( playerid, 0);
                TextDrawHideForPlayer(playerid, Text:TDEditor_TD[0]);
                TextDrawHideForPlayer(playerid, Text:TDEditor_TD[1]);
                TextDrawHideForPlayer(playerid, Text:TDEditor_TD[2]);
                TextDrawHideForPlayer(playerid, Text:TDEditor_TD[3]);
            }
            else
            {
                pInfo[playerid][LoginAttempts]++;

                if (pInfo[playerid][LoginAttempts] >= 3)
                {
                    ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "{0174DF}[T-RP]: {FFFFFF}Giris", "Sifreyi 3 defa yanlis girdiginiz iзin sunucudan atildiniz.", "Tamam", "");
                    DelayedKick(playerid);
                }
                else ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "{0174DF}[T-RP]: {FFFFFF}Giris", "{FF0000}Yanlis sifre girdiniz.\n{FFFFFF}Lьtfen sifrenizi asagidaki kutucuga giriniz:", "Giris", "Зikis");
            }
        }
OnPlayerRegister;

pawn Код:
forward OnPlayerRegister(playerid);
public OnPlayerRegister(playerid)
{
    pInfo[playerid][ID] = cache_insert_id();
    TextDrawHideForPlayer(playerid, Text:TDEditor_TD[0]);
    TextDrawHideForPlayer(playerid, Text:TDEditor_TD[1]);
    TextDrawHideForPlayer(playerid, Text:TDEditor_TD[2]);
    TextDrawHideForPlayer(playerid, Text:TDEditor_TD[3]);
    pInfo[playerid][IsLoggedIn] = true;
    new rand[MAX_PLAYERS];
    rand[playerid] = random(9999);
    SpawnPlayer(playerid);
    TogglePlayerSpectating(playerid, 0);
    pInfo[playerid][YeniKayit] = 1;
    SetPlayerPos(playerid,361.9724,169.4080,1020.7891);
    SetPlayerFacingAngle(playerid, 0.0);
    TogglePlayerControllable(playerid, false);
    SetPlayerCameraPos(playerid, 364.6817, 173.9626, 1026.5891);
    SetPlayerCameraLookAt(playerid, 361.9724, 169.4080, 1025.7891);
    SetPlayerInterior(playerid, 3);
    SetPlayerVirtualWorld(playerid, rand[playerid]);
    KayitAktor[playerid] = CreateActor(211, 362.2021,171.7148,1025.7891, 194.9519);
    SetActorVirtualWorld(KayitAktor[playerid], rand[playerid]);
    PreloadActorAnimations(KayitAktor[playerid]);
    ApplyActorAnimation(KayitAktor[playerid], "PED", "SEAT_IDLE", 4.0, 0, 0, 0, 1, 0);
    SendClientMessage(playerid, COLOR_EMOTE,"* Karsinizda orta yaslarinda bayan bir nьfus calisani oturmaktadir,цnьnde bilgisayari durmaktadir. {FFFFFF}(( Nьfus calisani ))");
    ShowPlayerDialog(playerid, DIALOG_WELCOME, DIALOG_STYLE_MSGBOX, "{FFBF00}Hosgeldiniz!", "Bu sunucu bir rol yapma sunucusudur. Burda gцrьp gцrebileceginiz her sey hayal urunudur.\n Sunucu Yigit ATAK tarafindan 0'dan kodlanmistir.\n Simdi karakterinizi yaratabilirsiniz.","Tamam","");
    return 1;
}

Sorry if the indentation is ruined while copy-pasting, I can provide pictures of database if the problem isn't understood.

Edit: I also forgot to mention that all registrations are visible in the database if you keep on registering.
Reply
#2

Step 1: check if the data is saved after you've registered.
Reply
#3

Quote:
Originally Posted by iLearner
Посмотреть сообщение
Step 1: check if the data is saved after you've registered.
Well, it is stated in the topic, it does. Here is a picture;

http://i.imgur.com/dKsvE6w.png
Reply
#4

I cant really see anything strange there... try these, even tho they might be useless:

Create a cache, using new Cache:cacheid = mysql_query(...
Debug the number of cache_num_rows
Use '%s' instead of '%e' in SELECT
Reply
#5

Quote:
Originally Posted by iLearner
Посмотреть сообщение
I cant really see anything strange there... try these, even tho they might be useless:

Create a cache, using new Cache:cacheid = mysql_query(...
Debug the number of cache_num_rows
Use '%s' instead of '%e' in SELECT
Thanks, it was apparently the fact that I escaped the name while using SELECT. +Rep!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)