Skocz do zawartości
Shady.

Pobieranie daty i godziny z bazy danych

Rekomendowane odpowiedzi

Witam po raz kolejny!

Jak zwykle po długim, wyczerpującym i niestety nieowocnym szukaniu rozwiązania na forum postanowiłem napisać nowy temat. Na wstępie podkreślę, że korzystam z pluginu BlueG.

Wysyłam takie zapytanie do bazy danych mysql (podałem na zdjęciu od razu wyniki jakie baza zwraca, bo samo zapytanie jest ok):

Chciałbym teraz, aby pobrać z tych obydwu wyników zaznaczonych powyżej do enuma, ale to jest już dla mnie niemożliwe do wykonania. Oto kod z najnowszymi moimi zmaganiami w tym kierunku:

mysql_format(mysql,query,sizeof query,"SELECT `id`, `nick`, `password`, `warn`, `score`, `money`, `konto`, `ip`, `team`, `vip`, DATEDIFF(`vipto`,NOW()), TIMEDIFF(`vipto`,NOW()), `leveladmin`, `online`, `lastlogin`, `skin`, `poziom`, `autologin`, `ADR`, `PrawkoA`, `PrawkoB`, `PrawkoC`, `PrawkoCE`, `punktyk`, `block` FROM `users` WHERE `nick` = '%s'",PlayerName(playerid));
mysql_query(mysql,query);

PlayerInfo[playerid][VIPDay] = cache_get_row_int(0, 10); //Różnica daty zapisuje się jako liczba całkowita, więc powinno działać
cache_get_row(0, 11, PlayerInfo[playerid][VIPHour], mysql, 32);//Różnicę czasu chcę zapisać jako string i sscanfem oddzielić do 3 zmiennych jako godzina minuta sekunda ale zeby to zrobić, najpierw muszę pobrać to co jest w bazie, a tak się nie dzieje

Podam wam co pokazuje printf (datę ustawiłem na 30.03.2016 i losowa godzina):

//Printf jest zbufowany tak:
	new data, godzina[32];
	mysql_query(mysql,"SELECT DATEDIFF(`vipto`,NOW()), TIMEDIFF(`vipto`,NOW()) WHERE `nick` = 'szumek'");
	data = cache_get_row_int(0, 0);
	cache_get_row(0, 1, godzina);
	printf("data: %i godzina: %s", data, godzina);

Konsola pokazuje dokładnie tak:

data: 0 godzina:

 

Z góry dziękuję za wszystkie wskazówki i porady,

Shady.

Edytowane przez Shady.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak właśnie mam zamiar robić, ale jak zauważyłeś printf pokazuje ' ' <---- tyle czyli nic. A żebym mógł coś rozbić sscanfem to paradoksalnie najpierw muszę mieć co rozbić.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
2 godziny temu, Shady. napisał:

(...)


//Printf jest zbufowany tak:
	new data, godzina[32];
	mysql_query(mysql,"SELECT DATEDIFF(`vipto`,NOW()), TIMEDIFF(`vipto`,NOW()) WHERE `nick` = 'szumek'");
	data = cache_get_row_int(0, 0);
	cache_get_row(0, 1, godzina);
	printf("data: %i godzina: %s", data, godzina);

(...)

Nie widzę FROM w tym zapytaniu, więc tak na prawdę nie zwróciło ono czegokolwiek, a zmienne liczbowe domyślnie mają wartość 0 i stąd taki printf.
Zakładam, że pole vipto jest typu DATETIME; TIMEDIFF() powinno zwracać w tym przypadku zupełną różnicę czasu z uwzględnieniem dni, czyli liczbę godzin trzeba by sobie podzielić, aby otrzymać dni - DATEDIFF() jest zbędne.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak to mówią, najciemniej jest pod samą latarnią. Poprawiłem ten błędny printf, sprawdziłem i działało poproawnie, wiec usunąłem go z tamtąd i napisałem nowy zaraz pod sscanfem, żeby sprawdzić czy działa poprawnie.

Print i sscanf:

sscanf(PlayerInfo[playerid][VIPHour],"p<:>iii", godzina, minuta, sekunda);
printf("godzina: %i minuta: %i sekunda: %i", godzina, minuta, sekunda);

Konsola:

godzina: 0 minuta: 0 sekunda: 0

Co do dni to łatwiej mi sprawdzać w kodzie czy gracz ma już ostatnie godziny vipa, ale dziękuję za radę c:

Edytowane przez Shady.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Naprawiłem sscanf, problemem był include, a dokładnie jego wersja.

EDIT: Kiedy linijka "cache_get_field_content(...)" jest wśród linijek "GetInt" to nie pobiera się poprawnie string, a kiedy linijka "cache_get_field_content(...)" jest dana nad linijką ze sscanfem w VIP'ie to na serwerze zmienia mi się skin (podejrzewam, że PlayerInfo[playerid][Skin] dostaje złą wartość).

