Szerző Téma: Fizetés MySQL  (Megtekintve 2040 alkalommal)

Nem elérhető Amf

  • 1459
    • Profil megtekintése
Fizetés MySQL
« Dátum: 2018. április 05. - 18:13:02 »
0 Show voters
Hi!
 
 
 
Óránként van ugye fizetés .. lefut, viszont hibát ír,  [ERROR] cache_get_value_name: invalid row index \'X\'
 
 
 


    new STRING[ 128 ]; format( STRING, sizeof( STRING ), \"SELECT * FROM users WHERE PayCheck != \'0\'\" );
    mysql_tquery( MHandle, STRING, \"MakePays\", \"d\", 0 );
 
forward MakePays( playerid );
public MakePays( playerid )
{
    new rows, STRING[ 128 ], NAME[ 24 ], PAY;
    cache_get_row_count( rows ), printf( \"%d\", rows );
    for( new i; i != rows; i ++ )
    {
        cache_get_value_name( i, \"PlayerName\", NAME );
        cache_get_value_name_int( i, \"PayCheck\", PAY );
        mysql_format( MHandle, STRING , sizeof( STRING ), \"UPDATE bank_accounts SET Balance=Balance+%d WHERE Owner=\'%s\' && Disabled=0 LIMIT 1\", PAY, NAME ), mysql_query( MHandle, STRING );
        mysql_format( MHandle, STRING , sizeof( STRING ), \"UPDATE users SET PayCheck=\'0\' WHERE PlayerName=\'%s\' LIMIT 1\", NAME ), mysql_query( MHandle, STRING );
        for( playerid; playerid < MAX_PLAYERS; playerid ++ )
        {
            if( CompareEx( NAME, PlayerName( playerid ) ) )
            {
                if( IsPlayerConnected( playerid ) )
                {
                    SendFormatMessage( playerid, -1, \"[{f3ff4a} SZERVER {ffffff}] Fizetésed átutalva a bankszámládra! ( {f3ff4a}$%s{ffffff} )\", FormatNumber( PAY ) );
                }
            }
        }
    }
    
    return 1;
}

Fizetés MySQL
« Válasz #1 Dátum: 2018. április 05. - 19:25:50 »
0 Show voters

 for( new i; i != rows; i ++ )

 
Az \' i \' változónak nincs kezdőértéke, habár azt hiszem erre a pawno is errort ír. Nyílván ha nincs kezdőérték akkor nem tudja, melyik sorból kell kiszedni.
 

for( playerid; playerid < MAX_PLAYERS; playerid ++ )
        {
            if( CompareEx( NAME, PlayerName( playerid ) ) )
            {
                if( IsPlayerConnected( playerid ) )
                {
                    SendFormatMessage( playerid, -1, \"[{f3ff4a} SZERVER {ffffff}] Fizetésed átutalva a bankszámládra! ( {f3ff4a}$%s{ffffff} )\", FormatNumber( PAY ) );
                }
            }
        }

 
Ezzel meg annyi a probléma, hogy a MAX_PLAYERS értékig fut le, ami alapesetben 1000, viszont ha átírtad, 30-50-80 stb. akkor is egészen nagy. Illetve le sem állítod, tehát ha pl. a 0-ás IDjű játékosnál teljesül a feltétel, akkor a többi (n-1)-szor lefutás fölösleges. Próbáld meg úgy, hogy IsPlayerConnected, és hogyha igaz értékkel tér vissza, akkor fentvan azt már tudod kezelni. Kicsit hasonló az eljárás, csak ebben az esetben csak annyiszor fut le a keresési ciklus ahány játékos van a szerveren, vagyis ( GetPlayerPoolSize = legnagyobb ID a szerveren, kis prioritásoknál nagyon hasznos. ), illetve az értékkel return-olok is ami megszakítja a ciklust.
 

GetPlayerIdFromName(playername[])
{
for(new i = 0, j = GetPlayerPoolSize(); i < j; i++)
   if(!strcmp(playername,GetPlayerName(i)) return i;
return -1;
}

 
A fenti kód lefut az összes játékoson akik fentvannak egészen a legmagasabb ID-ig, nyílván 1-2 \"üres tick\" lehet, mivel a játékos ID-je lehet magasabb is mint a playerszám, viszont a playerszám nem lehet nagyobb az ID-nél :D ( vagyis n-1 mivel 20 játékosnál 19 a legnagyobb ID de ez lényegtelen mert csak összezavarlak vele :D ) És ha megtalálta az ID-t akkor visszatér vele. Ez ugyanúgy müködik mint a te esetedben, viszont ott nem szakítsa meg a ciklust ha teljesel a feltétel, illetve a feltétel túl nagy.
 
A lenti kóddal lekérdezed az ID-t a név alapján. Ha nincs fent akkor az érték -1 lesz, és ha az érték -1 returnol tehát kihagyja.
 

new id = GetPlayerIdFromName(NAME);
if( id == -1) return 1;
SendClientMessage(playerid,-1,\"Megjött a fizud te$$$$$$$$$$$$$$$$$$\");
pInfo[id][pBank] = pInfo[id][pBank] + MONEY;

 
Remélem azért érthető, eléggé rosszul magyarázok, ha van valami kérdésed csak írj!

Nem elérhető Amf

  • 1459
    • Profil megtekintése
Fizetés MySQL
« Válasz #2 Dátum: 2018. április 05. - 19:48:52 »
0 Show voters
for( new i; i < MAX_PLAYERS; i ++ )
 
Miért errorozna rá a pawno? Ha létrehozol egy INTEGER változót akkor az értéke nulla, ha csak nem adsz neki értéket egyből, new i = 0; értelme nincs, mivel alapból 0 az érték..
 
Egyébként, mostmár az a hiba, hogyha például 10 játékosnak nem nulla a fizuja, akkor a legkissebbé fut le 10x, vagy ahánynak nem nulla ..
 
Pedig \' i \' van a beolvasásnál is .. tehát lövésem nincs, a tag listázásnál működik ezzel a megoldással ..

Fizetés MySQL
« Válasz #3 Dátum: 2018. április 05. - 20:11:51 »
0 Show voters
Rég volt, hogy pawnoztam ezek szerint :D A javahoz vagyok szokva ott pedig ilyen alattomos hibák mint pl. az \" int i = 0;\" szokott hiba lenni és órákig keresem :) De ezek szerint pawnoban ez elhanyagolható.
 
Viszont az érdekes hiba, mert logikailag működnie kellene.
 

new STRING[ 128 ]; format( STRING, sizeof( STRING ), \"SELECT * FROM users WHERE PayCheck != \'0\'\" );
    mysql_tquery( MHandle, STRING, \"MakePays\", \"d\", 0 );

 
Ez pontosan hogyan hívódik meg? Timerrel gondolom, de küld el azt is, úgy átláthatóbb.
 
Esetleg próbáld meg az eredményeket kiiratni konzolba, így nyomon tudod követni, hogy hol van a hiba.

Nem elérhető Amf

  • 1459
    • Profil megtekintése
Fizetés MySQL
« Válasz #4 Dátum: 2018. április 06. - 17:24:50 »
0 Show voters
Nos, hogyha a public alatt nincs semmilyen MySQL művelet, tehát mysql_query akkor normálisan fut azokkal az értékekkel amivel kell.
 
Ha van valami MySQL akkor viszont csak az elsővel fut végig. ( Gondolom akkor már törlődik a cache, ami alapján csinálja a dolgát .. )
 
Erre kéne valamit kitalálni, hogy oldjam meg máshogyan? :D

Nem elérhető BoOy

  • 3209
  • 2013-as év szkriptere
    • Profil megtekintése
Fizetés MySQL
« Válasz #5 Dátum: 2018. április 06. - 18:40:02 »
0 Show voters
Konzolba irasd ki sorba a NAME és a PAY értékeit a for cikluson belül, esetleg tehetsz egy SQL próbát is, hogy amit itt megadtál, működik-e adatbázis kezelő felületen. Érdekes egyébként.
« Utoljára szerkesztve: 2018. április 06. - 18:41:06 írta BoOy »

Fizetés MySQL
« Válasz #6 Dátum: 2018. április 06. - 19:14:29 »
0 Show voters
ha törlődik a cache akkor próbáld tquery-vel, mert az ugye úgymond várólistára rakja őket, habár ez pici laggal is járhat.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal