Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2018-01-26, 07:41


MG303







Wiek: 30
Na forum: 6418 dni
Posty: 654

Piwa: 2990

Respekt: 231,6
Respekt: 231,6Respekt: 231,6

Jak poprawnie przekonwertowa? unix z mysql? :x

Pawn
    new q[150];
    format(qsizeof(q), "SELECT FROM_UNIXTIME(Kiedy, '%%d %%m %%Y %%H:%%I'), FROM_UNIXTIME(DoKiedy, '%%d %%m %%Y %%H:%%I') FROM `BANY` WHERE `Nick` = '%s' LIMIT 1)"dateB[2], dateB[1], dateB[0], dateB[3], dateB[4], dateU[2], dateU[1], dateU[0], dateU[3], dateU[4], banned);
    mysql_query(q);
    mysql_free_result();


Czy w jednym zapytaniu powinien by? jeden unix?

Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-01-26, 21:21


Combacior







Wiek: 29
Na forum: 5795 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
Je?li u?ywasz kwerendy SELECT, to wynik uzyskasz za pomoc? funkcji mysql_fetch_row -> sscanf, ta tablica daty w funkcji format jest niepotrzebna

Kod:

new lDate[5];
mysql_query(...); //FROM_UNIXTIME(pole, '%%H %%i %%d %%m %%Y')
mysql_store_result();
mysql_fetch_row(s, " ");
mysql_free_result();
sscanf(s, "a<i>[5]", lDate); //tablica lDate zawiera date uzyskana z czasu uniksowego


Nie ma ?adnego limitu je?li chodzi o FROM_UNIXTIME.

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 1 piw(a):
MG303
Wysłany: 2018-01-27, 07:46


MG303







Wiek: 30
Na forum: 6418 dni
Posty: 654

Piwa: 2990

Respekt: 231,6
Respekt: 231,6Respekt: 231,6

Edit: cutcut

i tu jest pytanie: sk?d w?a?ciwie serwer ma wiedzie?, kt?ry Unixtime DoKiedy i z kt?rego rekordu ma przekonwertowa? na zwyk?? dat?? Przecie? zbanowanych u?ytkownik?w mo?e by? sporo. Chyba, ?e funkcja UnixTime nie musi pobiera? warto?ci z tabeli, tylko prosto z gry xD Prosz? o wyt?umaczenie.

Jednak powr?ci?em do inc. timestamptodate i tu jest problem:
Banuj?c gracza, daty dobrze si? konwertuj?.
Pawn
     UnbanTime gettime() + (hours 3600);
    AktualnyCzas gettime();
    //Konwertuje czasy unix
                                //rok  //miesiac //dzien //godzina //minuta //sekunda
    TimestampToDate(UnbanTime,dateU[0],dateU[1],dateU[2],dateU[3],dateU[4],dateU[5], 10);

    TimestampToDate(AktualnyCzas,dateB[0],dateB[1],dateB[2],dateB[3],dateB[4],dateB[5], 10);


w GUI pokazuje w?a?ciw? godzin?.
Ale teraz, gdy wchodz? na serwer, wiadomo?? pokazuj?, ?e ban jest d?u?szy o godzin? :huh: .

Pawn
            UnbanTime UnbanTime gettime();
            TimestampToDate(UnbanTime,dateU[0],dateU[1],dateU[2],dateU[3],dateU[4],dateU[5], 10);
            TimestampToDate(BanTime,dateB[0],dateB[1],dateB[2],dateB[3],dateB[4],dateB[5], 10);

Oczywi?cie w obu przypadkach uwzgl?dniam GMT+1

Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-01-27, 08:36


AlfaPVP







Wiek: 29
Na forum: 3050 dni
Posty: 8
Nick w MP: AlfaPVP

Piwa: 1

Respekt: 50

Ostrzeżeń: 100%
Hmmm, tak naprawd? to nie widz? sensu korzystania z czasu Unix'owego kt?ry jest w MySQL. Du?o pro?ciej b?dzie Ci zrobi? taki system ban?w za pomoc? funkcji gettime() w PAWN.

// Banowanie gracza

Czas:

Kod:

new time = (gettime() + (86400 * 30)); // 30 to liczba dni.


Zapytanie przy banie:

Kod:


format(buffer, sizeof buffer, "insert into `bans` (ip, nick, time) values ('%s', '%s', '%d')", IP, Nick, time);


