-
Sziasztok !
Csinálgatok a napokban egy MySQL rendszert, ahol azonban a lekérdezésnél a cache elcsúszik, és rájöttem, hogy miért.
Például, van egy lekérdezésed :
GetItemAmount(playerid,itemname[])
{
format(query,sizeof(query),\"SELECT ItemAmount FROM items WHERE ItemName = \'%s\'\",itemname);
mysql_query(SQL,query);
new darab = cache_get_field_content_int(0,\"ItemAmount\");
return darab;
}
Azonban amikor le-query-zem, akkor a cache szám növekedik eggyel, és ( például ezt a betöltésnél használom ) akkor egyel fentebb lévő cache-s adatokat kezdi el betölteni és így teljesen összekavarodik a rendszer.
Nézegettem erre megoldásokat, és láttam, hogy a régebbi verzióknál, ezt úgy oldották meg, hogy :
GetItemAmount(playerid,itemname[])
{
format(query,sizeof(query),\"SELECT ItemAmount FROM items WHERE ItemName = \'%s\'\",itemname);
mysql_query(SQL,query);
new darab = mysql_store_result();
mysql_free_result();
return darab;
}
Vagy valahogy, így. Nos ugyebár manapság r39-5 verzióknál ez a 2 utasítás már nem létezik, és nemtudom, hogy lehetne megoldani :(
Ötletek?
-
hát így egyben lehet meglehetne oldalni de ezt az sajnos nem tudom :shurg:
viszont tquery-vel ha használod szerintem nem fog szét esni és egy tipp hogy amikor lekéred a tárgy számát hogy mennyi van belőle akkor azt is kérd le hogy kinek a miéből mennyi van tehát ragd oda a játékos nevét is
-
Igen, azt tudom én is, hogy Tquery-vel meglehet oldani, de akkor megkell adni neki egy callbacket, és ezek is csak összezavarnak, hiszen ahhoz, hogy lekérjek valamit, 3 dolgon fut végig, egyszer a lekérdezésen, utána a lekérdezésen belül a query-n, majd a callbackbe, ahol az értéket adja vissza, + akkor tele lennék ilyenekkel :
public GetItemAmountCallback // Etc.
-
Elvileg így is működik.
GetItemAmount(playerid,itemname[])
{
format(query,sizeof(query),\"SELECT ItemAmount FROM items WHERE ItemName = \'%s\'\",itemname);
new Cache:result = mysql_query(SQL,query);
new darab = cache_num_rows();
cache_delete(result);
return darab;
}
-
cache_num_rows();
ez nem az hogy hány darabot talál a SELECT-re ?
-
De az a sorok számát jelöli :D
Kellene az az utasítás amivel az eredményt kéred be :(
-
stock GetItemAmount(itemname[])
{
new query[128];
format(query,sizeof(query),\"SELECT ItemAmount FROM itemss WHERE ItemName = \'%s\'\",itemname);
new Cache:result = mysql_query(SQL,query);
new darab = cache_get_field_content_int(0,\"ItemAmount\");
cache_delete(result);
return darab;
}
így viszont okés! 1ST_Chrnek jár a plusz!
-
Kirpróbálom ha jó, akkor jár a keksz.
Dupla hozzászólás automatikusan összefûzve. ( 2016. június 24. - 19:39:20 )
Nos az a helyzet, hogy mostmár csak egy hibába ütközök ami az alap probléma :D
Van ez a kód, ami az itemlista táblából kiolvassa a TargyObjekt mező értékét, majd visszaadja :
TargyObjekt(nev[])
{
format(query,sizeof(query),\"SELECT * FROM targylista WHERE TargyNev = \'%s\'\",nev);
new Cache:eredmeny = mysql_query(SQL,query);
new objekt = cache_get_field_content_int(0,\"TargyObjekt\");
cache_delete(eredmeny);
return objekt;
}
Aztán van egy betöltés kódóm :
public EldobottTargyakBetoltese()
{
new sorok = cache_get_row_count();
if(sorok)
{
new id,targynev[64],darab,Float:pos[3],vilag[2];
for(new i = 0; i < sorok; i++)
{
cache_get_field_content(i,\"TargyNev\",targynev,SQL,64);
id = cache_get_field_content_int(i,\"TargyID\");
darab = cache_get_field_content_int(i,\"TargyDarab\");
pos[0] = cache_get_field_content_float(i,\"X\");
pos[1] = cache_get_field_content_float(i,\"Y\");
pos[2] = cache_get_field_content_float(i,\"Z\");
vilag[0] = cache_get_field_content_int(i,\"VW\");
vilag[1] = cache_get_field_content_int(i,\"Inti\");
EldobottTargyObjekt[id] = CreateDynamicObject(TargyObjekt(targynev),pos[0],pos[1],pos[2],0,0,0,vilag[0],vilag[1]);
new string[128];
format(string,sizeof(string),\"\"SZ_SZURKE\"[ Eldobott tárgy ]\\nTárgy : %s\\nDarab : %d\",targynev,darab);
EldobottTargyLabel[id] = CreateDynamic3DTextLabel(string,-1,pos[0],pos[1],pos[2],20,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,vilag[0],vilag[1]);
}
printf(\"[ - ] %d darab eldobott tárgy betöltve ! [ - ]\",sorok);
}
}
Ebbe a kódba van ez a sor :
EldobottTargyObjekt[id] = CreateDynamicObject(TargyObjekt(targynev),pos[0],pos[1],pos[2],0,0,0,vilag[0],vilag[1]);
Amikor ez a kód lefut, lekérdezi, az objektet EZT be is tölti, de utána törli a cache-t és utána kapom ezt a képet, a logban is látszik, majd : cache is not valid.
Ha viszont nincs ott a cache_delete akkor pedig full rossz :D

Ötletek?
-
2 ötletem van.
Numero 1: az ObjectkID-ket betöltetni és TargyID szerint lepakolgatni
Numero 2: tömbösíteni és miután lefutott a EldobottTargyakBetoltese utána tenném bele a lerakásukat és akkor nem lehet akkora probléma
Szerintem az 1. az jobb ötlet. A probléma az hogy nagyon cache-lni nem szoktam én betöltöm magamnak éppen ami kell és kéész
Vaaagy
Tábla összekapcsolás
SELECT targylista.TargyObjekt,eldobottargyak.* FROM targylista,eldobottargyak
és akkor
objectid = cache_get_field_content_int(i,\"TargyObjekt\");
Csak akkor arra figyelj hogy ne nagyon legyen OszlopNév ütközés [Pontosan nem tudom hogy a samp mennyire szereti a tábla összekapcsolást de a mysql szerver szerint határozottan működhet a dolog
Itt egy kép
http://kepfeltoltes.hu/160625/SQL_www.kepfeltoltes.hu_.png[/img]
Viszont egy kérdés?
Minek ennyire túl bonyolítani? x\"D
EDIT a lekérdéshez rakd oda a TargyNevet is tehát
SELECT targylista.TargyObjekt,targylista.TargyNev,eldobottargyak.* FROM targylista,eldobottargyak
EDIT EDIT:
Hidd el rám is vár még egy ilyen epizód pont az inventory rendszerrel ugyanis én nem vagyok hajlandó egy oszlopban tárolni a Tárgynak a tulajdonságait a Inventory résszel :D és hááát :D Kellene mind a kettő :D De most érzem azt hogy volt haszna az ez évi tanulmányaimnak :D
-
Előszőr is nagyon szépen köszönöm ezt a terjedelmes választ azonban google fordító barátom segitségével elolvastam a wikit, majd megállapítottam, hogy a cache-t lehet menteni :D
Ami alapján a ciklusban elmentettem a cache-t, majd mikor az újrafut a ciklus akkor aktiválom.
Nem kell ide összefűzés, csak 4 sor :D
public EldobottTargyakBetoltese()
{
new sorok = cache_get_row_count();
if(sorok)
{
new Cache:betoltes;
new id,targynev[64],darab,Float:pos[3],vilag[2];
for(new i = 0; i < sorok; i++)
{
betoltes = cache_save();
cache_get_field_content(i,\"TargyNev\",targynev,SQL,64);
id = cache_get_field_content_int(i,\"TargyID\");
darab = cache_get_field_content_int(i,\"TargyDarab\");
pos[0] = cache_get_field_content_float(i,\"X\");
pos[1] = cache_get_field_content_float(i,\"Y\");
pos[2] = cache_get_field_content_float(i,\"Z\");
vilag[0] = cache_get_field_content_int(i,\"VW\");
vilag[1] = cache_get_field_content_int(i,\"Inti\");
EldobottTargyObjekt[id] = CreateDynamicObject(TargyObjekt(targynev),pos[0],pos[1],pos[2],0,0,0,vilag[0],vilag[1]);
new string[128];
format(string,sizeof(string),\"\"SZ_SZURKE\"[ Eldobott tárgy ]\\nTárgy : %s\\nDarab : %d\",targynev,darab);
EldobottTargyLabel[id] = CreateDynamic3DTextLabel(string,-1,pos[0],pos[1],pos[2],20,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,0,vilag[0],vilag[1]);
cache_set_active(betoltes);
}
cache_delete(betoltes);
printf(\"[ - ] %d darab eldobott tárgy betöltve ! [ - ]\",sorok);
}
}
new Cache:betoltes;
betoltes = cache_save();
cache_set_active(betoltes);
cache_delete(betoltes);
Nagyon szépen köszönöm mindenkinek aki segített, nemsokára érkezik az Inventory rendszerem :D