Jump to content

SQLite


Guest PlayON

Recommended Posts

Guest PlayON

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 GM

Adauga 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 ceva

1588tnc.png

Portocaliul 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.3235

Cum 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 AICI

Odata 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:

zvzp6s.png

Dar cu datele tale!

### Daca aveti intrebari lasati aici si va ajut.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Guest farse

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 :D )

E bun tutu' :)

Link to comment
Share on other sites

Guest PlayON

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 :D )

E bun tutu' :)

E sus, am marit fontu, chiorule!!!!!!!!!

Link to comment
Share on other sites

Guest PlayON

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...

Link to comment
Share on other sites

Guest PlayON

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,

Link to comment
Share on other sites

Guest PlayON

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!

Link to comment
Share on other sites

Guest PlayON

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!

Link to comment
Share on other sites

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).

Link to comment
Share on other sites

  • 2 weeks later...
Guest PlayON

Tu ai creat tot tutorialul? Sau l-ai tradus de pe sa-mp.com

Daca da, esti tare , daca nu esti bun traducator  :grin:

5/5.

L-am scris singur!

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Guest PlayON

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 genu

Contu nu exista, sau parola gresita..

Mi se pare ciudat :)

Mai ai nevoie de ajutor ?

Link to comment
Share on other sites

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 genu

Contu 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. xD

Am pus mai sus dialoguriile..

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.