Błagam o pomoc, bo ja już nie mam pomysłów. Oto cały stock:

stock LoadUser(playerid)
{
	//--------------------------------------\/BANK\/---------------------------------------//
	new query[512], query1[512];
	mysql_format(mysql,query,sizeof query,"SELECT * FROM `bank` WHERE `nick` = '%s'",PlayerName(playerid));
	mysql_query(mysql,query);
	 
	PlayerBank[playerid][UID] = GetInt("id");
	PlayerBank[playerid][Money] = GetInt("money");
	PlayerBank[playerid][Pin] = GetInt("pin");
	PlayerBank[playerid][Numerk] = GetInt("numerk");
	PlayerBank[playerid][Zaleglew] = GetInt("zaleglew");
	PlayerBank[playerid][Stankontav] = GetInt("stankontav");
	PlayerBank[playerid][Stanpunktowv] = GetInt("stanpunktowv");
	//--------------------------------------/\BANK/\---------------------------------------//

	//--------------------------------------\/GRACZ\/--------------------------------------//
	SetPVarInt(playerid,"zalogowany",1);
	TextDrawHideForPlayer(playerid, Box[0]);
	TextDrawHideForPlayer(playerid, Box[1]);
	TextDrawHideForPlayer(playerid, LogoWyb);
	TogglePlayerSpectating(playerid, false);
	mysql_format(mysql,query1,sizeof query1,"SELECT `id`, `nick`, `password`, `warn`, `score`, `money`, `konto`, `ip`, `team`, `vip`, DATEDIFF(`vipto`,NOW()), TIMEDIFF(`vipto`,NOW()), `leveladmin`, `online`, `lastlogin`, `skin`, `poziom`, `autologin`, `ADR`, `PrawkoA`, `PrawkoB`, `PrawkoC`, `PrawkoCE`, `punktyk`, `block` FROM `users` WHERE `nick` = '%s'",PlayerName(playerid));
	mysql_query(mysql,query1);

	PlayerInfo[playerid][Money] = GetInt("money");
	PlayerInfo[playerid][Score] = GetInt("score");
	PlayerInfo[playerid][Warn] = GetInt("warn");
	PlayerInfo[playerid][Konto] = GetInt("konto");
	PlayerInfo[playerid][Team] = GetInt("team");
	PlayerInfo[playerid][VIP] = GetInt("vip");
	PlayerInfo[playerid][VIPDay] = cache_get_row_int(0, 10);
	cache_get_field_content(0, "TIMEDIFF(`vipto`,NOW())", PlayerInfo[playerid][VIPHour], mysql, 16); // PROBOWALEM TUTAJ ALBO... 
	PlayerInfo[playerid][LevelAdmin] = GetInt("leveladmin");
	PlayerInfo[playerid][Online] = GetInt("online");
	PlayerInfo[playerid][Skin] = GetInt("skin");
	PlayerInfo[playerid][Poziom] = GetInt("poziom");
	PlayerInfo[playerid][ADR] = GetInt("adr");
	PlayerInfo[playerid][PrawkoA] = GetInt("a");
	PlayerInfo[playerid][PrawkoB] = GetInt("b");
	PlayerInfo[playerid][PrawkoC] = GetInt("c");
	PlayerInfo[playerid][PrawkoCE] = GetInt("ce");
	PlayerInfo[playerid][Punktyk] = GetInt("punktyk");
	PlayerInfo[playerid][Block] = GetInt("block");

	GiveMoneyEx(playerid,PlayerInfo[playerid][Money]);
	GiveScoreEx(playerid,PlayerInfo[playerid][Score]);
	SetPlayerSkin(playerid, PlayerInfo[playerid][Skin]);
	SetPlayerPos(playerid, 1771.6202,-1951.1733,14.1096);
	//--------------------------------------/\GRACZ/\--------------------------------------//

	//---------------------------------------\/VIP\/---------------------------------------//
	new stringvip[256], odj, wynik, dni, godzina, minuta, sekunda;
	if(PlayerInfo[playerid][VIPDay] <= 0)
	{
		cache_get_field_content(0, "TIMEDIFF(`vipto`,NOW())", PlayerInfo[playerid][VIPHour], mysql, 16); // ...ALBO TUTAJ
		printf("elo to: %s", PlayerInfo[playerid][VIPHour]);
		sscanf(PlayerInfo[playerid][VIPHour],"p<:>iii", godzina, minuta, sekunda);
		printf("g: %i m: %i s: %i", godzina, minuta, sekunda);
		if(godzina > 0 || minuta > 0 || sekunda > 0)
		{
			format(stringvip,sizeof stringvip,"{0F94FF}Pozostało ci {45c206} %i godzin(a/y) %i minut(a/y) {0F94FF}i  {45c206}%i sekund(a/y) {0F94FF}korzystania z usługi VIP!", godzina,  minuta, sekunda);
			SendClientMessage(playerid,COLOR_RED,stringvip);
			return 1;
		}
		else
		{
			format(stringvip,sizeof stringvip,"{2d7cd6}Czas twojej usługi VIP minął {FF0000}%d dni {2d7cd6}temu!",ABS(PlayerInfo[playerid][VIPDay]));
			SendClientMessage(playerid,COLOR_RED,stringvip);
			PlayerInfo[playerid][VIP] = 0;
			SaveUser(playerid);
			return 1;
		}
	}
	else if(PlayerInfo[playerid][VIPDay] > 0)
	{
		sscanf(PlayerInfo[playerid][VIPHour],"p<:>iii", godzina, minuta, sekunda);
		dni = godzina/24;
		wynik = dni*24;
		odj = godzina - wynik;
		format(stringvip,sizeof stringvip,"{0F94FF}Pozostało ci {45c206}%d dzień/dni {45c206} %i godzin(a/y) %i minut {0F94FF}i {45c206}%i sekund(a/y) {0F94FF}korzystania z usługi VIP!",dni, odj,  minuta, sekunda);
		SendClientMessage(playerid,COLOR_GREEN,stringvip);
		return 1;
	}
	//---------------------------------------/\VIP/\---------------------------------------//
}

 

Edytowane przez Shady.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Skoro używasz mysql plugin-a BlueG to tutaj masz opisane wszystkie jego funkcje: [link].

Po kodzie widzę, że używasz plugin-a w taki sposób, który wymaga ręcznego kasowania z pamięci podręcznej zawartości zwróconej przez zapytanie, czego ty nie robisz i wykonujesz następne zapytanie. Nie rozumiem po co ci funkcja GetInt skoro plugin ma wyspecjalizowaną w tym celu funkcję [link]. Nie sprawdzasz też czy zapytanie w ogóle zwróciło wynik [link] i przystępujesz do pobierania danych.

Niniejszy plugin ma wyspecjalizowaną funkcję do wykonywania zapytań w wątkach [link], obsługującą transakcje (w odróżnieniu od tej funkcji), a pamięć podręczna jest zarządzana automatycznie. Dodatkowo plugin ma funkcję do formatowania ciągów z zabezpieczeniem przed iniekcją [link]. Dla podstawiania ciągów należy używać specyfikatora %e, zwłaszcza jeżeli te ciągi są wprowadzane przez graczy, np hasło do konta.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hej PrzMas,

Na wstępie bardzo dziękuję za rady, bo okazały się one niezbędne. Niestety nadal borykam się z pewnymi problemami. Zanim jednak do nich przejdę odpowiem na interesującą cię sprawę funkcji GetInt. Otóż polecił mi ją pewien dość stary znajomy, którego nick niejednemu z nas obił się o uszy, a dokładnie Inferno. Funkcja sama w sobie nie robi sporo, ale ułatwia pisanie i upraszcza czytelność kodu. Poszedłem również za radą dotyczącą kasowania pamięci podręcznej i dodałem odpowiednią funkcję we wszystkich tego wymagających miejscach. Przeczytałem również zawartość strony dotyczącej iniekcji, której adres mi podałeś i postanowiłem zamienić specyfikatory zaraz po naprawieniu mojego aktualnego problemu.

Przejdę teraz do samego problemu.

Oto kod:

Stock poniżej oraz

stock LoadUser(playerid)
{
	//--------------------------------------\/BANK\/---------------------------------------//
	new query[512];
	mysql_format(mysql,query,sizeof query,"SELECT * FROM `bank` WHERE `nick` = '%s'",PlayerName(playerid));
	mysql_tquery(mysql, query, "LBank", "d", playerid);
	//--------------------------------------/\BANK/\---------------------------------------//

	//--------------------------------------\/GRACZ\/--------------------------------------//
	mysql_format(mysql,query,sizeof query,"SELECT `id`, `nick`, `password`, `warn`, `score`, `money`, `konto`, `ip`, `team`, `vip`, TIMEDIFF(`vipto`,NOW()), DATEDIFF(`vipto`,NOW()), `leveladmin`, `online`, `lastlogin`, `skin`, `poziom`, `autologin`, `ADR`, `PrawkoA`, `PrawkoB`, `PrawkoC`, `PrawkoCE`, `punktyk`, `block` FROM `users` WHERE `nick` = '%s'",PlayerName(playerid));
	mysql_tquery(mysql,query, "LUser", "d", playerid);
	//--------------------------------------/\GRACZ/\--------------------------------------//
	return 1;
}

wątek:

forward LUser(playerid);
public LUser(playerid)
{
	new NumRows = cache_get_row_count();
	if(NumRows == 1)
	{
		SetPVarInt(playerid,"zalogowany",1);
		TextDrawHideForPlayer(playerid, Box[0]);
		TextDrawHideForPlayer(playerid, Box[1]);
		TextDrawHideForPlayer(playerid, LogoWyb);
		TogglePlayerSpectating(playerid, false);
		PlayerInfo[playerid][Money] = GetInt("money");
		PlayerInfo[playerid][Score] = GetInt("score");
		PlayerInfo[playerid][Warn] = GetInt("warn");
		PlayerInfo[playerid][Konto] = GetInt("konto");
		PlayerInfo[playerid][Team] = GetInt("team");
		PlayerInfo[playerid][VIP] = GetInt("vip");
		PlayerInfo[playerid][VIPDay] = GetInt("DATEDIFF(`vipto`,NOW())");
		cache_get_field_content(0, "TIMEDIFF(`vipto`,NOW())", PlayerInfo[playerid][VIPHour], mysql, 16);
		PlayerInfo[playerid][LevelAdmin] = GetInt("leveladmin");
		PlayerInfo[playerid][Online] = GetInt("online");
		PlayerInfo[playerid][Skin] = GetInt("skin");
		PlayerInfo[playerid][Poziom] = GetInt("poziom");
		PlayerInfo[playerid][ADR] = GetInt("adr");
		PlayerInfo[playerid][PrawkoA] = GetInt("a");
		PlayerInfo[playerid][PrawkoB] = GetInt("b");
		PlayerInfo[playerid][PrawkoC] = GetInt("c");
		PlayerInfo[playerid][PrawkoCE] = GetInt("ce");
		PlayerInfo[playerid][Punktyk] = GetInt("punktyk");
		PlayerInfo[playerid][Block] = GetInt("block");
		GiveMoneyEx(playerid,PlayerInfo[playerid][Money]);
		GiveScoreEx(playerid,PlayerInfo[playerid][Score]);
		SetPlayerSkin(playerid, PlayerInfo[playerid][Skin]);
		SetPlayerPos(playerid, 1771.6202,-1951.1733,14.1096);

		new stringvip[256], odj, wynik, dni, godzina, minuta, sekunda;
		if(PlayerInfo[playerid][VIPDay] <= 0)
		{
			printf("elo to: %s", PlayerInfo[playerid][VIPHour]);
			sscanf(PlayerInfo[playerid][VIPHour],"p<:>iii", godzina, minuta, sekunda);
			printf("g: %i m: %i s: %i", godzina, minuta, sekunda);
			if(godzina > 0 || minuta > 0 || sekunda > 0)
			{
				format(stringvip,sizeof stringvip,"{0F94FF}Pozostało ci {45c206} %i godzin(a/y) %i minut(a/y) {0F94FF}i  {45c206}%i sekund(a/y) {0F94FF}korzystania z usługi VIP!", godzina,  minuta, sekunda);
				SendClientMessage(playerid,COLOR_RED,stringvip);
				return 1;
			}
			else
			{
				format(stringvip,sizeof stringvip,"{2d7cd6}Czas twojej usługi VIP minął {FF0000}%d dni {2d7cd6}temu!",ABS(PlayerInfo[playerid][VIPDay]));
				SendClientMessage(playerid,COLOR_RED,stringvip);
				PlayerInfo[playerid][VIP] = 0;
				SaveUser(playerid);
				return 1;
			}
		}
		else if(PlayerInfo[playerid][VIPDay] > 0)
		{
			sscanf(PlayerInfo[playerid][VIPHour],"p<:>iii", godzina, minuta, sekunda);
			dni = godzina/24;
			wynik = dni*24;
			odj = godzina - wynik;
			format(stringvip,sizeof stringvip,"{0F94FF}Pozostało ci {45c206}%d dzień/dni {45c206} %i godzin(a/y) %i minut {0F94FF}i {45c206}%i sekund(a/y) {0F94FF}korzystania z usługi VIP!",dni, odj,  minuta, sekunda);
			SendClientMessage(playerid,COLOR_GREEN,stringvip);
			return 1;
		}
	}
	return 1;
}

A oto co wypluwa printf:

elo to: -140;3
g: 0 m: 0 s: 0

I na serwerze wiadomość:

Czas twojej usługi VIP minął 6 dni temu!

Wykonałem zapytanie ręcznie i dni pobiera dobrze, ale godziny powinno pobrać inaczej. W bazie miałem wówczas tyle godzin:

-140:26:16

Proszę wskaż mi moją głupotę, bo ilekroć sam patrzę to nie widzę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A to:

PlayerInfo[playerid][VIPHour]

na pewno jest tablicą? Może ma za mały rozmiar. Ewidentnie wynik nie jest w całości zapisywany do tejże zmiennej.

Nie wiem też jak jest z rozpoznawaniem (w pamięci cache plugin-a) takich nazw pól jak:

TIMEDIFF(`vipto`,NOW())

w funkcji cache_get_field_content().
Ja pobierałem zawartość pól funkcjami cache_get_row(), cache_get_row_int() i cache_get_row_float(), natomiast funkcja cache_get_field_content() (i 2 pokrewne) wydawała mi się być niezbyt dobrym rozwiązaniem (przeszukiwanie listy pól danego rekordu element po elemencie i porównywanie szukanej nazwy pola z tą z listy do momentu natrafienia na tożsamą).
Jeśli jednak się upierasz i zakładając, że taka nietypowa nazwa pola (wartość funkcji wbudowanej MySQL) może być problematyczna, to do głowy przychodzi mi alias.

SELECT `id`, `nick`, `password`, `warn`, `score`, `money`, `konto`, `ip`, `team`, `vip`, TIMEDIFF(`vipto`,NOW()), DATEDIFF(`vipto`,NOW()) AS `vipto_tdiff`, `leveladmin`, `online`, `lastlogin`, `skin`, `poziom`, `autologin`, `ADR`, `PrawkoA`, `PrawkoB`, `PrawkoC`, `PrawkoCE`, `punktyk`, `block` FROM `users` WHERE `nick` = '%s';
cache_get_field_content(0, "vipto_tdiff", PlayerInfo[playerid][VIPHour], mysql, 16);

Aby potwierdzić prawdziwość założenia (i konieczność użycia aliasa) ustaw inną datę i sprawdź jak zachowuje się funkcja GetInt() dla nazwy pola TIMEDIFF(`vipto`,NOW()).

Edytowane przez PrzMas
pomiń skreślone

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witaj,

Dzięki za szybką odpowiedź. Otóż zmienna to enum i wątpię aby ta tablica miała za małą ilość znaków, wszak podczas jednej z prób właśnie z wykorzystaniem tej zmiennej udało mi się zapisać do niej czas, ale niestety w tym samym czasie dziwnym sposobem zmieniała się również zmienna odpowiedzialna za przechowanie id skina gracza. Co do ilości znaków, którą trzeba określić w funkcji cache_get_field_content() to myślę, że 16 w tym wypadku: ( -142:33:17) powinno wystarczyć. Jednak dla pewności zwiększyłem i używając do tego funkcji cache_get_row(). 

cache_get_row(0, 10, PlayerInfo[playerid][VIPHour], mysql, 32);

Ta zmiana zawiodła, ponieważ problem pozostał taki sam.

Spróbowałem więc twoim sposobem, jeżeli chodzi o zapytanie i niestety dalej ten sam problem  (zorientowałem się, że AS napisałeś chyba w złym miejscu). Użyłem również podanej przez ciebie funkcji w tym samym czasie rzecz jasna (ta podana w okienku).

Może chciałbyś zobaczyć coś jeszcze w kodzie, co mogłoby kolidować, chociaż nie pamiętam, aby miało to związek z czymś jeszcze. :c

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmm... Osobiście nie używałem tablic o strukturze zorganizowanej enum-ami, zresztą napotkałem problem z używaniem na nich operatora sizeof, więc zastąpiłem je PVar-ami.

Możesz spróbować czegoś takiego:

cache_get_field_content(0, "TIMEDIFF(`vipto`,NOW())", PlayerInfo[playerid][VIPHour][0], mysql, 16);

albo

cache_get_row(0, 10, PlayerInfo[playerid][VIPHour][0], mysql, 16);

(zerowa komórka jest początkowym adresem tablicy int-ów).

Jeśli będziesz ciekaw to zobacz czy wartość pola prawidłowo jest zapisywana do normalnej zmiennej (nie enum-a tablicowego), aby mieć pewność, że dane są prawidłowo pobierane do pamięci cache plugin-a.

new temp[16];
cache_get_field_content(0, "TIMEDIFF(`vipto`,NOW())", temp, mysql);

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Teraz to już w ogóle tego nie rozumiem.

		new temp[16];
		SetPVarInt(playerid,"zalogowany",1);
		TextDrawHideForPlayer(playerid, Box[0]);
		TextDrawHideForPlayer(playerid, Box[1]);
		TextDrawHideForPlayer(playerid, LogoWyb);
		TogglePlayerSpectating(playerid, false);
		PlayerInfo[playerid][Money] = GetInt("money");
		PlayerInfo[playerid][Score] = GetInt("score");
		PlayerInfo[playerid][Warn] = GetInt("warn");
		PlayerInfo[playerid][Konto] = GetInt("konto");
		PlayerInfo[playerid][Team] = GetInt("team");
		PlayerInfo[playerid][VIP] = GetInt("vip");
		PlayerInfo[playerid][VIPDay] = GetInt("DATEDIFF(`vipto`,NOW())");
		cache_get_row(0, 10, temp);
		cache_get_row(0, 10, PlayerInfo[playerid][VIPHour], mysql, 32);
		PlayerInfo[playerid][LevelAdmin] = GetInt("leveladmin");
		PlayerInfo[playerid][Online] = GetInt("online");
		PlayerInfo[playerid][Skin] = GetInt("skin");
		PlayerInfo[playerid][Poziom] = GetInt("poziom");
		PlayerInfo[playerid][ADR] = GetInt("adr");
		PlayerInfo[playerid][PrawkoA] = GetInt("a");
		PlayerInfo[playerid][PrawkoB] = GetInt("b");
		PlayerInfo[playerid][PrawkoC] = GetInt("c");
		PlayerInfo[playerid][PrawkoCE] = GetInt("ce");
		PlayerInfo[playerid][Punktyk] = GetInt("punktyk");
		PlayerInfo[playerid][Block] = GetInt("block");
		GiveMoneyEx(playerid,PlayerInfo[playerid][Money]);
		GiveScoreEx(playerid,PlayerInfo[playerid][Score]);
		SetPlayerSkin(playerid, PlayerInfo[playerid][Skin]);
		SetPlayerPos(playerid, 1771.6202,-1951.1733,14.1096);
		printf("temp to: %s", temp);

printf wypluwa poprawnie pobrane dane z mysql dla tego temp, ale już tak samo wykonany enum nie.

Kiedy zrobię tak:

forward LUser(playerid);
public LUser(playerid)
{
	new NumRows = cache_get_row_count();
	if(NumRows == 1)
	{
		SetPVarInt(playerid,"zalogowany",1);
		TextDrawHideForPlayer(playerid, Box[0]);
		TextDrawHideForPlayer(playerid, Box[1]);
		TextDrawHideForPlayer(playerid, LogoWyb);
		TogglePlayerSpectating(playerid, false);
		PlayerInfo[playerid][Money] = GetInt("money");
		PlayerInfo[playerid][Score] = GetInt("score");
		PlayerInfo[playerid][Warn] = GetInt("warn");
		PlayerInfo[playerid][Konto] = GetInt("konto");
		PlayerInfo[playerid][Team] = GetInt("team");
		PlayerInfo[playerid][VIP] = GetInt("vip");
		PlayerInfo[playerid][VIPDay] = GetInt("DATEDIFF(`vipto`,NOW())");
		PlayerInfo[playerid][LevelAdmin] = GetInt("leveladmin");
		PlayerInfo[playerid][Online] = GetInt("online");
		PlayerInfo[playerid][Skin] = GetInt("skin");
		PlayerInfo[playerid][Poziom] = GetInt("poziom");
		PlayerInfo[playerid][ADR] = GetInt("adr");
		PlayerInfo[playerid][PrawkoA] = GetInt("a");
		PlayerInfo[playerid][PrawkoB] = GetInt("b");
		PlayerInfo[playerid][PrawkoC] = GetInt("c");
		PlayerInfo[playerid][PrawkoCE] = GetInt("ce");
		PlayerInfo[playerid][Punktyk] = GetInt("punktyk");
		PlayerInfo[playerid][Block] = GetInt("block");
		GiveMoneyEx(playerid,PlayerInfo[playerid][Money]);
		GiveScoreEx(playerid,PlayerInfo[playerid][Score]);
		SetPlayerSkin(playerid, PlayerInfo[playerid][Skin]);
		SetPlayerPos(playerid, 1771.6202,-1951.1733,14.1096);

		mysql_format(mysql,query,sizeof query,"SELECT TIMEDIFF(`vipto`,NOW()) FROM `users` WHERE `nick` = '%s'",PlayerName(playerid));
		mysql_tquery(mysql,query, "LUserVip", "d", playerid);

	}
	return 1;
}
forward LUserVip(playerid);
public LUserVip(playerid)
{
	new stringvip[256], odj, wynik, dni, godzina, minuta, sekunda;
	if(PlayerInfo[playerid][VIPDay] <= 0)
	{
		cache_get_row(0, 0, PlayerInfo[playerid][VIPHour], mysql, 32);
		printf("elo to: %s", PlayerInfo[playerid][VIPHour]);
		sscanf(PlayerInfo[playerid][VIPHour],"p<:>iii", godzina, minuta, sekunda);
		printf("g: %i m: %i s: %i", godzina, minuta, sekunda);
		if(godzina > 0 || minuta > 0 || sekunda > 0)
		{
			format(stringvip,sizeof stringvip,"{0F94FF}Pozostało ci {45c206} %i godzin(a/y) %i minut(a/y) {0F94FF}i  {45c206}%i sekund(a/y) {0F94FF}korzystania z usługi VIP!", godzina,  minuta, sekunda);
			SendClientMessage(playerid,COLOR_RED,stringvip);
			return 1;
		}
		else
		{
			format(stringvip,sizeof stringvip,"{2d7cd6}Czas twojej usługi VIP minął {FF0000}%d dni {2d7cd6}temu!",ABS(PlayerInfo[playerid][VIPDay]));
			SendClientMessage(playerid,COLOR_RED,stringvip);
			PlayerInfo[playerid][VIP] = 0;
			SaveUser(playerid);
			return 1;
		}
	}
	else if(PlayerInfo[playerid][VIPDay] > 0)
	{
		sscanf(PlayerInfo[playerid][VIPHour],"p<:>iii", godzina, minuta, sekunda);
		dni = godzina/24;
		wynik = dni*24;
		odj = godzina - wynik;
		format(stringvip,sizeof stringvip,"{0F94FF}Pozostało ci {45c206}%d dzień/dni {45c206} %i godzin(a/y) %i minut {0F94FF}i {45c206}%i sekund(a/y) {0F94FF}korzystania z usługi VIP!",dni, odj,  minuta, sekunda);
		SendClientMessage(playerid,COLOR_GREEN,stringvip);
		return 1;
	}
	return 1;
}

To nagle cudownym tknięciem ręki boskiej enum działa i pobiera poprawnie dane z mysql. Wszystko ładnie pięknie, ale znowu tym razem zmienia mi skina wchodząc do gry.

 

EDIT:

Zapomniałem dopisać, że podczas próby użycia tej funkcji z zerem w enumie (podane przez ciebie rozwiązanie) nie działa, ponieważ nie chce się wtedy skompilować.

Edytowane przez Shady.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Szczerze nie czytałem całego ale słowa klucze mówią mi, że chcesz dodawać i odejmować datę, a jak dla mnie nie ma nic prostszego niż timestamp.

W tabeli mysql wystarczy dodać int - ja zawsze daje długość 11, do długich wartości. Operacje datowe są proste jak dodanie tego.

Załóżmy, że wartość ta z bazy danych, którą pobrałeś nazywa się vip.

Sprawdzasz, czy vip jest aktywny uzywając "vip > gettime()"

By nadać vipa od tej chwili, to używasz "vip = (gettime() + 86400)"

86400 sekund to jeden dzień.

Chcesz dodać więcej dni? Banał. "vip = (gettime() + (86400*dni))" gdzie za dni podajesz ich mnożnik.

Co dzięki temu zyskasz? Dosłownie czas. Zapisujesz to jako integer, wczytujesz to jako integer. 

Mam nadzieję, że trafiłem czytając słowa-klucze i nie tylko jebłem postem, ale także dałem Ci prostszą drogę do weryfikacji daty.

Gratis masz tu formatowanie date z timestampa do tekstu. :) http://pastebin.com/b5Caqjpu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
stock date2unix(Y,M,D, h=0,m=0,s=0, timezone= 0)
{
  if ( !(0 <= s <= 59) || !(0 <= m <= 59) || !(0 <= h <= 23) ) return -1;
  if ( !(1 <= D <= 31) || !(1 <= M <= 12) || !(1970 <= Y <= 2038) ) return -1;

  new ts= 0;

  ts += s;
  ts += m*60;
  ts += h*3600;

  ts += D*86400;
  ts += (Y-1970)*31536000;
  ts += ((Y-1972)/4)*86400;

  new md[13]= {0,31,59,90,120,151,181,212,243,273,304,334};
  ts += md[M-1]*86400;

  if ( ((Y-1972)%4 == 0) && (M == 2) && (D == 29) ) ts -= 86400;

  return ts - (timezone*3600);
}
stock unix2date(ts, &Y,&M,&D, &h,&m,&s, timezone= 0)
{
  D= ts + (timezone*3600);

  s= D % 60; D -= s;
  m= D % 3600; D -= m; m /= 60;
  h= D % 86400; D -= h; h /= 3600;

  D /= 86400;

  new wd= D%7+4; wd= (wd > 7)?(wd-7):(wd);

  Y= D / 365; D %= 365; Y += 1970;

  D -= (Y-1972)/4;

  new md[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
  if ((Y-1972)%4 == 0) { md[1]= 29; D++; }
  for(M= 1; (D > md[M-1]) && (M <= 12); M++) D -= md[M-1];

  return wd; // day of week
}

Tak krócej, arytmetycznie i optymalnie. Miałem jeszcze zamiar dopisać przeliczanie czasu letniego/zimowego, ale... może kiedyś. Funkcja gettime zwraca znacznik bez uwzględniania tegoż czasu, z jednej strony to dobrze, bo nie powstaną nieścisłości przy obliczaniu różnic w czasie, ale jeśli chodzi o wyświetlanie aktualnego czasu dla danej strefy to już niedobrze. Funkcje testowałem z internetowym liczydłem i wartości się pokrywały.

W sumie skuteczne ominięcie problemu z enum-em.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

O jejuśku! Tyle się napracowałeś, ale ja nie jestem pewny czy będę potrafił to wykorzystać. Bardzo mocno dziękuję ci za pomoc, bo się natrudziłeś i poświęciłeś mi sporo czasu. Mniej więcej rozumiem, że stocki zamieniają datę jaką wpiszę na sekundy i odwrotnie (chyba :D).

Spróbuję je wykorzystać i samemu pokombinować, bo i tak zająłem ci już wiele czasu.

Jeszcze raz bardzo dziękuję :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Miło, ale ja to jakiś już czas temu napisałem, a teraz odgrzebałem ze swojego archiwum X, w nawiązaniu do postu @DaGaXeR :P

W twoim przypadku wykorzystanie tego znacznika będzie bardzo proste.

Przydzielenie rangi VIP-a na 3 dni:

new vipto= gettime() + (3*86400); // tak uzyskaną wartość należy zapisać w bazie jako datę wygaśnięcia usługi
new Y,M,D, h,m,s; unix2time(vipto, Y,M,D, h,m,s);
new msg[144]; format(msg, sizeof(msg), "Ranga VIP wygaśnie: %02d-%02d-%04d %02d:%02d:%02d.", Y,M,D, h,m,s);

Sprawdzanie terminu przydatności do spożycia rangi VIP:

stock timediff(seconds, &d,&h,&m,&s)
{
  d= seconds;

  s= d % 60; d -= s;
  m= d % 3600; d -= m;
  h= d % 86400; d -= h;

  m /= 60; h /= 3600; d /= 86400;
}
if (vipto != 0) // 0 oznacza, że należy pominąć sprawdzanie rangi VIP
{
  new timenow= gettime(); // posix timestamp

  if (timenow < vipto) // ranga przydatna do spożycia
  {
    // wyświetlenie czasu do wygaśnięcia VIP-a
    new d,h,m,s; timediff(vipto-timenow, d,h,m,s);
    new msg[144]; format(msg, sizeof(msg), "Do wygaśnięcia rangi VIP pozostało: %dd, %dg, %dm, %ds.", d,h,m,s);
    //albo...
    //new Y,M,D, h,m,s; unix2date(vipto, Y,M,D, h,m,s);
    //new msg[144]; format(msg, sizeof(msg), "Ranga VIP wygaśnie: %02d-%02d-%04d %02d:%02d:%02d.", Y,M,D, h,m,s);
    SendClientMessage(playerid, 0xffffffff, msg);
  }
  else // ranga przeterminowana
  {
    // wyświetlenie informacji dla gracza o wygaśnięciu rangi
    new d,h,m,s; timediff(timenow-vipto, d,h,m,s);
    new msg[144]; format(msg, sizeof(msg), "Ranga VIP wygasła: %dd, %dg, %dm, %ds temu.", d,h,m,s);
    //albo...
    //new Y,M,D, h,m,s; unix2date(vipto, Y,M,D, h,m,s);
    //new msg[144]; format(msg, sizeof(msg), "Ranga VIP wygasła: %02d-%02d-%04d %02d:%02d:%02d.", Y,M,D, h,m,s);
    SendClientMessage(playerid, 0xffffffff, msg);
    // w bazie danych dla pola 'vipto' należy zapisać wartość 0,
    // aby pominąć kolejną informację o wygaśnięciu VIP-a przy następnym sprawdzaniu
  }
}

W zasadzie funkcja date2unix() nie jest potrzebna, chyba że chcesz przydzielać rangę VIP graczowi do określonego (przez administratora nadającego rangę) dnia, podawanego (jako string) w poleceniu według określonego formatu np:

/setvip [id gracza] [data godzina]
/setvip 0 10-04-2016 12:00:00

albo można pominąć podawanie godziny, wówczas byłaby ustawiana data (podana przez administratora) i godzina, ale z chwili wywołania polecenia.
 

Niektórym warto dać gotowca, bo zrobią z niego lepszy użytek niż kopiuj-wklej,
bo reagują adekwatnie do tego, co się do nich pisze i współpracują.
Tacy ludzie rokują.

Edytowane przez PrzMas

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przemek, nie wiem jak mam cie przepraszać, ale naprawiłem mój problem zamieniając zmienną na temp, jak już wcześniej radziłeś. Wcześniej radziłeś mi użyć zwykłej zmiennej, ale ja myślałem, że chodzi o samo sprawdzenie poprawnego pobierania z bazy danych godzin (zamieniłem PlayerInfo[playerid][VIPHour] na temp[16]).

Teraz wszystko działa i naprawdę jeszcze raz bardzo przepraszam za zmarnowanie twojego czasu, którego poświęciłeś wiele. Niemniej jednak nauczyłem się sporo ważnych rzeczy, co mam nadzieje zrekompensuje ci moją okropność.

 

Przepraszam za zajście i dziękuję za razem,

Shady.

Edytowane przez Shady.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×