FlorinSzasz Posted December 5, 2023 Share Posted December 5, 2023 Salut tuturor! M-am decis de ceva vreme sa realizez un tutorial legat de mysql mai exact ,,sqlite,, din motivul ca am tot primit intrebari legate de topicul asta. Asa ca voi incerca in mare sa acopar cam ce trebuie sa avem in vedere. Am sa ofer exemple concrete astfel incat sa fie totul clar si limpede si pe intelesul tuturor! --Avem functiile: dbConnect() dbExec() dbQuery() dbFree() dbPoll() 1). dbConnect() --1.Folosim dbConnect() - pentru a crea sau a ne conecta la o baza de date existenta. --Exemplu dbConnect("sqlite","data.db") -- primul parametru sqlite indica tipul bazei de date --iar al doilea indica numele care poate fi orice doriti cat timp este cu extensia / terminatia ".db" 2. dbExec() se foloseste a) cand cream un tabel in baza de date! b) cand facem update la datele care sunt deja prezente in baza de date! c) cand inseram ceva in baza de date! Exemple: --- !!! se are in vedere in primul camp al functiei dbExec avem mereu variabila ce are legatura cu conexiunea la baza de date adica variabila connection! dbExec(connection,"CREATE TABLE IF NOT EXISTS PlayerData (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,name TEXT,hp INTEGER,money INTEGER,armour INTEGER,skin INTEGER,location TEXT)") -->a) cream tabelul PlayerData daca acesta nu exista deja, asta indica expresia pana la inceperea parantezei! -->b) primul camp este id numar intreg si nenul adica trebuie sa aiba o valoare, mai mult decat atat este cheie primara ceea -- ce inseama ca acest numar sau valoare nu poate fi dublata este unica, -- autoincrement inseamna ca valoarea acestui camp creste cu fiecare inserare -->c) campul nume este de tip Text deoarece numele contului pe care jucatorul joaca este un string -->d) hp este de tip numar intreg deoarece reprezinta viata jucatorului -->e) armour este de tip numar intreg deoarece reprezinta armura jucatorului -->f) skin este de tip numar intreg deoarece reprezinta modelul jucatorului -->g) money este de tip numar intreg deoarece reprezinta valoarea banilor pe care jucatorul ai detine -->h) location este de tip text deoarece vom folosi functia toJSON pentru pune toate valorile intr-un string. --Fara a mai crea 3 campuri in tabelul PlayerData -- >> dupa denumirea campului in expresia prin care creeam tabelul trecem si tipul acestuia de exemplu name este un camp text --pentru ca numele jucatorului este un text si nu un numar intreg --------------------------------------------------------------------------------------------- dbExec(connection,"INSERT INTO PlayerData (name,hp,money,armour,skin,location) VALUES (?,?,?,?,?,?)",name,hp,money,armour,skin,location) -- inseram in tabelul PlayerData -- in functie de campurile in care inseram le trecem intre paranteze -- daca vreau sa inserez doar in campul name trec doar name intre paranteze si la VALUES (?) un singur semn de intrebare in paranteze -- cate campuri avem intre paranteze atatea semne de intrebare punem la VALUES intre paranteze -- dupa adaugam valorile aferente campurilor pe care le avem in paranteze -- numarul valorilor trebuie sa fie egale cu cel al campurilor si al semnelor de intrebare din paranteze. --------------------------------- dbExec(connection,"UPDATE PlayerData set hp=?,money=?,armour=?,skin=?,location=? WHERE name=?",hp,money,armour,skin,location,name) -- aici facem update la tabelul PlayerData -- in functie de numarul campurilor la care facem update atatea valori adaugam dupa expresia ce este intre ghilimele -- la aceste valori se adauga ultima valoarea/variabila ce cuprinde numele contului de pe care jucatorul se joaca pe server -- daca doar la hp vrem sa facem update avem -> dbExec(connection,"UPDATE PlayerData set hp=? WHERE name=?",hp,name) 3.) dbQuery() --> Folosim functia -> cand interogam baza de date pentru anumite informatii care sunt / sau pot fi prezente in aceasta! --> selectam date din baza de date dbQuery(connection,"SELECT * FROM PlayerData") -- selectam tot din tabela PlayerData, la primul argument avem --> ca si la dbExec() variabila aferenta conexiunii dbQuery(connection,"SELECT * FROM PlayerData WHERE name=?",name) -- selectam tot din tabel unde avem numele jucatorului selectat. dbQuery(connection,"SELECT hp FROM PlayerData WHERE name=?",name) -- selectam doar datele legate de hp unde avem numele jucatorului selectat. 4. dbFree() - il folosim doar pentru a elibera baza de date de interogarea care nu ofera un rezultat sau care ofera un rezultat dar nu este colectat sau folosit! 5. Folosim dbPoll() - pentru a verifica daca baza de date a pregatit / returnat un rezultat in urma unei interogari! dbPoll(query,-1) -- aceasta functie va returna un tabel cu rezultatele cerute de la baza de date daca datele cautate sunt in baza de date. --query reprezinta interogarea la care face referire. 6.Exemplu Practic in script: local connection = dbConnect("sqlite","data.db") -- cream / ne conectam la baza de date if connection then -- verificam daca conectarea reuseste outputDebugString("[DB] avem conexiune la baza de date [data]") -- acest mesaj apare in consola serverului daca conectarea are loc else outputDebugString("[DB] nu avem conexiune la baza de date [data]") -- acest mesaj apare in consola serverului daca conectarea nu are loc end function createTable() -- cream tabelul bazei de date dbExec(connection,"CREATE TABLE IF NOT EXISTS PlayerData (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,name TEXT,hp INTEGER,money INTEGER,armour INTEGER,skin INTEGER,location TEXT)") end addEventHandler("onResourceStart",getRootElement(),createTable) function loginData(_,contPrezent) -- contPrezent este contul cu care jucatorul se conecteaza local NumeCont = getAccountName(contPrezent) -- obtinem numele contului pe care jucatorul il foloseste acesta poate sa fie asemanator cu numele din joc al jucatorului sa nu if NumeCont then -- daca avem numele contului mergem mai departe local query = dbQuery(connection,"SELECT * FROM PlayerData WHERE name=? LIMIT 1",NumeCont) -- interogam baza de date cu numele primit -- limit 1 limiteaza numarul de rezultate la 1 daca avem mai multe! local rezultat = dbPoll(query,-1) -- colectam rezultatul din tabelul PlayerData if #rezultat > 0 then -- daca avem rezultat continuam for k,v in ipairs(rezultat) do -- trecem prin sir si setam jucatorului datele salvate setElementHealth(source,v.hp) setPedArmor(source,v.armour) setPlayerMoney(source,v.money) setElementModel(source,v.skin) local location = fromJSON(v.location) -- folosim fromJSON() pentru ca datele au fost salvate sub forma de de string si vrem sa le aducem sub forma de sir setElementPosition(source,location[1],location[2],location[3]) end elseif #rezultat == 0 then -- daca rezultatul este zero inseram jucatorul in baza de date pe baza numelui de cont al acestuia dbExec(connection,"INSERT INTO PlayerData (name) VALUES (?)",NumeCont) end end end addEventHandler("onPlayerLogin",getRootElement(),loginData) function leaveData() local location = {} -- sirul gol in care punem locatia jucatorului local Nume = getAccountName(getPlayerAccount(source)) -- cautam numele de cont al jucatorului care iese de pe server local hp = getElementHealth(source) -- aflam Hp-ul acestuia local money = getPlayerMoney(source) -- aflam banii location[1],location[2],location[3] = getElementPosition(source) -- aflam locatia si o punem intr-un sir local skin = getElementModel(source) -- aflam modelul skin-ului folosit local armour = getPedArmor(source) -- aflam armura jucatorului -- facem update la baza de date si mai exact la ce am aflat adica hp, banii, skin,armura, si locatie, dupa care avem Nume deoarece specificam bazei de date la ce jucator sa faca update dbExec(connection,"UPDATE PlayerData SET hp=?,money=?,armour=?,skin=?,location=? WHERE name=?",hp,money,armour,skin,toJSON(location),Nume) -- am folosit toJSON() pentru a stoca sirul cu coordonatele jucatorului ca si string pentru ca acesta sa fie salvat in campul location din baza de date sub forma de text end addEventHandler("onPlayerQuit",getRootElement(),leaveData) Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now