Oczywi?cie IP oraz nick do uzupe?nienia tablicami w formacie.

Zapytanie przy wej?ciu:
Kod:

format(buffer, sizeof buffer, "select ip, nick, time from bans where ip='%s' or nick='%s'", IP, Nick);
mysql_query(buffer);
mysql_store_result();
if(mysql_num_rows() != 0) {
// Istnieje ban
mysql_fetch_row(buffer, "|");

new ip[16], nick[24], time;
sscanf(buffer, "p<|>s[16]s[24]d", ip, nick, time); // Rozdzielamy wczytane z bazy danych wyniki....
if(gettime() < time){
// Banik aktywny, nie wpuszczamy gracza na serwer.
// Obliczamy mu czas, jaki pozosta? do ko?ca unbana, kodu poni?ej chyba nie trzeba t?umaczy?.

new d, h, m, s;
timediff((time - gettime()), d, h, m, s); //

//
}
else
{
format(buffer, sizeof buffer, "delete from bans where ip='%s' or nick='%s'", IP, Nick);
mysql_query(buffer); // Usuwamy przedawnionego ju? bana.

}

}
else
{
// Nie istnieje, rejestracja/logowanie.
}

mysql_free_result();


Funkcja timediff:

Kod:


stock timediff(seconds, &d, &h, &m, &s)
{
if(seconds < 0)
{
d = 0;
h = 0;
m = 0;
s = 0;
return;
}

d = seconds;

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


Mateusz, pozdr?w Koni?skie rejony :mrgreen:

Postaw piwo autorowi tego posta
 

 
Wysłany: 2018-01-27, 11:15


Combacior







Wiek: 29
Na forum: 5795 dni
Posty: 1516

Piwa: 2161

Respekt: 1060
Respekt: 1060

Ostrzeżeń: 20%
"MG303" napisał/a:

Przecie? zbanowanych u?ytkownik?w mo?e by? sporo


Po to jest klauzula WHERE, ?eby pobra? dane z konkretnego nicku/IP.

"AlfaPVP" napisał/a:

Hmmm, tak naprawd? to nie widz? sensu korzystania z czasu Unix'owego kt?ry jest w MySQL


?e co prosz?? Faktycznie, lepiej u?ywa? prymitywnych funkcji PAWN czy w?asnych "tajmdiff?w" lol Dzisiejsza data rejestracji, chyba banik si? szykuje za multikonto, ale niewa?ne.

Wracaj?c do tematu, je?li chodzi o banowanie, to najlepiej b?dzie stworzy? dwie kolumny dotycz?ce czasu:

1. Czas nadania (UNIX)
2. Okre?lony czas (w sekundach)

Wtedy mo?esz nada? bana nie tylko czasowego, ale tak?e sta?ego (jako czas bana da? 0). ?atwo b?dzie tak?e okre?li? dat? nadania bana, czas jaki pozosta? do ko?ca (je?li czasowy) czy dat? wyga?ni?cia - wszystko w jednym zapytaniu.

Kod:

//wrzucamy czas uniksowy i czas, na jaki gracz ma zostac zbanowany, dodaj sobie nick gracza i reszte, co tam chcesz, jesli ban ma byc staly, kolumna b_time ustaw na 0
INSERT INTO ban_info SET b_date = UNIX_TIMESTAMP(), b_time = %d

//data nadania
FROM_UNIXTIME(b.b_date, '%%H %%i %%d %%m %%Y')

//czy ban aktywny, pole zwroci -1, jesli ban czasowy wygasl, zwroci 0 jesli ban staly, zwroci czas zbanowania w sekundach jesli ban aktywny
IF(b.b_date + b.b_time < UNIX_TIMESTAMP() AND b.b_time != 0, -1, b.b_time)

//jesli ban czasowy, zwroci date odbanowania
FROM_UNIXTIME(b.b_date + b.b_time, '%%H %%i %%d %%m %%Y')


Tak z tego korzystam ja u siebie

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 1 piw(a):
MG303
Wysłany: 2018-01-27, 12:48


MG303







Wiek: 30
Na forum: 6418 dni
Posty: 654

Piwa: 2990

Respekt: 231,6
Respekt: 231,6Respekt: 231,6

Troch? pokombinowa?em i uda?o si? osi?gn?? cel. + dzi?ki za pomys? ze sta?ym banem xD

Postaw piwo autorowi tego posta
 

 
Tagi: unixtime
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » PAWN » UnixTime Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku