Szerző Téma: MySQL lekérdezés  (Megtekintve 1595 alkalommal)

Nem elérhető 1Mark6

  • 437
    • Profil megtekintése
MySQL lekérdezés
« Dátum: 2016. június 23. - 18:49:06 »
0 Show voters
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?

MySQL lekérdezés
« Válasz #1 Dátum: 2016. június 23. - 20:31:38 »
0 Show voters
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

Nem elérhető 1Mark6

  • 437
    • Profil megtekintése
MySQL lekérdezés
« Válasz #2 Dátum: 2016. június 23. - 20:53:36 »
0 Show voters
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.

MySQL lekérdezés
« Válasz #3 Dátum: 2016. június 23. - 22:05:28 »
+2 Show voters
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;
    }

MySQL lekérdezés
« Válasz #4 Dátum: 2016. június 23. - 22:28:23 »
0 Show voters
cache_num_rows();

 
ez nem az hogy hány darabot talál a SELECT-re ?

Nem elérhető 1Mark6

  • 437
    • Profil megtekintése
MySQL lekérdezés
« Válasz #5 Dátum: 2016. június 23. - 22:30:46 »
0 Show voters
De az a sorok számát jelöli :D
Kellene az az utasítás amivel az eredményt kéred be :(

MySQL lekérdezés
« Válasz #6 Dátum: 2016. június 23. - 22:51:05 »
+1 Show voters

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!

Nem elérhető 1Mark6

  • 437
    • Profil megtekintése
MySQL lekérdezés
« Válasz #7 Dátum: 2016. június 23. - 23:17:50 »
0 Show voters
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
\"HELP.png\"
Ötletek?
« Utoljára szerkesztve: 2016. június 24. - 19:39:20 írta 1Mark6 »

MySQL lekérdezés
« Válasz #8 Dátum: 2016. június 25. - 17:41:32 »
0 Show voters
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
\"width=500http://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
« Utoljára szerkesztve: 2016. június 25. - 17:49:08 írta Kyosuke_Hiroshi »

Nem elérhető 1Mark6

  • 437
    • Profil megtekintése
MySQL lekérdezés
« Válasz #9 Dátum: 2016. június 25. - 19:28:57 »
0 Show voters
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

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal