←  Problemy z pluginami

AMXX.pl: Support AMX Mod X i SourceMod

»

Mieszanie się rekordów mysql.

  • +
  • -
Black004 - zdjęcie Black004 03.08.2019

Cześc, mój problem polega na tym, że zapis sql w ogóle nie działa lub jak już zadziała to mieszają się rekordy, że moge dostać zapis szlugow innego gracza... Nie wiem jak to jest możliwe, w 1 bazie mysql mam 5 tabel, a w nich różne zapisy od pluginów. A to od banku, szlugów, gangów itd...

 

Daję tu kod zapisu szlugów, może jak tu się dowiem o co chodzi to w pozostałych też to poprawie:

 

 

tak tworzę, tabele. Task jest ustawiony dlatego, że jak kilka pluginów mam, że tworzą tabele i się łączą z bazą danych to serwer się nie włącza xD

public plugin_cfg() 
{	

	set_task(1.0, "Wczytaj", TASK_POBIERZ);

}

public Wczytaj(){

	info = SQL_MakeDbTuple("xxx", "xxx", "ccc", "xxx"); 

	new len_full, temp_full[2024]; 
	len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "CREATE TABLE IF NOT EXISTS `szlugid` (`name` VARCHAR(48), `szlugi` FLOAT(10), PRIMARY KEY (`name`));)");  
	SQL_ThreadQuery(info, "ConnectSql_Handler", temp_full);
	remove_task(TASK_POBIERZ)
}
public ConnectSql_Handler(failstate, Handle:query, error[], errnum, data[], size)
{
	if(failstate != TQUERY_SUCCESS)
	{
		connected = false;
		return PLUGIN_CONTINUE;
	}
	connected = true;
	return PLUGIN_CONTINUE;
} 

 

A tu zapis i zaladowanie:
 
public client_putinserver(id)
{
	get_user_name(id, nazwa_gracza, 63)
	resetData(id);
	readData(id);
}

public client_disconnect(id)
{
	saveData(id);
	resetData(id);
}

public resetData(id)
{
	ilosc_jbpack[id] = 0.00
}

public saveData(id)
{
	if(!connected || is_user_bot(id) || is_user_hltv(id))
		return PLUGIN_CONTINUE;

	new len_full, temp_full[2048];

	mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza));

	len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza);
	SQL_ThreadQuery(info, "saveDataHandler", temp_full);
	return PLUGIN_CONTINUE;
}

public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
	if(failstate != TQUERY_SUCCESS)
	{
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}

public readData(id)
{
	if(!connected || is_user_bot(id) || is_user_hltv(id))
		return PLUGIN_CONTINUE;

	new data[1], temp[2048], name[33];
	data[0] = id;

	mysql_escape_string(name, charsmax(name));

	formatex(temp, charsmax(temp), "SELECT * FROM `szlugid` WHERE `name` = '%s'", nazwa_gracza);
	SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data));
	return PLUGIN_CONTINUE;
}

public readDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
	new id = data[0];

	if(failstate != TQUERY_SUCCESS)
	{
		log_amx("Error %s", error)
		return PLUGIN_CONTINUE;
	}
	new Float:ilosc_pre;
	if(SQL_MoreResults(query))
	{

	SQL_ReadResult(query, 1, ilosc_pre)
	ilosc_jbpack[id] = ilosc_pre
	}
	else
	{
		new data[1];
		data[0] = id;

		if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id))
			return PLUGIN_CONTINUE;

		new temp[2048];
		mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza));

		format(temp, charsmax(temp), "INSERT INTO `szlugid` (`name`, `szlugi`) VALUES ('%s', '0')", nazwa_gracza); 
		SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data));
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}
public readDataHandler2(failstate, Handle:query, error[], errnum, data[], size)
{
	if(failstate != TQUERY_SUCCESS)
	{
		log_amx("Wczytywanie dla %s blad %s", nazwa_gracza, error);
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}

stock mysql_escape_string(output[], len)
{
	static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" };
	static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" };
	for(new i; i < sizeof szReplaceIn; i++)
		replace_all(output, len, szReplaceIn[i], szReplaceOut[i]);
}

Nie wiem już sam o co chodzi, już trochę z tym się męczę. Z góry dzięki za pomoc

 

 

 


Użytkownik Black004 edytował ten post 03.08.2019 17:19
Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 03.08.2019

W ReadData robisz escape string na pustej zmiennej 'name', a używasz nazwa_gracza, która jeszcze nie jest 'przerobiona', bo ReadData wykonuje się od razu po połączeniu. Jeśli to nie to, będziemy szukać dalej.

 

Zmienna nazwa_gracza jest tablicą jednowymiarową - przechowa najwyżej jeden napis.

Zmień deklaracje z

new nazwa_gracza[64]

na

new nazwa_gracza[33][64]

a przy pobieraniu nazwy rób

get_user_name(id, nazwa_gracza[id], charsmax(nazwa_gracza[]));
public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
	if(failstate != TQUERY_SUCCESS)
	{
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}

^ empty statement / bezsensowny statement


Użytkownik aSiorr edytował ten post 03.08.2019 19:54
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 03.08.2019

Nie musisz tak robić:

new len_full, temp_full[2048];
len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza);

wystarczy:

new temp_full[2048];
formatex(temp_full, charsmax(temp_full), "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza);

Rivit (03.08.2019 20:09):
To tylko tak jako dodatkowa informacja ;)
Odpowiedz

  • +
  • -
Black004 - zdjęcie Black004 04.08.2019

hmm Chyba działa, ale długo się ładują te zapisy da się jakoś to przyśpieszyć? Jak gracz wchodzi na serwer to mija z około 3 sekundy zanim się wszystko załaduję xD

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 04.08.2019

No to może być problem ze słabym połączeniem do bazy lub obciążeniem serwera.

 

normalnie wczytywanie tez ma opoznienie, ale aż 3 sekundowe to raczej nie.

Spróbuj lokalnie sobie baze postawić i do niej się łączyć i zobaczysz czy to wina kodu czy bazy :D

Odpowiedz

  • +
  • -
Black004 - zdjęcie Black004 04.08.2019

Chyba źle to napisałem, chodziło mi, że jeżli jest nowa mapa to zanim się wszystko załaduje mija te około 3 sekundy, ale jezeli jakiś gracz dołączy w trakcie gry lub jak juz się po prostu załadowało to nie ma aż tak dużego opóźnienia. Możliwe jest że tak się dzieje przez tego taska 1 sekundowego?
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 04.08.2019

Tak, task + zmiana mapy, ale to nie ma znaczenia chyba, bo i tak zdąży sie z baza polaczyc zanim gracze wejda

Odpowiedz

  • +
  • -
Black004 - zdjęcie Black004 04.08.2019

Jednak czasami zapis znowu nie działa sam sie przekonałem, wbiłem na serwer i nie dostałem moich zapisanych szlugów :/

 

Kod:

public client_putinserver(id)
{
	get_user_name(id, nazwa_gracza[id], charsmax(nazwa_gracza[]));
	resetData(id);
	readData(id);
}

public client_disconnect(id)
{
	saveData(id);
	resetData(id);
}

public resetData(id)
{
	ilosc_jbpack[id] = 0.00
}

public saveData(id)
{
	if(!connected || is_user_bot(id) || is_user_hltv(id))
		return PLUGIN_CONTINUE;

	new temp_full[2048];

	mysql_escape_string(nazwa_gracza[id], charsmax(nazwa_gracza));

	formatex(temp_full, charsmax(temp_full), "UPDATE `szlugid` SET `szlugi` = '%.2f' WHERE `name` = ^"%s^";", ilosc_jbpack[id], nazwa_gracza[id]);
	SQL_ThreadQuery(info, "saveDataHandler", temp_full);
	return PLUGIN_CONTINUE;
}

public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
	if(failstate != TQUERY_SUCCESS)
	{
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}

public readData(id)
{
	if(!connected || is_user_bot(id) || is_user_hltv(id))
		return PLUGIN_CONTINUE;

	new data[1], temp[2048];
	data[0] = id;

	mysql_escape_string(nazwa_gracza[id], charsmax(nazwa_gracza));

	formatex(temp, charsmax(temp), "SELECT * FROM `szlugid` WHERE `name` = '%s'", nazwa_gracza[id]);
	SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data));
	return PLUGIN_CONTINUE;
}

public readDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
	new id = data[0];

	if(failstate != TQUERY_SUCCESS)
	{
		log_amx("Error %s", error)
		return PLUGIN_CONTINUE;
	}
	new Float:ilosc_pre;
	if(SQL_MoreResults(query))
	{

	SQL_ReadResult(query, 1, ilosc_pre)
	ilosc_jbpack[id] = ilosc_pre
	}
	else
	{
		new data[1];
		data[0] = id;

		if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id))
			return PLUGIN_CONTINUE;

		new temp[2048];
		mysql_escape_string(nazwa_gracza[id], charsmax(nazwa_gracza));

		format(temp, charsmax(temp), "INSERT INTO `szlugid` (`name`, `szlugi`) VALUES ('%s', '0')", nazwa_gracza[id]); 
		SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data));
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}
public readDataHandler2(failstate, Handle:query, error[], errnum, data[], size)
{
	new id = data[0];
	if(failstate != TQUERY_SUCCESS)
	{
		log_amx("Wczytywanie dla %s blad %s", nazwa_gracza[id], error);
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}

stock mysql_escape_string(output[], len)
{
	static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" };
	static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" };
	for(new i; i < sizeof szReplaceIn; i++)
		replace_all(output, len, szReplaceIn[i], szReplaceOut[i]);
}
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 04.08.2019

pozakładaj sobie logi na wczytywanie zapisywanie i śledź zmienne, wtedy zobaczysz co nie tak jest.

PAtrz też w baze danych czy dobrze zapisało.

Samodzielności troche...

Odpowiedz

  • +
  • -
Black004 - zdjęcie Black004 04.08.2019

pozakładaj sobie logi na wczytywanie zapisywanie i śledź zmienne, wtedy zobaczysz co nie tak jest.

PAtrz też w baze danych czy dobrze zapisało.

Samodzielności troche...

 

 

Logi zrobiłem i wszystko dobrze wypisuję, dodam jeszcze, że usunęło mi nie tylko szlugi, ale wszędzie gdzie robiłem ten właśnie zapis :/

 


Użytkownik Black004 edytował ten post 04.08.2019 16:29
Odpowiedz

  • +
  • -
Black004 - zdjęcie Black004 05.08.2019

@Ref
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 05.08.2019

To pokaż te logi z przypadku gdy wystąpił bug
Odpowiedz

  • +
  • -
Black004 - zdjęcie Black004 17.08.2019

To pokaż te logi z przypadku gdy wystąpił bug

 

Bug występuję podczas wczytywania szlugów, rzadko występuję, ale jak już wystąpi to usuwa zapis gracza z innych pluginów, gdzie właśnie używam tego kodu.

 

Mój kod się troche zmienił wygląda on teraz tak:

public client_authorized(id)
{
	resetData(id);
	set_task(0.1, "readData", id + TASK_DATA);
}
public readData(id)
{

	if (!connected) {
		set_task(1.0, "readData", id);
		return;
	}

	id -= TASK_DATA;


	if(!connected || is_user_bot(id) || is_user_hltv(id))
		return;

	new data[1];
	data[0] = id;
		
	new nazwa_gracza[33];
	get_user_name(id, nazwa_gracza, charsmax(nazwa_gracza));
	mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza));
	new temp[512];
	formatex(temp, charsmax(temp), "SELECT * FROM `szlugid` WHERE `name` = '%s'", nazwa_gracza);
	SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data));
	return;
}

public readDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
	new id = data[0];

	if(failstate != TQUERY_SUCCESS)
	{
		log_amx("Error %s", error)
		return PLUGIN_CONTINUE;
	}
	new Float:ilosc_pre;
	new nazwa = SQL_FieldNameToNum(query,"szlugi")
	if(SQL_MoreResults(query))
	{

	SQL_ReadResult(query, nazwa, ilosc_pre)
	ilosc_jbpack[id] = ilosc_pre
		log_amx("LOAD %.2f", ilosc_jbpack[id])
	}
	else
	{

	if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id))
		return PLUGIN_CONTINUE;
		
		new data[1];
		data[0] = id;
		
	new nazwa_gracza[33];
	get_user_name(id, nazwa_gracza, charsmax(nazwa_gracza));
	mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza));
			
		new temp[512];

		format(temp, charsmax(temp), "INSERT INTO `szlugid` (`name`, `szlugi`) VALUES ('%s', '0')", nazwa_gracza); 
		SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data));
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}

Dziwne to jest, kompletnie nie mam pojęcia o co chodzi :/

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 17.08.2019

no musisz logi dodać sobie i popatrzec co sie dzieje w momencie gdy bug występuje.

Obloguj sobie każdą zmienną, każdego ifa i szukaj, bo tak to szukanie na ślepo.

Odpowiedz

  • +
  • -
Black004 - zdjęcie Black004 17.08.2019

no musisz logi dodać sobie i popatrzec co sie dzieje w momencie gdy bug występuje.

Obloguj sobie każdą zmienną, każdego ifa i szukaj, bo tak to szukanie na ślepo.

 

 

Nie ma szybszego sposobu ? xD Bo w sumie jak patrzyłem na inne kody mysql z zapisywanie i wczytywanie wygląda prawie identycznie co u mnie, więc dlaczego tam działa, a mi nie ?

Odpowiedz

  • +
  • -
Hiko - zdjęcie Hiko 17.08.2019

 

no musisz logi dodać sobie i popatrzec co sie dzieje w momencie gdy bug występuje.

Obloguj sobie każdą zmienną, każdego ifa i szukaj, bo tak to szukanie na ślepo.

 

 

Nie ma szybszego sposobu ? xD Bo w sumie jak patrzyłem na inne kody mysql z zapisywanie i wczytywanie wygląda prawie identycznie co u mnie, więc dlaczego tam działa, a mi nie ?

 

nie ma szybszego i ten jest najlepszy :)

Odpowiedz