Peršokti į turinį

MySQL


nazip

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3895 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Pavyzdžiuose bus naudojamas BlueG R7 pluginas.

Turbūt girdėjote, kad R7 yra daug greitesnis, tai žinoma yra tiesa. Greičio palyginimu su kitomis versijomis galite rasti http://forum.sa-mp.com/showpost.php?p=1827054&postcount=6

Kodėl jis toks greitas? O todėl kad dabar kol pluginas ką nors daro su duomenų baze, serveri tuo metu gali užsimti kitais dalykais. Gal to ir nepastebėjote, bet su senesnėmis versijomis jis to negalėjo.

Jeigu iš mano kalbų niekas nepaiškėjo, nesirūpinkite, viskas tuoj paaiškės, nes keliaujame prie praktikos.

Prieš pradėdami, prisijunkime į duomenų bazę:

new DB;
[php]new DB;
public OnGameModeInit()
{
DB=mysql_connect("Duombazės adresas","Vartotojas","Duombaze","slaptazodis");
return 1;
}[/php]

[i][font=tahoma,geneva,sans-serif][size=4]Įsivaizduokime kad duomenų bazėje turime tokia lentele:[/size][/font][/i]

e6ubly.png

[i][font=tahoma,geneva,sans-serif][font=tahoma,geneva,sans-serif][size=4][b]Ši query viršuje įrašys [u]naują[/u] eilutę(tačiau ji dar neišsiusta,apie tai žemiau). Jeigu eilutė jau egzistuoja, reikės siųsti kitokia query.[/b]

Jeigu norime [u]atnaujinti[/u] informaciją reikėtu kurti tokį query:[/size][/font][/font][/i]

[php]new query[128],name[MAX_PLAYER_NAME];
format(query,sizeof(query),"UPDATE `lenteles_pavadinimas` SET Pinigai ='%d' WHERE Username='%s'",GetPlayerMoney(playerid),name);[/php]

[i][font=tahoma,geneva,sans-serif][font=tahoma,geneva,sans-serif][size=4][b]Ši query viršuje atnaujins lentelę(bet ji neišsiųsta todėl nieko nepadarys,apie tai žemiau), ir nustatys pinigus į tiek kiek žaidėjas jų turi, TEN kur Username yra lygus žaidėjo vardui.[/b]

[b]Kaip minėjau nei viena iš tu query(užklausų) neišsiųsta,kaip tą padaryti?[/b][/size][/font][/font][/i]

[php]mysql_function_query(DB,query,false,"SendQuery","");[/php]

[font=tahoma,geneva,sans-serif][i]Dabar, query jau išsiųsta.[/i][/font]

[font=tahoma,geneva,sans-serif]"DB", kas tai? Prisiminkime prisijungima prie duomenų bazės, tai reiškia kad query bus nusiųsta į tą duomenų bazę. (galima dirbti su keliomis duombazėmis)

"False", kodėl? Šis parametras rodo ar naudojame "caching" funckcija. Siųsdami duomenis bazę, jos niekada nenaudojame.

"SendQuery", tai tėra funkcija kuri siunčiant ką nors į duomenų bazę visada bus vienoda ir atrodys taip:[/font]

[php]forward SendQuery();
public SendQuery()
{
return 1;
}[/php]

[i][font=tahoma,geneva,sans-serif][font=tahoma,geneva,sans-serif][size=4][b]Jeigu viską perskaitėte dabar jau turėtumete mokėt įrašinet duomenis.[/b][/size][/font]

[font=tahoma, geneva, sans-serif]Nesmagioji dalis - parsisiuntimas iš duomenų bazės. Čia viskas kiek pasunkėja, bet reikia tik suprasti ir tai jums atrodys lengva.[/font]

[font=tahoma,geneva,sans-serif][size=4][b]Prisiminę lentelės struktūra iš viršaus pradėkime. Dėl aiškumo aš naudosiu playerDB kad turėčiau kur visa gautą informacija sudėt.

Pradėkime nuo query.[/b][/size][/font][/font][/i]

[php]new query[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));

format(query,sizeof(query),"SELECT * FROM `lenteles_pavadinimas` WHERE Useraname='%s'",name);
SELECT *,reiškia kad renkamės VISKĄ. Galima rinktis ir neviską: pvz ("SELECT `Pinigai` FROM...");[/php]

[i][font=tahoma,geneva,sans-serif][b][font=tahoma,geneva,sans-serif][size=4]Query turime, siųskime ją.[/size][/font][/b][/font][/i]

[php]mysql_function_query(DB,query,true,"OnInfoLoad","d",playerid);[/php]

[i][font=tahoma,geneva,sans-serif][font=tahoma,geneva,sans-serif][size=4][b]DB - mūsų duomenų bazė.[/b]

"True", gaunant informaciją mes norime naudoti "caching" funkcija (ji ir suteikia greitį)

"OnInfoLoad", tai nurodo kur vyks visas "veiksmas", tai yra funkcija kurioje mes gautą informaciją panaudosime. Pavadinti galit kaip tik norit. Kad ir "nuciatipogaunukazka".

"d", tai reiskia kad pridėsime papildomą integer tipo parametrą.

"playerid", tai yra tas parametras kuri pridedame.[/size][/font][/font][/i]

[php]forward OnInfoLoad(playerid);
public OnInfoLoad(playerid)
{
new rows,fields;
cache_get_data(rows,fields);
if(rows>0)
{
new tmp[16];
cache_get_row(0,0,tmp,DB); playerDB[playerid][id]=strval(tmp);
cache_get_row(0,1,tmp,DB); format(playerDB[playerid][username],sizeof(tmp),tmp);
cache_get_row(0,2,tmp,DB); format(playerDB[playerid][Password],sizeof(tmp),tmp);
cache_get_row(0,3,tmp,DB); playerDB[playerid][X]=floatstr(tmp);
cache_get_row(0,4,tmp,DB); playerDB[playerid][Y]=floatstr(tmp);
cache_get_row(0,5,tmp,DB); playerDB[playerid][Z]=floatstr(tmp);
cache_get_row(0,6,tmp,DB); playerDB[playerid][XP]=strval(tmp);
cache_get_row(0,7,tmp,DB); playerDB[playerid][Pinigai]=strval(tmp);
}
return 1; //Butinas!!
}[/php]

[font=tahoma,geneva,sans-serif][i][font=tahoma,geneva,sans-serif][size=4][b]Kosmosas? Aiškinamės po truputį:[/b][/size][/font][/i]

[i][font=tahoma,geneva,sans-serif][size=4]"cache_get_data", tai tėra viena iš "caching" funkciju kuri suskaičiuos kiek yra eilučių ir stulpelių. Mums rūpi tik eilutės,tačiau turimi imti abu

"cache_get_row(0,0,tmp,DB); tai reiškia kad norime išgauti informacija iš eilutės 0(pirmas skaičius) ir 0 stulpelio(antras skaičius). Pastaba stulpeliai skaičiuojami nuo nulio. Tie skaičiai vadinami indeksais. (Pavizdinėje lentelėje juos sužymėjau).

"strval(tmp)", kadangi galime išgauti informaciją tik string tipu (kaip ir matote tmp yra stringas) todėl ją paverčiame į skaičių. Tai padaro funkcija strval();

"format...", nors išgauname string formatu, iš patirties turiu pasakyt kad vistiek reikia daryti tai dviem etapais. (priežasties nežinau bet taip yra)

"floatstr(tmp)", kadangime norime koordinačių o jos būna su skaičiumi po kablelio(Float tipo) turime naudoti floatstr(); Galima sakyt tai yra taspats kas strval, tik kad naudojama Float tipui

[b]Ir viskas! Tiek užtenka kad galėtumėte atnaujinti savo senas sistemas![/b]

Tačiau MySQL gali DAUG daugiau. Kelias [i]smulkmenas[/i] dar paminėsiu:

Kartais norisi ir ištrint duomenis, tokio tipo query atrodytu taip:[/size][/font][/i][/font]

[i][font=tahoma,geneva,sans-serif][font=tahoma,geneva,sans-serif][size=4]format(query,sizeof(query),"DELETE FROM `lentele_pavadinimas` WHERE kasnors='%'");[/size][/font][/font][/i]

[font=tahoma,geneva,sans-serif][font=tahoma,geneva,sans-serif][i]tai ištrins visą eilutę

[b]MySQL turi tokį dalyką kaip "default values".[/b] Pavyzdžiui turite tokią lentelę kaip pavyzdinė viršuje, įrašote tik žaidėjo vardą bei slaptažodį, ir galite padaryti jog pas jį iškarto atsirastų kasnors. Tai galite padaryti nuėję į savo duomenų bazę, paspaudę ant lentelės,tada viršuje "structure", susiraskite norima laukelį ir spauskite change, atsidarys stulpelio nustatymai, ten kur "deffault" pasirinkite "as defined" ir įrašykite norimą vertę.

Dar vienas naudingas privalumas tai yra ryšiai. Kalbu apie ryšius tarp lentelių. Pavyzdžiui galima susieti mašina su žaidėjo, kad ištrynus žaidėja, dingtų ir mašina.[/i]

[color=#ff0000][i][u][size=4][b]Autorius: Bebras[/b][/size][/u][/i][/color][/font][/font][color=#ff0000][i][u] [/u][/i][/color]

[i]Tik dalinuosi rasta pamoka,visi kreditai priklauso [color=#ff0000][b]Bebras.[/b][/color][/i]

  • Teigiamai 1
  • Neigiamai 1
Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3895 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Svečias
Ši tema yra užrakinta.
  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...