Obdelava in shranjevanje podatkov je pomembna tematika v vsakem programskem jeziku. V PHPju najpogosteje uporabljamo MySQL podatkovne baze.
MySQL strežnik (1) --> Podatkovna baza (2) --> Tabela (3) --> Stolpci (4) --> Vrstice (5)
1. MySQL strežnik običajno teče na istem računalniku kot spletni strežnik - pri večjih podatkovnih bazah strežnika namestimo na ločena računalnika.
2. Na MySQL strežniku imamo poljubno število podatkovnih baz. Z določenim uporabniškim imenom in geslom lahko dostopamo do nekega števila le-teh. Uporabnik 'root' lahko dostopa do vseh baz.
2. V vsaki podatkovni bazi je poljubno število tabel. Tabele so enote, ki nosijo podatke. Obliko tabele (ime, stolpce, ključe,...) določi uporabnik.
4. V tabeli je poljubno število stolpcev, vsak stolpec pa ima določeno ime in podatkovni tip.
5. V vrsticah so shranjeni dejanski podatki, ki so lahko različnih tipov (glede na stolpce).
Podobno kot v PHPju ima tudi MySQL različne podatkovne tipe - glede na izbran podatkovni tip se spremenijo tudi naše možnosti za delo s podatki. Naštejmo nekaj najbolj običajnih podatkovnih tipov:
VARCHAR -
se uporablja za krajše nize (npr. iz <input
type="text">)
INT - se
uporablja za števila
TEXT - se
uporablja za daljše besedilo (npr. iz
<textarea>)
DATETIME -
se uporablja za shranjevanje točnega datuma in časa
Pri nekaterih podatkovnih tipih (npr. VARCHAR in INT) moramo MySQLu povedati tudi največjo dolžino le-teh. Za VARCHAR je to tipično 255, za INT pa 6.
Največkrat želimo dodajati, spreminjati in brisati podatke v tabelah. V MySQL jeziku opišemo, katere podatke želimo iz baze, nato pa jih z ustreznimi funkcijami PHPja obdelamo.
Primer tabele izdelki s tremi stolpci:
| ime (VARCHAR) | cena (INT) | stevilo (INT) |
| tipkovnica | 5000 | 20 |
| tiskalnik | 12000 | 40 |
| pekac | 4500 | 25 |
Če želimo iz tabele dobiti vse podatke, bi uporabili stavek SELECT. S stavkom SELECT iz tabele takole preberemo vse vrstice z vrednostmi iz vseh stolpcev:
SELECT * FROM izdelki;
Če želimo iz tabele izbrati samo stolpca ime in cena, bi namesto zvezdice (*) napisali imena stolpcev, ločenih z vejico (Zgoraj je rezultat tega ukaza pobarvan z rumeno):
SELECT ime,cena FROM izdelki;
Kaj pa, če želimo iz tabele izbrati samo izdelke, ki so dražji od 4700 SIT (tipkovnico in tiskalnik)?
SELECT * FROM izdelki WHERE cena > 4700;
V tem primeru smo uporabili še ukaz WHERE, s katerim določimo pogoj. Več pogojev lahko združimo na podoben način kot v PHPju - z uporabo AND in OR. Primer, kjer iz tabele izdelki izberemo samo vrstice, kjer je cena večja ali enaka 5500 in stevilo večje ali enako 30:
SELECT * FROM izdelki WHERE cena >= 5500 AND stevilo
>= 30;
Vrstni red vrstic lahko pri branju spremenimo tako, da na koncu SQL stavka dodamo ukaz ORDER BY stolpec ASC / DESC, recimo takole:
SELECT * FROM izdelki ORDER BY cena ASC;
Tako bodo izdelki izpisani v vrsnem redu od tistega z najmanjšo ceno pa do tistega z največjo - če bi želeli obraten vrstni red izpisa, bi namesto ASC (ascending - naraščajoče) uporabili DESC (descending - padajoče).
Omejimo lahko tudi število vrstic - to storimo z ukazom LIMIT, ki mu sledi številka vrstice, pri kateri se branje prične (štetje se začne pri 0), nato vejica in na koncu še število vrstic, ki ga želimo prebrati. Če v poizvedbi že uporabljamo ukaz ORDER BY, damo ukaz LIMIT za njim:
SELECT * FROM izdelki ORDER BY cena ASC LIMIT 0,2;
Zgornji stavek bo iz tabele izbral samo tipkovnico in pekač.
Seveda lahko v tabelo (če imamo ustrezne pravice) vstavimo novo vrstico (ang. row) - to naredimo s stavkom INSERT. Primer vstavljanja izdelka z imenom monitor, ki stane 25000 in jih imamo 15:
INSERT INTO izdelki (ime,cena,stevilo)
VALUES ('monitor',2500,15);
V prvem, z modro označenem delu, navedemo vrstni red stolpcev, ki jim bomo v enakem vrstnem redu priredili vrednosti (rdeči del). Ni potrebno, da vstavimo podatke v vse stolpce. Nize navedemo v enojnih narekovajih.
Poleg vstavljanja nizov in števil ima MySQL tudi veliko količino vgrajenih funkcij. Če želimo v tabelo novice shraniti naslov novice, besedilo novice ter cas dodajanja novice, lahko trenutni čas in datum (ki je odvisen od časa in datuma na MySQL strežniku) vstavimo z uporabo funkcije NOW():
INSERT INTO novice (naslov,besedilo,cas)
VALUES ('Testna
novica','Blabla',NOW());
Če bi recimo želeli število tipkovnic iz 20 zmanjšati na 19, bi uporabili stavek UPDATE:
UPDATE izdelki SET stevilo = 19 WHERE ime = 'tipkovnica';
Ta stavek se torej vsaj delno obnaša podobno kot stavek SELECT - navesti moramo kriterije za izbiro vrstic (1 ali več), z ukazom SET pa nato spremenimo določene vrednosti stolpcev.
Če bi želeli vsem izdelkom v tabeli stevilo spremeniti na 0, bi preprosto napisali
UPDATE izdelki SET stevilo = 0;
Določene vrstice iz tabele izbrišemo z ukazom DELETE, ki se obnaša podobno kot SELECT in UPDATE:
DELETE FROM izdelki WHERE ime = 'tipkovnica';
Tako izbriše vrstico / vrstice z imenom 'tipkovnica'.
V PHP je podpora MySQL že nekaj časa vgrajena, če vam spodnje funkcije ne delujejo, boste v datoteki php.ini pod extensions morali odkomentirati vrstico za mysql.
Za začetek se moramo povezati na strežnik in izbrati podatkovno bazo, s katero želimo operirati. To storimo takole:
@mysql_connect("localhost","root","");
@mysql_select_db("test") or die("Napaka pri povezavi na bazo!");
Funkciji mysql_connect podamo tri argumente - naslov strežnika, uporabniško ime in geslo. Pri privzeti namestivi XAMPPja geslo pustimo prazno.
S funkcijo mysql_select_db pa izberemo podatkovno bazo.
Znak @ pred klici funkcij pomeni, da na zaslon v primeru napake ne bomo dobili "generičnega" sporočila o napaki.
Zgoraj smo se naučili nekaj osnovnih MySQL ukazov, ki jih nato poženemo s klicem funkcije mysql_query().
V primeru, da želimo pognati stavek tipa INSERT, UPDATE ali DELETE, je dovolj, da funkciji kot argument podatmo željeni stavek, recimo:
mysql_query("DELETE FROM izdelki WHERE ime =
'tipkovnica';");
Če pa iz neke tabele želimo dobiti podatke (s stavkom SELECT), moramo vrednost, ki jo vrne funkcija mysql_query, shraniti v neko spremenljivko, primer:
$rezultat = mysql_query("SELECT * FROM izdelki;");
Žal podatkov z ukazom "print $rezultat;" še ne moremo izpisati. Podatki so namreč shranjeni v neke vrste polju.
Za začetek spoznajmo funkcijo mysql_numrows(), ki vrne število vrstic našega zadetka. Primer za zgornjo tabelo:
$rezultat = mysql_query("SELECT * FROM izdelki;");
$num = mysql_numrows($rezultat);
print $num; // izpiše 3
To lahko skombiniramo s funkcijo mysql_result(), ki nam vrne vrednost posamezne celice v tabeli.
Ta funkcija sprejme 3 argumente - "vrednost", ki jo vrne funkcija mysql_query(), številko vrstice iz zadetka (začenši pri 0) in ime stolpca. Primer izpisa cene tiskalnika iz zgornjega primera:
$rezultat = mysql_query("SELECT * FROM izdelki;");
print mysql_result($rezultat,1,"cena"); //
izpiše 12000
Če bi tako želeli izpisati cene vseh treh izdelkov v tabeli, bi si pomagali z zanko for in s funkcijo mysql_numrows():
$rezultat = mysql_query("SELECT * FROM izdelki;");
$num = mysql_numrows($rezultat);
for ($i = 0; $i < $num; $i++) { // zanko izvedemo za vse vrstice
v tabeli rezultatov
print mysql_result($rezultat,$i,"cena") .
"<br />\n"; // izpišemo vrednost
stolpca cena
}
// za $i-to
vrstico
Je še en način izpisa podatkov - funkcija sprejme en obvezen argument - "vrednost", ki jo vrne funkcija mysql_query() in vrne 1D polje s trenutno vrstico rezultatov - če funkcijo postavimo v while zanko, bomo zaporedoma dobili 1D polja za vse vrstice iz tabele rezultatov:
$rezultat = mysql_query("SELECT * FROM izdelki;");
while ($vrstica = mysql_fetch_array($rezultat)) {
print $vrstica[0]; // trenutna vrednost
celice iz stolpca ime (enako:
$vrstica['ime'])
print $vrstica[1]; // trenutna vrednost
celice iz stolpca cena
(enako: $vrstica['cena'])
print $vrstica[2]; // trenutna vrednost
celice iz stolpca stevilo
(enako:$vrstica['stevilo'])
}
mysql_close
- pokličemo na koncu skripte oz. ko MySQL povezave ne potrebujemo več
mysql_error
- vrne niz z zadnjo MySQL napako
mysql_escape_string - zelo pomembna funkcija, s katero se prepričamo, da so vsi enojni narekovaji in drugi posebni znaki v nizu, ki ga želimo uporabiti v MySQL poizvedbi, ustrezno escapani. Primer:
$ime = mysql_escape_string($_POST['ime']);
$priimek = mysql_escape_string($_POST['priimek']);
$naredi = "INSERT INTO osebe (ime,priimek) VALUES
('{$ime}','{$priimek}');";
mysql_query($naredi);
To funkcijo vedno uporabljaj pred vstavljanjem vrednosti spremenljivk v MySQL poizvedbo!
Ko smo prijavljeni kot root, lahko novo podatkovno bazo ustvarimo z ukazom
CREATE DATABASE ime_baze;
Če bi želeli za to bazo ustvariti posebnega uporabnika, ki ima dostop samo do nje, bi to storili takole:
GRANT ALL PRIVILEGES ON ime_baze.*
TO username@localhost
IDENTIFIED BY 'geslo';
Odebeljene dele moramo zamenjati z ustreznimi - uporabniško ime in geslo si seveda izmislimo na novo.
Ustvarjanje tabel je bolj zahtevno opravilo, običajno tabelo znotraj baze ustvarimo takole (primer ukaza za ustvarjanje tabele iz začetka tega vodiča):
CREATE TABLE izdelki
(
ime VARCHAR(255),
cena INT(6),
stevilo INT(6)
);
Privzeto sami zapisi (vrstice) v neki tabeli niso ošteviljčeni, je pa koristno, če vsak zapis enolično označimo, da ga lahko kasneje izbrišemo. To storimo tako, da v tabeli ustvarimo stolpec id, mu določimo lastnost auto_increment in ga nastavimo za primarni ključ. Popravimo zgornjo kodo za ustvarjanje tabele izdelki, da bo vsebovala še 4. stolpec - id:
CREATE TABLE izdelki
(
ime VARCHAR(255),
cena INT(6),
stevilo INT(6),
id INT(6) NOT NULL auto_increment,
PRIMARY KEY(id)
);
Ko bomo s stavkom INSERT v tabelo vstavljali zapise, bo vsak dobil svoj id - začenši pri 1, ko bomo nek zapis želeli pobrisati, bomo to preprosto storili z ukazom DELETE FROM ime_tabele WHERE id = 15, če brišemo vrstico z id-jem 15.
Pozor: Pri vstavljanju podatkov v tabelo nam ni potrebno določiti vrednosti id-ja, zato bi stavek INSERT za zgornjo tabelo izgledal takole:
INSERT INTO izdelki (ime,cena,stevilo) VALUES ('nek
izdelek',5000,50)
in ne takole:
INSERT
INTO izdelki (ime,cena,stevilo,id)
VALUES ('nek izdelek',5000,50,1)
Za lažje ustvarjanje podatkovnih baz in tabel ter za lažje pregledovanje podatkov ter razhroščevanje naših aplikacij si lahko pomagamo z orodjem phpMyAdmin. V privzeti namestitvi XAMPP do njega dostopamo prek URLja http://localhost/phpmyadmin/. Privzeto nam ni potrebno vnesti gesla ali uporabniškega imena (prijavljeni smo kot root).
V pasu na levi za začetek izberemo podatkovno bazo (recimo test, ki je prikladno prazna.), nato pa lahko na desni na dnu ustvarimo novo tabelo, tako da jo poimenujmo in navedemo število polj (stolpcev), ki naj jih ima.
Za vajo bomo ustvarili tabelo z imenom ocene, ki bo imela 4 stolpce. Kliknemo gumb Izvedi. Sedaj moramo vsa štiri polja poimenovati (prvi stolpec), jim določiti vrsto, dolžino (VARCHAR - 255, INT - 6) in id-ju določiti še auto_increment ter primary key.
V prvi prostorček levo zgoraj v tabeli napišimo ime, vrsto pustimo
na VARCHAR, dolžino pa nastavmo na 255.
V drugi vrstici zadevo ponovimo, le da naj bo ime polja priimek.
V tretji vrstici polje poimenujmo ocena,
vrsto spremenimo na INT
in ji dolžino nastavmo na 1
(notri bodo samo enomestna števila).
V četrti vrstici polje poimenujmo id,
vrsto spremenimo na INT,
dolžina naj bo 6. Pod Dodatno
izberimo možnost auto_increment
ter izberimo piko pri sličici ključa.
Sedaj lahko kliknemo gumb Shrani in si ogledamo našo novo tabelo.
Ko smo v neki podatkovni bazi / tabeli, je zanimiv tudi jeziček SQL na vrhu desne polovice strani, s katerim lahko ročno poženemo željeno SQL poizvedbo ter jeziček Iskanje, s katerim iščemo po naši podatkovni bazi / tabeli.
Zaenkrat naj bo to dovolj o MySQLu, najlažje se boš z njim spoznal tako, da narediš čim več nalog, ki te že čakajo. Če česa ne razumeš, pa se oglasi na forumu.