Guest PlayON Posted May 8, 2011 Posted May 8, 2011 Tutorial SQLite.Introducere:- Multi dintre voi credeti ca SQLite este foarte foarte greu de inteles, ei bine nu este asa, este chiar simplu! Am decis sa fac acest tutorial deoarece ma plictisesc si poate romanu' isi va da seama ce este mai rapid si in care system sa ai incredere.In SQLite poti sa ai incredere 99.9% deoarece, aplicat cum trebuie, nu vei avea scurgeri de memorie sau lipsa de data.Ce este SQLite?:- SQLite este un fel de MySQL dar cu baza de date interna. Adica un fisier cu extensia .db. SQLite este bazat pe tabele si coloane, este foarte usor de folosit si are multe functii folositoare prin care poti face ceva mai bun decat cu metodele prin fisiere.Denumirea de la SQL este Structured Query Language. In SQL totul este bazat pe stringuri cu functii cheie care duc la realizarea unei actiuni. AI NEVOIE DE UN MANAGER DE BAZE DE DATE CA SA CITESTI INFORMATIA!DESCARCA SQLITE MANAGER!Clauze de folosit:[@]Clauza CREATE TABLE IF NOT EXISTS creeaza tabelul daca nu exista, se foloseste deobicei in OnFilterScriptInit sau OnGameModeInit, sau unde vrei tu defapt.[@]Clauza FROM specifica din ce tabel sa ia anumita informatie.[@]Clauza WHERE specifica locatia unui element in tabel, de exemplu, noi vrem sa preluam data `kills` unde `nume` este 'Zh3r0'. Se foloseste ca punct de reper.[@]Clauza ORDER BY ordonoeaza o anumita coloana dupa titlu, dupa marine, crescator, decrescator.[@]Clauza SELECT seleteaza `stat`. Se poate folosi in combinatie cu FROM si cu WHERE . Gen, "SELECT * FROM `Tabel` WHERE `Name` = 'Zh3r0' ", ceea ce inseamna ca verifica daca randul unde numele este Zh3r0 exista.[@]Clauza AND se poate folosi pentru intarirea unei verificatii, gen "SELECT * FROM `Tabel` WHERE `Name`= 'Zh3r0' AND `Password` = 'blabla' ", verifica daca in `Nume` este Zh3r0 dar in acelasi timp `Password` sa aiba 'blabla'[@]Clauza UPDATE updateaza un rand din tabel.Daca randul nu exista, nici-o actiune nu v-a fi luata.[@]Clauza INSERT INTO insereaza in tabel un rand nou, chiar daca randul exista, v-a fi duplicat, de aceea trebuie sa te referi la clauza UPDATE cand vrei sa updatezi randul.[@]Clauza DELETE FROM sterge un rand din tabel, se foloseste impreuna cu clauza WHERE pentru a determina care rand v-a fi sters.- Exista mai multe functii, dar eu am listat cele mai imporante si des folosite in SA-MP.Cum sa...Cum cream un fisier de tip .db(database) ?Folosind functia db_open(name[]).Intai creeam o variabila cu tagul DB: deoarece vrem ca variabila sa fie recunoscuta ca asociat al SQL.Scrie in topul scriptului new DB:Database;Dute la callbackul OnFilterScriptInit() daca e FS sau OnGameModeInit() daca e GMAdauga urmatorul cod: Database = db_open("Database.db");Codul de mai sus v-a creea baza de date daca nu exista si o v-a deschide daca exista pentru a putea primi informatii, sau a da informatii.Sub acel cod adauga asta: db_free_result(db_query(Database, "CREATE TABLE IF NOT EXISTS `Tabel` (`Nume`, `Bani`, `Ratio`)"));Codul de mai sus, v-a creea tabelul `Tabel` in fisierul Database.db din scriptfiles daca nu exista.In acelasi timp v-a adauga 3 coloane, cele enumerate in ( ).Succes! Ai creat o baza de date dar in acelasi timp ai adaugat si 3 coloane!Ce inseamna db_query() si db_free_result()?db_query()Cu aceasta functie se poate scrie dar si citi in acelasi timp, depinde de ce ai scris in acel string, si ce functie ai folosit.db_free_result()Trebuie sa te asigur ca de fiecare data, cand citesti, sau scri intr-o baza de date, sa eliberezi rezultatele, altfel s-ar puea sa intampini buguri sau o scurgere de memorie, ceea ce cred ca nu ai vrea sa se intample!Cum scriu intr-o baza de date?Folosind functia db_query().Ca exemplu sa luam OnFilterScriptInit() si sa lucram acolo.Nu trebuie sa deschidem baza de date cu functia db_open() deoarece ea a fost deschisa la initierea fiserului.Hai sa scriem ceva in acele 3 coloane in tabelul numit Tabel.//Cream un string numit Query cu care v-om putea dauga date, gen Numele jucatorului, Scoru, killurile etc.new Query[129];//Formata stringul cu numele si toate cele ca dupaia sa folosim db_query() pentru a le scrie.format(Query, sizeof(Query), "INSERT INTO `Tabel` (`Nume`, `Bani`, `Ratio`) VALUES('%s', '%d', '%f')", ("Zh3r0"), 500, Float:555 / Float:34);//Acum sa scriem in baza de date ce am scris mai sus, bine nu chiar, codu de sus v-a fi transformat intr-o comanda pe care bazele de date le inteleg si le transforma in ceva psihic si le proceseaza si iese un rand nou.db_query(Database, Query);//Daca vrei sa fi sigur ca eliberezi orice ramasita de informatie, fa astfel.db_free_result( db_query(Database, Query) );//In acelasi timp eliberam informatia care nu este necesara si actionam.Puteti deschide acum fisierul Database.db din folderul scriptfiles din folderul cu server, deshideti fisierul cu programul pus la dispozitie mai sus la Introducere.Cand deschideti baza de date ar trebui sa aveti asa cevaPortocaliul acela este de la tema de Windows care o am eu.Cum citesc dintr-o baza de date?Acum hai sa facem o comanda prin consola ca sa evitem intrarea pe server si toate cele.Adauga functia asta undeva in script, daca exista deja, doar ia ce e inauntru si baga acolo.public OnRconCommand(cmd[]){ if(!strcmp(cmd, "/start", .length = strlen("/start") ) { } return 1;}Acum daca scri in consola /start nu se v-a intampla nimic deoarece este GOL!Hai sa-l umplem cu codul pentru citire!if(!strcmp(cmd, "/start", .length = strlen("/start"))){ //Cream un string numit Query in care vom formata codul pentru preluare de informatie. new Query[256]; //Creeam o variabila in care stocam rezultatul primit din db_query(). new DBResult:Rezultat; //Formatam stringul Query cu datele necesare in preluarea informatiei. //In acest format verificam daca in tabelul `Tabel` exista un rand care contine la coloana `Nume` cuvantul Zh3r0. format(Query, sizeof(Query), "SELECT * FROM `Tabel` WHERE `Nume` = 'Zh3r0'"); //Cu acest cod v-om citi ce am cerut mai sus, am scris Rezultat = pentru a stoca informatia primita in db_query pentru a verifica daca ce am scris mai sus este valid. Rezultat = db_query(Database, Query); //Acum, folosim functia db_num_rows pentru a verifica daca am primit o informatie valida sau nu, daca Zh3r0 exista in Tabel in coloana `Nume`. //Intai verificam daca este adevarat, daca intradevar, Zh3r0 exista in Tabel la coloana `Nume`. if(db_num_rows(Rezultat)) { //Dam de stire ca a rezultat corect, v-a printa in consola ce am scris mai jos. print("Rezultatul a fost corect, Zh3r0 exista un Tabel in coloana `Nume`"); //Cream un string in care stocam informatia primita din baza de date. new Field[30]; //Cream variabilele unde vom stoca informatia. new Bani, Float:Ratio; //Acum sa preluam datele din coloana `Bani` si `Ratio` de la `Nume` egal cu Zh3r0. db_get_field_assoc(Rezultat, #Bani, Field, 30); //Strngul Field a primit acum informatia de la `Bani` unde `Nume` = 'Zh3r0' //O stocam intr-o variabila, poate sa fie si variabila facuta de tine, gen pInfo[playerid][bani] Bani = strval(Field);//strval deoarece informatia este un string si trebuie sa devina integer.(EX: 100) //Sa prelam ratia din `Tabel` unde `Nume` = 'Zh3r0' db_get_field_assoc(Rezultat, #Ratio, Field, 30); //floatstr deoarece informatia din Field este un string si trebuie transformata intr-un float (EX: 4.7) Ratio = floatstr(Field); //Acum sa printam informatia primita! printf(#Bani: %d","# Ratio: %.4f, Bani, Ratio);}//Am preluat din `Tabel` unde `Nume` = 'Zh3r0' cu success, acum eliberam informatiile in exces!db_free_result(Rezultat);//In consola acuma ar trebui sa primesti:Bani: 500, Ratio: 16.3235Cum sterg o linie din tabel?Simplu! Folosind clauza DELETE FROM.Exemplu de stergere:db_query(Database, "DELETE FROM `Tabel` WHERE `Nume` = 'Zh3r0'");V-a sterge toata linia unde gaseste la coloana `Nume` un string 'Zh3r0'.Informatii utile!De ce la coloane am folosit ` ` ? Deoarece, cand adaugam o coloana fara ` ` s-ar putea ca sa avem scurgeri de memorie, folosind aceste doua apaostroafe ajuta la acuratete.De ce cand scriam sau citeam ceva am folosit ' ' ? La fel ca mai sus, ca informatia sa fie preciza!De ce am folosit ("Zh3r0") ? Este doar un exemplu, acela poate deveni gen Name(playerid) sau pName, adica o variabila care contine numele jucatorului.Descarca un simplu Login/Register script facut cu SQL.DOWNLOAD AICIOdata descarcat, intri in joc si vei da /register <parola>.Parola trebuie sa fie de min 5 caractere si max 24.Odata creat contu dute in sriptfiles si deschide fisierul numit Conturi.db cu programul mentionat mai sus.Inauntru trebuie sa aiba:Dar cu datele tale!### Daca aveti intrebari lasati aici si va ajut.
IstuntmanI Posted May 8, 2011 Posted May 8, 2011 OMG, cat scris ), nu citesc tot pentru ca oricum nu ma apuc, ar trebui sa se refac conturile, lalala ...Intr-adevar, SQLite este mai bun ca INI, este mai rapid ...Din cat am citit (vreo 50%) este bun, bravo, vad ca tu chiar te chinui, 5/5.
Guest farse Posted May 8, 2011 Posted May 8, 2011 Pune si un link cu SQL Database Management (daca ai pus e bine,m'am uitat de 2 ori peste post si am vazut doar img cu el )E bun tutu' :)
Guest PlayON Posted May 8, 2011 Posted May 8, 2011 Pune si un link cu SQL Database Management (daca ai pus e bine,m'am uitat de 2 ori peste post si am vazut doar img cu el )E bun tutu' E sus, am marit fontu, chiorule!!!!!!!!!
ruben88 Posted May 8, 2011 Posted May 8, 2011 WoW dar ai scris ceva nu gluma,bun tutorial,sigur nu am sa-l pun pe sv )
Guest PlayON Posted May 8, 2011 Posted May 8, 2011 Ruben" post="71244" timestamp="1304854064"]WoW dar ai scris ceva nu gluma,bun tutorial,sigur nu am sa-l pun pe sv )E ceva de asteptat deci...
BlueSkiLLz Posted May 8, 2011 Posted May 8, 2011 E ceva de asteptat deci...Nu inteles ca is ma greu de cap )La ce foloseste?10/10 TUT
Bect Posted May 9, 2011 Posted May 9, 2011 Gg 0 rabdare multa iti trb cu SQL.Carei cel mai bun SQL sau MYSQL ?
Guest PlayON Posted May 9, 2011 Posted May 9, 2011 Gg 0 rabdare multa iti trb cu SQL.Carei cel mai bun SQL sau MYSQL ?MySQL, cum am zis, SQL este folosit intern, MySQL este folosit extern,
Bect Posted May 10, 2011 Posted May 10, 2011 adica ? mqsql folosit extern .. pt forumuri alea alea ?iar sql baza de data pt server ?
Guest PlayON Posted May 10, 2011 Posted May 10, 2011 adica ? mqsql folosit extern .. pt forumuri alea alea ?iar sql baza de data pt server ?SQL Creeaza baza de date in calculatorul TAU! MySQL se foloseste daca vrie sa afisezi datele din joc pe vreun site!
Bect Posted May 10, 2011 Posted May 10, 2011 Aha Daca vreau sa fac... de exemplu ...ban list pe forum(sa treaca acolo automat cand cineva ii banat) trebuie sa fac cu mqsql , corect ?
Guest PlayON Posted May 10, 2011 Posted May 10, 2011 Aha Daca vreau sa fac... de exemplu ...ban list pe forum(sa treaca acolo automat cand cineva ii banat) trebuie sa fac cu mqsql , corect ?nu mgsql MySQL! Da!
LaZ Posted May 10, 2011 Posted May 10, 2011 SQLite se poate folosi si extern, doar ca ii mai complicat. Novocaine LSGW 2.5 era pe SQLite si informatiile erau preluate si de site (zone, echipe, influente si alte informatii legate de conturi).
FANEX Posted May 18, 2011 Posted May 18, 2011 Tu ai creat tot tutorialul? Sau l-ai tradus de pe sa-mp.comDaca da, esti tare , daca nu esti bun traducator :grin:5/5.
TheGuardianAngel Posted May 19, 2011 Posted May 19, 2011 Bun tutorialul , vad ca te-ai straduit ceva cu scrisul ) :P
Guest PlayON Posted May 19, 2011 Posted May 19, 2011 Tu ai creat tot tutorialul? Sau l-ai tradus de pe sa-mp.comDaca da, esti tare , daca nu esti bun traducator :grin:5/5.L-am scris singur!
DrakusorU Posted May 21, 2011 Posted May 21, 2011 Foarte bun tutorialul.Am incercat sa fac Login-ul si Register-ul inputtext, dar am o problema la register.Acesta este dialog-ul pentru register.[pawn]if(dialogid == Dialog_Register){ if(response) { if(strlen(inputtext)) { new Query[256], DBResult:Result; format(Query, sizeof(Query), "SELECT * FROM `Users` WHERE `Name` = '%s'", Name(playerid)); Result = db_query(Database, Query); if(!db_num_rows(Result)) { if(strlen(inputtext) >= 5 && strlen(inputtext) <= 24) { FormatQuery( Query, "INSERT INTO `Users` (`Name`, `Password`, `Level`, `Money`, `SpawnLocation`, `AccountInfo`, `Sex`, `Age`) VALUES('%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d')", Name(playerid), pData[playerid][Password], GetPlayerScore(playerid), GetPlayerMoney(playerid), pData[playerid][spawnLocation], pData[playerid][AccountInfo], pData[playerid][sex], pData[playerid][Age]); db_free_result( db_query(Database, Query) ); new loginname[64]; GetPlayerName(playerid, loginname, sizeof(loginname)); format(Query, sizeof(Query), "{FFFFFF}You have registered successfully, {F2B90E}%s{FFFFFF}. Your password is : {F2B90E}%s {FFFFFF}.\n\n\nNow, to login type the password here.", loginname, pData[playerid][Password]); ShowPlayerDialog(playerid, Dialog_Login, DIALOG_STYLE_INPUT, "Login", Query, "Login", "Exit"); } else { new registerstring[128]; format(registerstring, sizeof(registerstring), "{FFFFFF}Your password must to be between 5 and 24 characters.\n\n\n\n"); ShowPlayerDialog(playerid, Dialog_Register, DIALOG_STYLE_INPUT, "Register", registerstring, "Register", "Exit"); } } } } else { Kick(playerid); }}[/pawn]Si aceasta este cel pentru login.[pawn]if(dialogid == Dialog_Login){ if(response) { if(strlen(inputtext)) { new Query[256], DBResult:Result ; FormatQuery(Query, "SELECT * FROM `Users` WHERE `Name` = '%s'", Name(playerid)); Result = db_query(Database,Query); if(db_num_rows(Result)) { FormatQuery(Query, "SELECT * FROM `Users` WHERE `Name` = '%s' AND `Password` = '%s'", Name(playerid), pData[playerid][Password]); Result = db_query(Database,Query); if(db_num_rows(Result)) { new Field[30] ; db_get_field_assoc(Result, "Level", Field, 30 ); pData[playerid][Level] = strval(Field); db_get_field_assoc(Result, "Money", Field, 30 ); pData[playerid][Money] = strval(Field); SetPlayerScore(playerid, pData[playerid][Level]); ResetPlayerMoney(playerid); GivePlayerMoney(playerid, pData[playerid][Money]); pData[playerid][Logged] = true; } else { new loginstring[128]; format(loginstring, sizeof(loginstring), "The password entered is wrong, please try again, but now typing the correctly password.\n\n\n\n"); ShowPlayerDialog(playerid, Dialog_Login, DIALOG_STYLE_INPUT, "Login", loginstring, "Login", "Exit"); db_free_result(Result); } } else { new registerstring[128]; format(registerstring, sizeof(registerstring), "{FFFFFF}You don't have a account, please type the password you want and press 'Register' .\n\n\n\n"); ShowPlayerDialog(playerid, Dialog_Register, DIALOG_STYLE_INPUT, "Register", registerstring, "Register", "Exit"); } db_free_result(Result); } } else { Kick(playerid); }}[/pawn]Dupa ce ma inregistrez nu imi afiseaza dialog-ul pentru Login si nu inteleg unde am gresit.. Zh3r0, daca ai putea sa-mi dai pm cu un id de contact sa ma ajuti putin, daca vrei.
LaZ Posted May 21, 2011 Posted May 21, 2011 De ce trimiti doua query-uri cand poti sa trimiti doar unul, la login. SELECT * FROM `Users` WHERE `Name` = 'Nume' AND `Password` = 'parola';
DrakusorU Posted May 21, 2011 Posted May 21, 2011 M-am luat dupa comanda din scriptu' facut de Zh3r0 si asa era si acolo :-?? :-s..Nu inteleg cum sa fac + ca dupa ce ma inregistrez nu-mi afiseaza dialog-ul pentru login :-s
Guest PlayON Posted May 21, 2011 Posted May 21, 2011 Eu stiam ca merge cu doar un query, dar vroiam sa-i zic jucatorului ca nu are cont si daca are cont, sai zica ca parola este incorecta.Daca faceam cu un query, trebuia sa fac ceva de genuContu nu exista, sau parola gresita..Mi se pare ciudat Mai ai nevoie de ajutor ?
DrakusorU Posted May 21, 2011 Posted May 21, 2011 Eu stiam ca merge cu doar un query, dar vroiam sa-i zic jucatorului ca nu are cont si daca are cont, sai zica ca parola este incorecta.Daca faceam cu un query, trebuia sa fac ceva de genuContu nu exista, sau parola gresita..Mi se pare ciudat Mai ai nevoie de ajutor ?Pai, faza e ca la register dupa ce bag parola nu-mi apare dialog-ul pentru login . D'asta iti cerusem id-ul de mess, sa te uiti putin la script si sa-mi zici si mie un am gresit.. + ca mai am niste probleme legate de SQLite si eu unu cred ca e mai usor sa le discutam pe mess. xDAm pus mai sus dialoguriile..
Recommended Posts