Szerző Téma: MySQL kocsi lementés  (Megtekintve 1125 alkalommal)

MySQL kocsi lementés
« Dátum: 2017. Augusztus 22. - 15:44:31 »
0
Sziasztok! Van egy kocsi lementő szkriptem, és szeretném a segítségeteket kérni. Tökéletesen lementi a dolgokat, de sajna az \"adatadas\" function már nem igazán. Leszögezném, kezdő vagyok MySQL-be. Itt a kód:
 

CMD:vehicle(playerid, params[])
{
    if(Belepve[playerid] == true)
     {
        if(pInfo[playerid][Adminszint] == 4)
        {
            new parameter[40];
            new string52[2048];
            new vehid,vehc1,vehc2,vehmodel;
            new Float: vehx, Float:vehy,Float:vehz,Float:veha;
             vehid = GetPlayerVehicleID(playerid);
            vehmodel= GetVehicleModel(vehid);
            GetVehiclePos(vehid, vehx, vehy,vehz);
            GetVehicleZAngle(vehid,  veha);
            GetVehicleColor(vehid, vehc1, vehc2);
            if(sscanf(params, \"%s[40]\", parameter)) return SendClientMessage(playerid, -1, \"Használat:/vehicle [save/delete/edit]\");
            {
                    if(IsPlayerInAnyVehicle(playerid))
                     {
                        if(isnull(vInfo[vehid][tulaj]))
                        {
                            SendClientMessage(playerid, -1, \"Nem létezett, lementve\");
                            format(string52, sizeof string52, \"INSERT INTO jarmuvek(ID,modelid,vx,vy,vz,va,vcolor1,vcolor2,tulaj) VALUES (\'\', %d, %f, %f, %f, %f, %d, %d, \'Admin\')\",vehmodel, vehx,vehy,vehz,veha,vehc1, vehc2);
                            mysql_tquery(kapcsolat, string52);
                            new string57[2048];
                            format(string57, sizeof string57, \"SELECT * FROM jarmuvek WHERE modelid = \'%d\' AND vx = \'%f\' AND vy = \'%f\' AND vz = \'%f\' AND va = \'%f\' AND vcolor1 = \'%d\' AND vcolor2 = \'%d\' AND tulaj = \'Admin\'\",vehmodel, vehx,vehy,vehz,veha,vehc1, vehc2);
                            mysql_tquery(kapcsolat, string57,\"adatadas\", \"dd\", playerid, vehid);
                        }
                        else
                        {
                            SendClientMessage(playerid, -1, \"Létezett, felülírva\");
                            format(string52, sizeof string52, \"UPDATE jarmuvek SET modelid = \'%d\', vx = \'%f\', vy = \'%f\', vz = \'%f\', va = \'%f\', vcolor1 = \'%d\', vcolor2 = \'%d\' WHERE ID = \'%d\'\",vInfo[vehid][modelid], vInfo[vehid][vx],vInfo[vehid][vy],vInfo[vehid][vz],vInfo[vehid][va],vInfo[vehid][vcolor1],vInfo[vehid][vcolor2]);
                            mysql_tquery(kapcsolat, string52);
                        }
                    }
                    else SendClientMessage(playerid, COLOR_ORANGE, \"Hiba: Járműben kell ülnöd a parancs használatához.\");
         }
        else SendClientMessage(playerid, COLOR_ORANGE, \"Hiba: Ezt a parancsot te nem használhatod!\");
    }
    else NoLogin(playerid);
    return 1;
}


forward adatadas(playerid,vehicle);
public adatadas(playerid,vehicle)
{
    if(cache_get_row_count() == 1)
    {
        vInfo[vehicle][DBID] = cache_get_field_content_int(0, \"ID\");
          vInfo[vehicle][modelid] = cache_get_field_content_int(0, \"modelid\");
          vInfo[vehicle][vx] = cache_get_field_content_float(0, \"vx\");
          vInfo[vehicle][vy] = cache_get_field_content_float(0, \"vy\");
          vInfo[vehicle][vz] = cache_get_field_content_float(0, \"vz\");
         vInfo[vehicle][va] = cache_get_field_content_float(0, \"va\");
          vInfo[vehicle][vcolor1] = cache_get_field_content_int(0, \"vcolor1\");
          vInfo[vehicle][vcolor2] = cache_get_field_content_int(0, \"vcolor2\");
        cache_get_field_content(0, \"tulaj\",vInfo[vehicle][tulaj]);
        
        new carstat[2048];
        format(carstat, sizeof carstat, \"DBID: %d, ModelID: %d\\nPzX: %f, PzY: %f, PzZ: %f, PzA: %f\\nSzín1: %d, Szín2: %d, Tulaj: %s\",vInfo[vehicle][DBID],vInfo[vehicle][modelid],vInfo[vehicle][vx],vInfo[vehicle][vy],vInfo[vehicle][vz],vInfo[vehicle][va],vInfo[vehicle][vcolor1],vInfo[vehicle][vcolor2],vInfo[vehicle][tulaj]);
        SendClientMessage(playerid, -1, carstat);
    }
    return 1;
}

 
IG pedig ezt kapom:
 
\"sa-mp-136.png\"
 
Előre köszönöm a segítségeket. :)
« Utoljára szerkesztve: 2017. Augusztus 22. - 15:45:04 írta zsolti125 »

MySQL kocsi lementés
« Válasz #1 Dátum: 2017. Augusztus 22. - 19:22:46 »
0
Adatbázisba be inserteli egyáltalán? mert az Insertnél az ID-nek \' \' érték van megadva ami miatt hibát kéne kiirnia, és hogyha az nem megy akkor a select sem mehet.
 
Illetve elég rossz megoldás a SELECT-nél a pozicióra meg ilyenekre hivatkozni. Ezért kell ID-t használni járműveknél mivel az biztos, hogy csak 1 -van és rövidebb és müködőképesebb a kódod.
 
SELECT * FROM kocsik WHERE ID = 1 pl.
 
 
« Utoljára szerkesztve: 2017. Augusztus 22. - 19:24:12 írta Naretev »

MySQL kocsi lementés
« Válasz #2 Dátum: 2017. Augusztus 22. - 20:29:58 »
0
Szerintem akkor rosszul írtam le,avagy félre nézted. Ha insertelek akkor az ID auto increment re van allitva igy nem kell neki érték, és igen leírtam hogy lementi csak az adat adás függvény nem megy. És hogy használjam az ID-T selectnél ha az enumot nem tudom feltölteni?  Azért lenne értelme az adat adasnak amivel majd a későbbiekben dolgoznék... //Telo

MySQL kocsi lementés
« Válasz #3 Dátum: 2017. Augusztus 22. - 21:09:00 »
0

 format(string52, sizeof string52, \"INSERT INTO jarmuvek(ID,modelid,vx,vy,vz,va,vcolor1,vcolor2,tulaj) VALUES (\'\', %d, %f, %f, %f, %f, %d, %d, \'Admin\')\",vehmodel, vehx,vehy,vehz,veha,vehc1, vehc2);

 
Itt mintha egy olyan lenne hogy ID, aminek a VALUES-ben az értéke \'\'. Ha AUTO Incrementre van állítva, akkor nem kell ide beírni az ID-t. De nem ez a fő gond szerintem.
 
Ha állításod szerint ez müködik, akkor a SELECT-el van a gond.
 
Erre az esetre amikor az ID-t az INSERT-ből akarod meghatározni van egy speciális eljárás.
 
Lérehozol egy Cache- változót, amibe eltárolja a query eredményét. VISZONT ehhez sima query-t kell használni mivel threadednél máshogy megy.
 

new Cache:eredemeny = mysql_query(SQL,query);

 
Illetve fontos, hogy nem kell megadni callback paramétert, hanem csak a (kapcsolat,formázott_query);
 
hogyha ez megvan, akkor a cache aktiv állapotban van, így kitudod belőle szedni, az insert értéket.
 

new id = cache_insert_id();
vInfo[id][DBID] = id;
cache_delete(Cache:eredmeny);

 
Ezzel a funkcióval letudod kérdezni, a sima querynél lefutó INSERT-ből szármozó AUTO INCREMENT értéket, ami kell neked. Ezt beletölted a változóba, majd utána FONTOS, hogy töröld a cache-t mivel akkor elfog tolódni cache szám, amiből lehetnek később gondok;
 
Ha ez megvan akkor már tudsz, SELECT query-t küldeni ahol ID-re hivatkozol.
 
Nemvagyok benne biztos, de talán a cache-n belül is tudsz lekérdezni adatokat, próbáld meg azt előszőr, hogy ezalá a sor alá ->
 

new id = cache_insert_id();

 
beraksz még valami betöltést.
 

cache_get_value_name_int(0,\"Model\",vInfo[id][vModel]);

 
vagy hasonló képpen. DE ez nembiztos, hogy müködik nem próbáltam 50-50 az esélye, ha nem megy akkor próbáld meg SELECT-elni.
 
 
 
A MÁSIK FONTOS DOLOG AMIT ÉSZREVETTEM!
 
ilyeneket ne csinálj te fiú, mert elfogy a ramod. string52[2048],string57[2048], ezek egyenként nagyjából 4-5 KB-t esznek a ramból, ami 100-200 ilyennél már majdnem 1 MB, ami sok.
 
Csinálj egy query változót, egy globálisat.
 
new query[2048];
 
És ezt formázgatod, ha kell valahol, fölösleges több ilyet létrehozni. Mivel formázod, ezért úgyis \"resetelődik\" magától, úgyhogy nó para.
 
Ez így müködik én mint a józsef városi piacon szerzett okleveles scriptertudásom által képzett programozólógus, garantálom hogy jó lesz.
 
 
 
ha kell még help írj, de én ilyen hosszú posztokat írok szóval ne legyél lusta elolvasni, mert különben nem lesz jó
 
pacsi

MySQL kocsi lementés
« Válasz #4 Dátum: 2017. Augusztus 22. - 21:14:52 »
0
Köszi a gyors választ, megfogom próbálni, de azért hozok külön létre változót minden egyes querynek mert van olyan ami pl másodpercenként fut le,ezért megszoktam. De a hosszra odafogok figyelni :D Jelentkezek ha történt valami forradalmi változás... Kösz mégegyszer. 

MySQL kocsi lementés
« Válasz #5 Dátum: 2017. Augusztus 22. - 22:15:29 »
+1
1. Fölösleges másodpercenként lefutó query-t csinálni.
 
2. Akkor sincs semmi mivel threaded query-ben sorba rendezi és úgy fut le, nem kell annak se külön query string.

MySQL kocsi lementés
« Válasz #6 Dátum: 2017. Augusztus 23. - 14:18:28 »
0
Megvan köszi, de elég volt csak a  vInfo[vehicle][DBID] = cache_insert-id(); Nem kelett kölün létrehozni. :) Tényleg köszi a segítséget.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal