MySQL


Započeo Darkic, Januar 04, 2020, 20:30:24 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Problem(error/warning): invalid cache id, no active cache. Da napomenem da mi se ovo desi samo na prvom loginu, odnosno nakon registracije, jer izbacuje jedan za drugim dialogom.
Dio skripte:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == DIALOG_LOGIN && response == 0 || dialogid == DIALOG_REGISTER && response == 0) return Kick(playerid);
	if(dialogid == DIALOG_LOGIN && response == 1)
	{
		new Salted_Key[65];
		SHA256_PassHash(inputtext, pInfo[playerid][Salt], Salted_Key, 65);

		if(strcmp(Salted_Key, pInfo[playerid][Password]) == 0)
		{
			cache_set_active(pInfo[playerid][Player_Cache]);
			cache_get_value_int(0, "ID", pInfo[playerid][ID]);
				
			cache_get_value_int(0, "KILLS", pInfo[playerid][Kills]);
			cache_get_value_int(0, "DEATHS", pInfo[playerid][Deaths]);

			cache_get_value_int(0, "SCORE", pInfo[playerid][Score]);
			cache_get_value_int(0, "CASH", pInfo[playerid][Cash]);

			cache_get_value_int(0, "SKIN", pInfo[playerid][Skin]);
			cache_get_value_int(0, "ADMIN", pInfo[playerid][Admin]);
			cache_get_value_int(0, "MUTED", pInfo[playerid][Muted]);
			
			SetPlayerScore(playerid, pInfo[playerid][Score]);
			ResetPlayerMoney(playerid);
			GivePlayerMoney(playerid, pInfo[playerid][Cash]);

			cache_delete(pInfo[playerid][Player_Cache]);
			pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;

			pInfo[playerid][LoggedIn] = true;
			SpawnPlayer(playerid);
		}
		else
		{
			new str[82];

			pInfo[playerid][PasswordFails] += 1;
			printf("%s has been failed to login. (%d)", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);

			if (pInfo[playerid][PasswordFails] >= 3)
			{
				format(str, sizeof(str), "Kick: %s has been kicked Reason: {FF0000}(%d/3) Login fails.", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
				SendClientMessageToAll(0x4270D9FF, str);
				Kick(playerid);
			}
			else
			{
				format(str, sizeof(str), "LOGIN: Wrong password, you have {F42D32}%d{FFFFFF}/{F42D32}3 {FFFFFF}tries.", pInfo[playerid][PasswordFails]);
				SendClientMessage(playerid, -1, str);

				new str1[155];
				format(str1, sizeof(str1), "{FFFFFF}Welcome , %s.\n\n{0099FF}This account is registered.\n\
				{0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
				ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Mexico DeathMatch - Login", str1, "Login", "Leave");
			}
		}
	}
	if(dialogid == DIALOG_REGISTER && response == 1)
	{
		if(strlen(inputtext) < 5 || strlen(inputtext) > 60)
		{
			SendClientMessage(playerid, RED, "ERROR: {FFFFFF}");

			new String[153];

			format(String, sizeof(String), "{FFFFFF}Welcome %s,\n\n{0099FF}Your account is not registered.\n\
			{0099FF}Please, enter your password below to register new account.\n\n", pInfo[playerid][Name]);
			ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Register", String, "Register", "Leave");
		}
		else
		{
			for (new i = 0; i < 10; i++)
			{
				pInfo[playerid][Salt][i] = random(79) + 47;
			}

			pInfo[playerid][Salt][10] = 0;
			SHA256_PassHash(inputtext, pInfo[playerid][Salt], pInfo[playerid][Password], 65);

			new DB_Query[272];

			mysql_format(Database, DB_Query, sizeof(DB_Query), "INSERT INTO `PLAYERS` (`USERNAME`, `PASSWORD`, `SALT`, `SCORE`, `KILLS`, `CASH`, `DEATHS`,`SKIN`, `ADMIN`, `MUTED`)\
			VALUES ('%e', '%s', '%e', '0', '0', '0', '0', '0', '0', '0')", pInfo[playerid][Name], pInfo[playerid][Password], pInfo[playerid][Salt]);
			mysql_tquery(Database, DB_Query, "OnPlayerRegister", "d", playerid);
		}
	}
        return 1;
}

Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log):
[19:54:20] [plugins/mysql] cache_set_active: invalid cache id '0'
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_get_value_name_int: no active cache
[19:54:20] [plugins/mysql] cache_delete: invalid cache id '0'

Slika/video ingame problema(obavezno ako je ingame problem): link slike
Poslednja Izmena: Januar 04, 2020, 20:31:50 POSLE PODNE od Darkic

Izvinjavam se za DP, resio sam. Necu uklanjati sadrzaj teme, vec cu izneti objasnjenje, jer mozda jos neko ima slican problem.
Uglavnom, login dialog je pozivan u publicu OnPlayerRegister, ali je isto tako u tom publicu pozivan i sql_AccountSave u kome se brise cache. Znam, glup sam ko kurac :P

public OnPlayerRegister(playerid)
{
	pInfo[playerid][ID] = cache_insert_id();
	sql_AccountSave(playerid);
	
	new str[128];
	format(str, sizeof(str), "{FFFFFF}Welcome back, %s.\n\n{0099FF}This account is already registered.\n\
	{0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
	ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Mexico DM - Login", str, "Login", "Leave");
	return 1;
}


public sql_AccountSave(playerid)
{
	Corrupt_Check[playerid]++;
	if(IsPlayerConnected(playerid)) {
		
	new DB_Query[295];
	mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` SET `SCORE` = '%d', `CASH` = '%d', `KILLS` = '%d', `DEATHS` = '%d', `SKIN` = '%d', `ADMIN` = '%d', `MUTED` = '%d' WHERE `ID` = '%d' LIMIT 1", 
	pInfo[playerid][Score], pInfo[playerid][Cash], pInfo[playerid][Kills], pInfo[playerid][Deaths], pInfo[playerid][Skin], pInfo[playerid][Admin], pInfo[playerid][Muted], pInfo[playerid][ID]);
	mysql_tquery(Database, DB_Query);
	printf(DB_Query); }

	if(cache_is_valid(pInfo[playerid][Player_Cache])) {
	cache_delete(pInfo[playerid][Player_Cache]);
	pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE; }
	pInfo[playerid][LoggedIn] = false;
	return 1;
}
Poslednja Izmena: Januar 04, 2020, 21:42:48 POSLE PODNE od Darkic

Nigdje ne selektujes tabelu iz koje hoces da izvuces to

Selektuje pod OnPlayerConnect