Skocz do zawartości
Sielly

Nietypowy błąd z mysql

Rekomendowane odpowiedzi

Witajcie, mam następujący problem.

Tworzę system logowania na MySQL i jest problem następujący - pierwszy gracz wchodzi na serwer i wszystko jest ok, pobiera mu informacje z tabeli 'gracze' itd. Gdy wchodzi drugi gracz na serwer to skrypt nie pobiera żadnych rekordów z mysql. Nie ma zależności od tego na jakie konto się loguje itp itd. Po prostu drugi i kolejny gracz który wchodzi na serwer nie może się zalogować bo nie pobiera mu danych z tabeli.

 

public OnPlayerConnect(playerid)
{
	    new query[128], nick[MAX_PLAYER_NAME];
    new string[300];
    GetPlayerName(playerid, nick, MAX_PLAYER_NAME);
    mysql_format(g_SQL,query,sizeof(query),"SELECT * FROM `gracze` WHERE `nick` LIKE '%e' LIMIT 1;",nick);
    mysql_tquery(g_SQL, query, "GetPlayerData", "i", playerid);
    return 0;
}

forward GetPlayerData(playerid);
public GetPlayerData(playerid)
{
    if(cache_num_rows() == 0)
    {
        new string[100];
        format(string,sizeof(string),"* Załóż konto - wejdź na naszą stronę %s.",PAGE);
        SendClientMessage(playerid,0xFF0000FF,string);
        SetTimerEx("DelayedKick", 1000, false, "i", playerid);
    }else{
        new ORM:ormid = Player[playerid][ORM_ID] = orm_create("gracze");
        orm_addvar_int(ormid, Player[playerid][ID], "id");
        orm_addvar_int(ormid, Player[playerid][uid], "uid");
        orm_addvar_string(ormid, Player[playerid][Nick], 25, "nick");
        orm_addvar_string(ormid, Player[playerid][Pass], 33, "pass");
        orm_addvar_int(ormid, Player[playerid][Logs], "logs");
        orm_addvar_int(ormid, Player[playerid][LastLog], "lastlog");
        orm_addvar_int(ormid, Player[playerid][TimeOnline], "timeonline");
        orm_addvar_string(ormid, Player[playerid][LastIP], 20, "lastip");
        orm_addvar_int(ormid, Player[playerid][GP], "gp");
        orm_addvar_int(ormid, Player[playerid][VIP], "vip");
        orm_addvar_int(ormid, Player[playerid][Banned], "banned");
        orm_addvar_int(ormid, Player[playerid][Admin], "admin");
        orm_addvar_string(ormid, Player[playerid][Admin_acc], 33, "admin_acc");
	    orm_apply_cache(ormid, playerid);

	    Player[playerid][Logs] = Player[playerid][Logs] + 1;
        GetPlayerIp(playerid,Player[playerid][LastIP],20);
	    Player[playerid][Timmer] = SetTimerEx("SavePlayer",60000,1,"i",playerid);
        Player[playerid][TimeOnline] = Player[playerid][TimeOnline] - 60;
        SavePlayer(playerid);
	    ShowPlayerDialog(playerid,Dialog_Login,DIALOG_STYLE_PASSWORD,"Logowanie","Podaj hasło:","Loguj","Wyjdź");
    }
    return 1;
}
	
Edytowane przez Sielly

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na tyle na ile rozumiem angielski %e jest to string bez znaków które mogą "zagrozić" zapytaniu mysql

http://wiki.sa-mp.com/wiki/MySQL

Cytuj
Escapes data directly without the need to call mysql_escape_string() before

Wyprowadź mnie z błędu jeśli się mylę. ;)

Edytowane przez Sielly

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
%d – liczba całkowita ze znakiem w formacie dziesiętnym
%i – synonim dla %d
%x – liczba całkowita bez znaku w formacie szesnastkowym, z użyciem małych liter
%X – liczba całkowita bez znaku w formacie szesnastkowym, z użyciem wielkich liter
%o – liczba całkowita bez znaku w formacie oktalnym
%u – liczba całkowita bez znaku w formacie dziesiętnym
%e – liczba zmiennoprzecinkowa w zapisie naukowym (1.2345e+2)
%E – liczba zmiennoprzecinkowa w zapisie naukowym (1.2345E+2)
%f – liczba zmiennoprzecinkowa typu double (float jest automatycznie konwertowany) w zapisie dziesiętnym (123.45)
%c – liczba całkowita jest konwertowana na bajt o danej wartości
%s – łańcuch tekstowy
%p – wskaźnik
%n – do argumentu zapisywana jest liczba dotychczas zapisanych znaków. Istnienie tego pola prowadzi do dużego niebezpieczeństwa (umożliwia przeprowadzenie niektórych wariantów ataku typu format string) a nie jest zbyt przydatne w praktyce.
Niektóre pola z modyfikatorami:

%ld – liczba całkowita typu long ze znakiem w formacie dziesiętnym
%lld – liczba całkowita typu long long ze znakiem w formacie dziesiętnym – w większości popularnych kompilatorów (np. gcc)
%llu – liczba całkowita typu long long bez znaku w formacie dziesiętnym – jw.
%I64d – liczba całkowita typu long long ze znakiem w formacie dziesiętnym – używane w niektórych kompilatorach (np. Dev-cpp)
%zd – liczba całkowita typu size_t ze znakiem w formacie dziesiętnym
%hd – liczba całkowita typu short ze znakiem w formacie dziesiętnym
% d – liczba całkowita ze znakiem w formacie dziesiętnym, w przypadku liczby dodatniej przed liczbą dać spację
%+d – liczba całkowita typu short ze znakiem w formacie dziesiętnym, zawsze drukować znak
%04d – liczba całkowita, uzupełniana zerami do czterech miejsc.
%lf – liczba zmiennoprzecinkowa typu double w zapisie dziesiętnym (123.456789)
%[^\n]s – w rodzinie sprintf wczytanie całej linii bez znaków kończących linię (CR, LF).

A no możliwe, może się pomyliłem, jak coś to przepraszam

Edytowane przez Dejv

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
5 minut temu, Dejv napisał:

%d – liczba całkowita ze znakiem w formacie dziesiętnym
%i – synonim dla %d
%x – liczba całkowita bez znaku w formacie szesnastkowym, z użyciem małych liter
%X – liczba całkowita bez znaku w formacie szesnastkowym, z użyciem wielkich liter
%o – liczba całkowita bez znaku w formacie oktalnym
%u – liczba całkowita bez znaku w formacie dziesiętnym
%e – liczba zmiennoprzecinkowa w zapisie naukowym (1.2345e+2)
%E – liczba zmiennoprzecinkowa w zapisie naukowym (1.2345E+2)
%f – liczba zmiennoprzecinkowa typu double (float jest automatycznie konwertowany) w zapisie dziesiętnym (123.45)
%c – liczba całkowita jest konwertowana na bajt o danej wartości
%s – łańcuch tekstowy
%p – wskaźnik
%n – do argumentu zapisywana jest liczba dotychczas zapisanych znaków. Istnienie tego pola prowadzi do dużego niebezpieczeństwa (umożliwia przeprowadzenie niektórych wariantów ataku typu format string) a nie jest zbyt przydatne w praktyce.
Niektóre pola z modyfikatorami:

%ld – liczba całkowita typu long ze znakiem w formacie dziesiętnym
%lld – liczba całkowita typu long long ze znakiem w formacie dziesiętnym – w większości popularnych kompilatorów (np. gcc)
%llu – liczba całkowita typu long long bez znaku w formacie dziesiętnym – jw.
%I64d – liczba całkowita typu long long ze znakiem w formacie dziesiętnym – używane w niektórych kompilatorach (np. Dev-cpp)
%zd – liczba całkowita typu size_t ze znakiem w formacie dziesiętnym
%hd – liczba całkowita typu short ze znakiem w formacie dziesiętnym
% d – liczba całkowita ze znakiem w formacie dziesiętnym, w przypadku liczby dodatniej przed liczbą dać spację
%+d – liczba całkowita typu short ze znakiem w formacie dziesiętnym, zawsze drukować znak
%04d – liczba całkowita, uzupełniana zerami do czterech miejsc.
%lf – liczba zmiennoprzecinkowa typu double w zapisie dziesiętnym (123.456789)
%[^\n]s – w rodzinie sprintf wczytanie całej linii bez znaków kończących linię (CR, LF).

A no możliwe, może się pomyliłem, jak coś to przepraszam

Panie, ale to nie jest format() tylko mysql_format() 

// Ba, nawet jakieś funkcje z php widzę "sprintf" :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wracając do tematu:

 

zauważyłem, że jak druga osoba wchodzi na serwer to zapytanie jest wysyłane prawidłowo, tzn pojawia się jej nick tam gdzie powinien w zapytaniu itp. Potem w GetPlayerData() cache_num_rows() wyrzuca że jest 1 (znaleziono rekord), bo nie wyskakuje komunikat żeby założyć konto. Tylko koniec końców zmienne nie są aktualizowane danymi z mysql..

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Sielly Źle tego używasz [link].

ORM jest zamiast kwerend, a nie do pobrania wyniku kwerendy wybierającej do pamięci cache i odczytania jej zawartości.

Edytowane przez PrzMas

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

×