Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Mieszanie się rekordów mysql.


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
15 odpowiedzi w tym temacie

#1 Black004

    Wszechpomocny

  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 03.08.2019 17:15

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

  • +
  • -
  • 0

#2 Robiin

    Godlike

  • Support Team

Reputacja: 1 107
Super Hero

  • Postów:2 051
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 03.08.2019 19:43

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

  • +
  • -
  • 1

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#3 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 03.08.2019 20:09

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 ;)

  • +
  • -
  • 1

#4 Black004

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 04.08.2019 08:24

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


  • +
  • -
  • 0

#5 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 04.08.2019 09:15

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


  • +
  • -
  • 0

#6 Black004

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 04.08.2019 12:03

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?
  • +
  • -
  • 0

#7 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 04.08.2019 12:15

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


  • +
  • -
  • 0

#8 Black004

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 04.08.2019 15:50

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]);
}

  • +
  • -
  • 0

#9 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 04.08.2019 16:03

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...


  • +
  • -
  • 0

#10 Black004

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 04.08.2019 16:27

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

  • +
  • -
  • 0

#11 Black004

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 05.08.2019 09:12

@Ref
  • +
  • -
  • 0

#12 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 05.08.2019 14:06

To pokaż te logi z przypadku gdy wystąpił bug
  • +
  • -
  • 0

#13 Black004

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 17.08.2019 10:07

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 :/


  • +
  • -
  • 0

#14 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 17.08.2019 10:27

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.


  • +
  • -
  • 0

#15 Black004

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 14
Początkujący

  • Postów:371
  • GG:
  • Imię:Błażej
  • Lokalizacja:Polska
Offline

Napisano 17.08.2019 11:51

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 ?


  • +
  • -
  • 0

#16 Hiko

    Wszechpomocny

  • Użytkownik

Reputacja: 34
Życzliwy

  • Postów:302
Offline

Napisano 17.08.2019 11:58

 

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 :)


  • +
  • -
  • 0

POMAGAM NA ILE TYLKO POTRAFIĘ !

 

 





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych