96
Tehničko veleučilište u Zagrebu PHP i MySQL tečaj Skripta PHP tečaja semestar II Sadržaj MySQL baza podataka............................................................................................................................. 5 1. Uvod u relacijski model........................................................................................................................ 5 2. MySQL osnove...................................................................................................................................... 9 2.1. Tipovi podataka................................................................................................................................. 9 2.1.1. Numerički tipovi ............................................................................................................................ 9 2.1.2. Tekstualni tipovi........................................................................................................................... 11 2.1.3. Vremenski tipovi...........................................................................................................................12 2.1.4. Null............................................................................................................................................... 13 2.2. Rad sa jezikom.................................................................................................................................13 2.3. Mehanizmi za pohranu....................................................................................................................14 2.4. Rad sa MySQL-om iz komandne linije............................................................................................. 15 3. Osnove SQL-a..................................................................................................................................... 18 3.1. CREATE............................................................................................................................................ 20 3.2. DROP................................................................................................................................................22 3.3. ALTER ..............................................................................................................................................24 3.4. SELECT............................................................................................................................................. 25 3.5. INSERT............................................................................................................................................. 27 3.6. UPDATE............................................................................................................................................28 3.7. DELETE.............................................................................................................................................29 3.8. TRUNCATE....................................................................................................................................... 30 3.9. GRANT............................................................................................................................................. 30 3.10. REVOKE..........................................................................................................................................31 3.11. START TRANSACTION, COMMIT, ROLLBACK.................................................................................31 3.12. USE................................................................................................................................................ 32 3.13. SET................................................................................................................................................. 32 3.14. DESCRIBE....................................................................................................................................... 34 1

Netakadmija m4 Mysql

Embed Size (px)

DESCRIPTION

sql iphp skripta

Citation preview

Page 1: Netakadmija m4 Mysql

Tehničko veleučilište u Zagrebu PHP i MySQL tečaj

Skripta PHP tečaja semestar IISadržaj

MySQL baza podataka.............................................................................................................................5

1. Uvod u relacijski model........................................................................................................................5

2. MySQL osnove......................................................................................................................................9

2.1. Tipovi podataka.................................................................................................................................9

2.1.1. Numerički tipovi ............................................................................................................................9

2.1.2. Tekstualni tipovi...........................................................................................................................11

2.1.3. Vremenski tipovi...........................................................................................................................12

2.1.4. Null...............................................................................................................................................13

2.2. Rad sa jezikom.................................................................................................................................13

2.3. Mehanizmi za pohranu....................................................................................................................14

2.4. Rad sa MySQL-om iz komandne linije.............................................................................................15

3. Osnove SQL-a.....................................................................................................................................18

3.1. CREATE............................................................................................................................................20

3.2. DROP................................................................................................................................................22

3.3. ALTER ..............................................................................................................................................24

3.4. SELECT.............................................................................................................................................25

3.5. INSERT.............................................................................................................................................27

3.6. UPDATE............................................................................................................................................28

3.7. DELETE.............................................................................................................................................29

3.8. TRUNCATE.......................................................................................................................................30

3.9. GRANT.............................................................................................................................................30

3.10. REVOKE..........................................................................................................................................31

3.11. START TRANSACTION, COMMIT, ROLLBACK.................................................................................31

3.12. USE................................................................................................................................................32

3.13. SET.................................................................................................................................................32

3.14. DESCRIBE.......................................................................................................................................34

1

Page 2: Netakadmija m4 Mysql

PHP i MySQL tečaj

3.15. EXPLAIN.........................................................................................................................................34

3.16. SHOW............................................................................................................................................35

4. Funkcije MySQL-a...............................................................................................................................36

4.1. Agregatne funkcije..........................................................................................................................36

4.2. String funkcije..................................................................................................................................37

4.3. Numeričke funkcije.........................................................................................................................37

4.4. Funkcije datuma i vremena.............................................................................................................38

5. Proces dizajniranja baze podataka.....................................................................................................40

5.1. Identificirati entitete i njihove veze................................................................................................40

5.1.1. Aktivnosti visokog nivoa...............................................................................................................41

5.1.2. Identificiranje entiteta.................................................................................................................42

5.1.3. Identificirati relacije.....................................................................................................................42

5.1.4. Razlaganje aktivnosti....................................................................................................................43

5.1.5. Identifikacija pravila poslovanja...................................................................................................45

5.2. Identifikacija potrebnih podataka...................................................................................................45

5.3. Normalizacija podataka...................................................................................................................47

5.4. Napraviti bazu podataka u odgovarajućem softwareu...................................................................52

5.5. Provjeriti dizajn................................................................................................................................52

6. Vrste spojeva......................................................................................................................................53

7. Subquery............................................................................................................................................56

8. Indeksi................................................................................................................................................58

9. Dodatno o stranim ključevima...........................................................................................................66

10. Rad sa MySQL bazom iz PHP-a.........................................................................................................68

10.1. mysql ekstenzija............................................................................................................................68

10.1.1. mysql_connect...........................................................................................................................70

10.1.2. mysql _close...............................................................................................................................71

10.1.3. mysql_select_db.........................................................................................................................72

10.1.4. mysql_query...............................................................................................................................73

10.1.5. mysql_fetch_array.....................................................................................................................74

10.1.6. mysql_num_rows.......................................................................................................................75

10.1.7. mysql_affected_rows.................................................................................................................75

2

Page 3: Netakadmija m4 Mysql

PHP i MySQL tečaj

10.1.8. mysql_insert_id..........................................................................................................................75

10.2. mysqli ekstenzija...........................................................................................................................76

10.2.1. MySQLi konstruktor...................................................................................................................77

10.2.2. MySQLi query metoda................................................................................................................78

10.2.3. MySQLi prepare metoda............................................................................................................79

10.2.4. MySQLi insert_id property (svojstvo)........................................................................................80

10.2.5. MySQLi autocommit metoda.....................................................................................................81

10.2.6. MySQLi commit metoda.............................................................................................................81

10.2.7. MySQLi rollback metoda............................................................................................................81

10.2.8. MySQLi_STMT bind_param metoda..........................................................................................82

10.2.9. MySQLi_STMT execute metoda.................................................................................................83

10.2.10. MySQLi_STMT fetch metoda...................................................................................................84

10.2.11. MySQLi_STMT bind_result metoda.........................................................................................85

10.2.12. MySQLi_STMT free_result metoda..........................................................................................85

10.2.13. MySQLi_STMT close metoda....................................................................................................85

10.2.14. MySQLi_Result fetch_array metoda........................................................................................86

10.2.15. MySQLi_Result fetch_all metoda.............................................................................................87

10.2.16. MySQLi_Result num_rows svojstvo (property).......................................................................87

10.3. PDO ekstenzija...............................................................................................................................88

10.3.1. PDO konstruktor.........................................................................................................................88

10.3.2. PDO exec metoda.......................................................................................................................89

10.3.3. PDO query metoda.....................................................................................................................90

10.3.4. PDO lastInsertId metoda............................................................................................................91

10.3.5. PDO errorInfo metoda...............................................................................................................91

10.3.6. PDO metode za upravljenje transakcijama................................................................................92

10.3.7. PDO prepare metoda.................................................................................................................93

10.3.8. PDOStatment bindValue metoda...............................................................................................94

10.3.9. PDOStatment execute metoda..................................................................................................95

10.3.10. PDO fetch metoda....................................................................................................................96

10.3.11. PDOStatment fetchAll metoda.................................................................................................96

Prilozi.....................................................................................................................................................97

3

Page 4: Netakadmija m4 Mysql

PHP i MySQL tečaj

11. Prilog A: SQL sintaksa MySQL manula.............................................................................................97

4

Page 5: Netakadmija m4 Mysql

PHP i MySQL tečaj 1. Uvod u relacijski model

MySQL baza podataka

1. Uvod u relacijski modelBaza podataka je organizirana zbirka podataka. Jedna od mogućih definicija baze podataka glasi da

je to zbirka zapisa pohranjenih u računalu na sustavni način, takav da joj se računalni program može

obratiti prilikom odgovaranja na problem. Svaki se zapis za bolji povratak i razvrstavanje obično

prepoznaje kao skup elemenata (činjenica) podataka. Predmeti vraćeni u odgovoru na upite postaju

informacije koje se mogu koristiti za stvaranje odluka koje bi inače mogle biti mnogo teže ili

nemoguće za stvaranje. Računalni program korišten za upravljanje i ispitivanje baze podataka nazvan

je sustav upravljanja bazom podataka.

Jedan takav program tj. sustav za upravljanje bazom podatak je MySQL. On je server, koji je cijelo

vrijeme aktivan i čeka na portu 3306 da dođe upit za nekim podacima.

Unutar MySQL servera može biti puno različitih baza podatka, npr. baza podataka za vođenje

knjigovodstva firme A ili baza podataka o zaposlenima firme B ili baza podataka u kojoj su pohranjeni

sadržaji koji se prikazuju na web stranici firme C itd.

Svaka baza podataka u sebi ima jednu ili više tablica sa podacima npr. tablica u kojoj su pohranjeni

podaci o zaposlenima firme.

U svaku tablicu se spremaju podaci o jedinki npr. zaposleniku i to se zove zapis ili record na

engleskom. Tako tablica zaposlenici ima puno redaka tj zapisa svaki zapis pohranjuje podatke jednog

zaposlenika. Također tablica ima stupce ti stupci se nazivaju atributi. Tako se nazivaju zato jer se

time misli na atribute zaposlenika ako se radi o tablici sa zaposlenima tj. svi podaci koji se o

pojedinim zaposleniku trebaju pamtiti npr. ime, prezime, adresa, grad itd.

5

Page 6: Netakadmija m4 Mysql

PHP i MySQL tečaj 1. Uvod u relacijski model

Primjer:

JMBG Ime Prezime Adresa Grad

123123123 Joža Jožić Neka 12 Rijeka

234234666 Ivan Ivić Adresa 123 Varaždin

U ovom primjeru je prikazan tablica koja sprema podatke o zaposlenima. Pohranjeni su podaci o dva

zaposlenika, Joži i Ivanu. Pamte se podaci: JMBG, Ime, Prezime, Adresa i Grad. Tako da se može reći

da je vrijednost atributa Prezime za zapis o Ivanu Ivić.

Ovakvih tablica u bazi podatak može biti puno npr. ako imamo tablicu u kojoj se spremaju podaci o

zaposlenima u nekoj firmi onda u toj bazi podataka mogu biti tablice kao što su:

• zaposlenici

• odjeli

• place

• itd.

Kada imamo puno tablica i spremamo u našu bazu podatak podatke o puno različitih stvari vrlo je

vjerojatno da će se pojaviti potreba da te podatke stavimo u nekakav odnos. Odnos se općenito u

bazi podataka naziva relacija.

Npr. svaki zaposlenik se nalazi u nekom od odjela. I to da je zaposlenik u nekom odjelu nam je bitan

podatak, moramo i njega zapamtiti.

Gdje to pamtiti i kako? Imamo dvije tablice, zaposlenici i odjeli i možemo vidjeti kako izgledaju

podaci u njima:

Zaposlenici:

JMBG Ime Prezime Adresa Grad

123123123 Joža Jožić Neka 12 Rijeka

234234666 Ivan Ivić Adresa 123 Varaždin

6

Page 7: Netakadmija m4 Mysql

PHP i MySQL tečaj 1. Uvod u relacijski model

Odjeli:

Ime Adresa Grad

Odjel za marketing Neka 123 Rijeka

Knjigovodstveni odjel Adresa 543 Rijeka

Da bi uopće mogli staviti zapise u odnos moram uvesti pojam ključa. Ključ je neki podatak u zapisu

koji se pojavljuje u drugom zapisu (u drugoj tablici ali nekad može u istoj) i tako veže ta dva zapisa

npr.:

Zaposlenici:

JMBG Ime Prezime Adresa Grad Broj odjela

123123123 Joža Jožić Neka 12 Rijeka 1

234234666 Ivan Ivić Adresa 123 Varaždin 1

Odjeli:

Broj odjela Ime Adresa Grad

1 Odjel za marketing Neka 123 Rijeka

2 Knjigovodstveni odjel Adresa 543 Rijeka

Uveli smo novi atribut odjela po imenu Broj odjela. I njega koristimo također u tablici Zaposlenici da

bi naznačili u kojem se odjelu zaposlenik nalazi. Kao što se vidi oba zaposlenika su u odjelu za

marketing. Zašto nismo koristili ime odjela kao ključ? Razloga ima više ali dva su najvažnija:

1. Kad je ključ tekst a ne broj, korisnik može pogriješiti prilikom unosa u bazu podataka i dolazi

do greške.

2. Programi za upravljanje bazom podataka (MySQL) bolje barataju sa brojevima koji također

zauzimaju manje mjesta za svoju pohranu.

Potreban nam je još jedan termin da bi mogli iz PHP radit sa našom bazom podataka a to je primarni

ključ. To je atribut u tablici koji je jedinstven za svaki od zapis. Npr. Broj odjela u tablici Odjeli ili

JMBG u tablici zaposlenici. Kada program za upravljanje bazom podataka (MySQL) pohranjuje bazu

negdje na disk računala on obrača posebnu pozornost na primarni ključ u svakoj tablici i njega koristi

kad ponovno treba pristupiti tim podacima. Znači ako nas zanima nešto od podataka zaposlenika

7

Page 8: Netakadmija m4 Mysql

PHP i MySQL tečaj 1. Uvod u relacijski model

Ivana MySQL će koristiti JMBG da bi te podatke dohvatio sa diska računala. Jedna stvar je bitna kod

primarnoga ključa a to je da svaki mora biti jedinstven u svojoj tablici. Znači ne smije nam se pojaviti

dva ista JMBG-a u tablici Zaposlenici.

Ovakva baza podatka koja funkcionira na opisani način je relacijska baza podataka. To su danas

najraširenijeg baze podataka ali postoje i drugačije, postoje baze podataka koje nemaju tablice, koje

nemaju atribute niti ključeve i imaju nešto sasvim drugo. Ali MySQL je relacijska baza podataka i ona

ovakvo funkcionira te sasvim zadovoljava sve što ćemo mi od baze podataka trebati.

8

Page 9: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

2. MySQL osnoveImena tablice, same baze podataka i atributa se pišu malim slovima engleske abecede bez

znakova razmaka.

2.1. Tipovi podataka

Svakom atribut tj. polju se treba odrediti tip podataka koji će se u njega spremati. Slično tipovima

varijabli u PHP-u. Kod određivanja tipa atributa cilj je odrediti tip sa kojim će se moći pohraniti bilo

koji podatak koji bi mogao doći u to polje a da se ne zauzme previše prostora na disku. Npr. velika je

razlika ako u atribut očekujemo pohraniti ime osobe ili nekoliko stranica teksta.

U MySQL tipovi podatka se dijele na:

1. numeričke

2. tekstualne ili string

3. vremenske

4. null

2.1.1. Numerički tipovi

Mogu biti sa ili bez predznaka. Ako su sa predznakom mogu imati negativne vrijednosti. Postojanje

predznaka određuje također koliki je maksimalni i minimalni broj koji se može pohraniti u polje. Ako

numeričko polje nema predznak prilikom njegovog definiranja treba to naglasiti ključnom riječju

UNSIGNED.

Postoje sljedeći tipovi numeričkih podataka:

BIT(x) – gdje je x broj bitova po vrijednosti. Može biti između 1 i 64, ako se ne navede onda je 1.

Skoro isključivo se koristi da bi pohranili da nečeg ima ili nema, ekvivalent boolean tipu u PHP-u. Npr.

dali je registrirani korisnik vaše stranice pretplaćen na newsletter, ako je onda atribut newsletter u

tablici korisnici ima vrijednost 1 ako nije ima vrijednost 0.

Uvedeno u verziji 5.0.3.

TINYINT – od -128 do 127 ili bez predznaka od 0 do 255.

9

Page 10: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

BOOL, BOOLEAN – interno se pretvara u TINYINT i u njega se mora pohranjivati numerička

vrijednost.

SMALLINT – od -32.768 do 32.767 ili bez predznaka od 0 do 65.535

MEDIUMINT – od -8.388.608 do 8.388.607 ili bez predznaka od 0 do 16.777.215

INT – od -2.147.483.648 do 2.147.483.647 ili bez predznaka od 0 do 4.294.967.295

BIGINT – od -9.223.372.036.854.775.808 do 9.223.372.036.854.775.807 ili bez predznaka od 0 od

18.446.744.073.709.551.615

FLOAT(x, y) – se koristi za pohranu realnih brojeva sa manjom preciznošću (manji broj ukupnih

znakova). x je ukupan broj znakova a y broj decimalnih znakova. Maksimalne i minimalne vrijednosti

koje se mogu pohraniti ovise o sustavu na kojem se MySQL nalazi. Za približne vrijednosti pogledati

MySQL manual.

DOUBLE(x, y) – isto kao i FLOAT ali sa duplom preciznošću.

DOUBLE PRECISION – sinonim za DOUBLE.

FLOAT(x) – gdje je x preciznost u broj bitovima. MySQL interno pretvara ovaj tip u float ili double

ovisno o određenom broju bitova za preciznost.

DECIMAL(x, y) – slično double-u ali sa specifičnostima ovisno o verziji MySQL.

10

Pogledati MySQL manual prije upotrebe.

Također dolazi i pod sinonimima DEC, NUMERIC i FIXED.

Page 11: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

2.1.2. Tekstualni tipovi

Polja u koja će se pohranjivati tekst međutim također se pod tekstualnim tipovima smatraju polja

koja imaju fiksan broj od prije definiranih vrijednosti i polja u koja će se pohranjivati binarni podaci.

Tekstualna polja se djela na fiksne i varijabilne. Fiksna polja će zauzimati uvijek istu količinu memorije

za svoju pohranu. Varijabilna polja će zauzimati onoliku količinu memorije koliko je u njima

pohranjeno podataka do svog maksimuma koji je definiran prilikom njihovog kreiranja. Prednost

fiksnih polja je lakši povrat podataka u slučaju kvara nad bazom podataka u nekim specifičnim

slučajevima.

Postoje sljedeći tipovi tekstualnih polja:

CHAR(x) – Tekst od x znakova. Gdje x može biti između 1 i 255, ako se ne navede iznosi 1. Char je

fiksan tip polja.

VARCHAR(x) - Tekst od maksimalno x znakova. Gdje x može biti između 1 i 255, ako se ne navede

iznosi 1. Varchar je varijabilan tip polja. Od verzije 5.0.3 omogućuje definiranje sa pohranom više od

255 znakova u kojem slučaju se interno pretvara u varijabilan tip tekstualnoga polja koje omogućuje

pohranu tolikoga broja znakova.

BINARY(x) – Za pohranu binarnih vrijednosti. X je broj duljina polja u bytovima, maksimalno 255.

Fiksan tip polja.

VARBINARY(x) – Ekvivalent varchar tipu ali za pohranu binarnih vrijednosti.

TINYBLOB – polje sa maksimalno 255 bytova. Varijabilni tip.

TINYTEXT – polje sa maksimalno 255 znakova. Varijabilni tip.

BLOB(x) – polje od maksimalno 65535 bytova. x je opcionalni propisan maksimalan limit koji mora

biti manji od navedenoga maksimuma. Varijabilni tip.

11

Page 12: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

TEXT(x) – polje sa maksimalno 65535 znakova. x je opcionalni propisan maksimalan limit koji mora

biti manji od navedenoga maksimuma. Varijabilni tip.

MEDIUMBLOB – maksimalno 16777215 bytova. Varijabilni tip.

MEDIUMTEXT - maksimalno 16777215 znakova. Varijabilni tip.

LONGBLOB – maksimalno 4G bytova. Varijabilni tip.

LONGTEXT - maksimalno 4G znakova. Varijabilni tip.

ENUM('vrijednost 1', 'vrijednost 2', 'vrijednost 3',..) - polje koje može sadržavati jednu od

predefiniranih vrijednosti ('vrijednost 1', 'vrijednost 2', 'vrijednost 3' itd.) ili vrijednost NULL ili

vrijednost 00.

SET('vrijednost 1', 'vrijednost 2', 'vrijednost 3',..) - polje koje može imati jednu ili više predefiniranih

vrijednosti.

2.1.3. Vremenski tipovi

Postoje sljedeći tipovi vremenskih polja:

DATE – datum u obliku 'YYYY-MM-DD'. Opseg vrijednosti ide od '1000-01-01' do '9999-12-31'.

DATETIME – datum i vrijeme u obliku 'YYYY-MM-DD HH:MM:SS'. Opseg vrijednosti ide od '1000-01-

01 00:00:00' do '9999-12-31 23:59:59'.

TIMESTAMP – datum i vrijeme u obliku 'YYYY-MM-DD HH:MM:SS'. Interno se pohranjuje kao broj

sekundi protekao od Unix epohe (1.1.1970.). Opseg vrijednosti je od '1970-01-01 00:00:01' UTC

12

Page 13: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

( Coordinated Universal Time: http://en.wikipedia.org/wiki/Coordinated_Universal_Time ) do '2038-

01-19 03:14:07' UTC.

TIME – Vrijeme u formatu 'HH:MM:SS'. Opseg vrijednosti je od '-838:59:59' do '838:59:59'.

YEAR(2|4) – Godina u obliku dvije ili 4 znamenke. Ako se ne navede pretpostavlja se 4.

2.1.4. Null

Null je posebna vrijednost polja čija vrijednost nije definirana tj. ona ne postoji. Prilikom definiranja

polja bilo kojeg tipa može se odrediti dali to polje smije sadržavati null vrijednost. Null je važan kao

koncept ne definiranosti i ne postojanja određenog podataka te ima veliku važnost u bazama

podatak.

2.2. Rad sa jezikom

MySQL tekst koji pohranjuje veže za kodnu stranicu i poredak abecede. Kodne stranice govore koje

sve slova i znakovi postoje u nekom jeziku a poredak abecede tj. znakova određuje poredak od

manje na više i obratno prilikom sortiranja pohranjenih tekstualnih podataka.

Kodna stranica i poredak abecede se mogu odrediti na razini:

1. baze podataka

2. tablice

3. polja

Ako polje nema definiranu kodnu stranicu gleda se dali ga ima tablica, ako ga nema tablica uzima se

kodna stranica od baze podataka. Kodna stranica i poredak se uvijek gledaju od polja zato jer se

podaci iz baze podataka traže po poljima. Tako može biti da baza ima kodnu stranicu A, tablica B i

polje C. U rezultatima će se dobiti podatke u kodnoj stranici C jer je ono prisutno na najnižoj razni tj.

polju.

Kodne stranice se nazivaju character set dok se poredak abecede naziva collate. Za hrvatski jezik

vrijede sljedeće kodne stranice i pripadajući poreci abeceda:

13

Page 14: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

• Character set: latin2, collate: latin2_croatian_ci

ISO—8859-2 standard.

• Character set: cp1250, collate: cp1250_croatian_ci

Windows Central European standard.

• Character set: utf8, collate: utf8_croatian_ci

UTF 8 standard. Collate utf8_croatian_ci će vrijediti tek od verzije 6.0 do tada se može

upotrebljavati utf8_general_ci ili aplicirati patch za verziju 5.1.

2.3. Mehanizmi za pohranu

MySQL može svaku tablicu u bazi pohranjivati u jednom od više mehanizama za pohranu. Svaki ime

prednosti i mana koje se moraju znati prilikom stvaranja pojedine tablice. Ovdje ćemo dati pregled

najvažnijih mehanizama.

MyISAM

Primarni tip mehanizma za pohranu. Preferirani mehanizam za ne transakcijske tablice. Vrlo brz za

dodavanje novih podataka i čitanje postojećih. Podržava stvaranje i upotrebu puno tekstnih indeksa

koji se upotrebljavaju za pretraživanje velikih količina tekstova. Ne podržava stvaranje stranih

ključeva nad atributima tablice.

InnoDB

Preferirani mehanizam za transakcijske tablice. Vrlo brz za izmjenu postojećih podataka i optimiziran

za rad sa vrlo velikom količinom podataka. Omogućava definiranje stranih ključeva nad atributima

tablica. Nažalost ne podržava stvaranje i upotrebu puno tekstnih indeksa

Memory

Ukratko isti kao i MyISAM ali postoji samo u radnoj memoriji računala. Ako se računalo ugasi ili

ponestane radne memorije podaci u tablici će se izgubiti. Ovaj tip tablica je posebno brz ali i

nesiguran te se koristi isključivo privremeno dok se ne obavi neka zahtjevnija operacija. Ponekad ih

MySQL server stvori sam u izvršavanju kompleksnoga query-a.

14

Page 15: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

2.4. Rad sa MySQL-om iz komandne linije

Sa MySQL serverom se radi koristeći neki klijent. To su aplikacije koje se spoje na server i uz pomoć

kojih možemo izdavati naredbe serveru i koristi ga.

Za rad sa MySQL-om postoje mnogi klijenti ali najosnovniji je komando linijski koji dolazi sa

instalacijom MySQL servera.

Za početak je potrebno otići u bin podmapu mape di je instaliran MySQL server.

Nakon toga je potrebno napisati:

mysql je ime komandno linijskog programa kojeg ćemo koristiti za rad sa MySQL serverom.

-u je opcija koja određuje korisnika MySQL servera sa kojim ćemo se spojiti na server, -u slijedi

razmak i ime tog korisnika

-p je opcija koju je potrebno postaviti ako se spajamo sa korisnikom koji ima postavljenu zaporku

Slijedi razmak pa ime baze podataka koju ćemo koristiti.

Nakon što se stisne tipka Enter, MySQL komandno linijski program će nas pitati za zaporku koju

unesemo i stisnemo tipku Enter.

Sljedeća slika prikazuje spajanje na bazu podataka po imenu test koristeći root korisnika baze:

Time smo ušli u MySQL komandnu liniju.

Sve linije moraju završiti sa ; da bi bile izvršene. To omogućava pisanje naredbi kroz nekoliko redova.

Za početak je dobro vidjeti sadržaj pomoći naredbom help:

15

mysql -u ime_korisnika -p ime_baze_podataka

Page 16: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

Osim navedenih mogu se izvršavati sve SQL naredbe koje MySQL podržava.

Naredbe koje rezultiraju vraćanjem recordset-a (tablice zapisa) će imati ovakav rezultat:

Naredbe koje ne vraćaju recordset će vratiti broj promjenjenih ili dodanih zapisa na koje su utjecali.

Iz programa se izlazi sa exit naredbom.

Često obavljana zadaća je izrada backup kopije baze podataka te njen eventualni povratak iz prije

napravljene backup kopije.

Backup kopija baze se radi sa komandno linijskim programom mysqldump.

Primjer:

16

Page 17: Netakadmija m4 Mysql

PHP i MySQL tečaj 2. MySQL osnove

Backup datotekama se obično daje ekstenzija sql pošto su one ustvari tekstualne datoteke koje

sadrže SQL naredbe.

Povratak kopije baze podatak iz backup datoteke se vrši komandno linijskim programom mysql

kojem se kao ulazni parametar da putanja backup datoteke.

Primjer:

17

mysqldump -u ime_korisnika -p ime_baze_podataka > putanja_datoteke

mysql -u ime_korisnika -p ime_baze_podataka < putanja_datoteke

Page 18: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3. Osnove SQL-aSQL je kratica od Structured Query Language i to je kao što ime kaže strukturirani jezik za upravljanje

bazom podataka.

Pojedinačna naredba izvršena nad bazom podatak se zove query.

Nekoć su baze podataka imale svoje jezike koji su omogućavali rad sa njima. Međutim to je

onemogućavalo portabilnost aplikacija između baza podataka. Jednom kada bi aplikacija radila sa

jednom bazom zauvijek je morala radit sa njom. Također baze nisu mogle izvršavati naredbe i

programe pisane za drugu bazu.

To razdoblje je završilo standardizacijom SQL kao jezika za rad sa relacijskim bazama podataka.

Iako je jezik standardiziran, baze ga ipak drugačije upotrebljavaju i postoje male specifičnosti za

svaku bazu. Ali baza jezika je ista i funkcionira na svim bazama koje ga podržavaju. Mi ćemo raditi na

MySQL bazi i baviti se njegovom upotrebom SQL jezika.

Bitno za napomenuti je da svaka SQL naredba završava sa znakom kraja querya koji je primarno

postavljen na ;

Naredbe SQL se dijele po svrsi postojanja na:

1. Definicija podataka

1. CREATE

2. DROP

3. ALTER

2. Manipulacija i pretraga nad podacima

1. SELECT

2. INSERT

3. UPDATE

4. DELETE

5. TRUNCATE

3. Kontrola prava korisnika baze podataka

1. GRANT

18

Page 19: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

2. REVOKE

4. Kontrola transakcija

1. START TRANSACTION

2. COMMIT

3. ROLLBACK

5. Pomoćne naredbe

1. USE

2. SET

3. DESCRIBE

4. EXPLAIN

5. SHOW

19

U ovom priručniku su navedene i u grubo opisane samo najvažnije SQL naredbe.

Obavezno pročitati poglavlje "SQL Statement Syntax " posljednje stabilne verzije

MySQL manual-a.

( http://dev.mysql.com/doc/refman/5.5/en/create-table.html )

Page 20: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3.1. CREATE

Naredba za stvaranje. Mi ćemo stvarati baze podataka i tablice.

Ovisno o tome što se stvara naredba create poprima druga obilježja tako da može točno opisati to

što se stvara.

CREATE DATABASE – stvara bazu podataka

Sintaksa naredbe tada izgleda ovakvo:

Za tumačenje sintakse SQL naredbe pogledati Prilog A: SQL sintaksa MySQL manula.

Ako se ne navede character set i collate uzima se onaj postavljen u postavkama MySQL servera.

Primjer:

20

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

[create_specification] ...

create_specification:

[DEFAULT] CHARACTER SET [=] charset_name

| [DEFAULT] COLLATE [=] collation_name

CREATE DATABASE testna_aplikacija CHARACTER SET utf8 COLLATE utf8_general_ci;

Page 21: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

CREATE TABLE – stvara tablicu

Sintaksa naredbe izgleda ovakvo:

ili

ili

Prva opcija stvara praznu tablica po danoj definiciji.

Druga radi isto ali odmah nakon stvaranja puni tablicu rezultatima vraćenih u select query-u

(naredba za pretraživanje baze podatak).

Treća stvara tablicu iste strukture ali drugog imena kao navedena postojeća tablica.

create_definition je dio create table query-a u kojem se definira od čega se sve tablica sastoji

primarno polja, njihov tip i opcije te indexi.

table_options je dio create table query-a u kojem se definiraju opcije za tablicu kao što su character

set i collate tablice, mehanizam za pohranu tablice itd.

Sintaksa create_definition i table_options djela create table naredbe je prevelika i preopsežna da bi

stala u ovaj priručnik.

21

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

(create_definition,...)

[table_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

[(create_definition,...)]

[table_options]

select_statement

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

{ LIKE old_tbl_name | (LIKE old_tbl_name) }

Page 22: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

Primjer:

22

Obavezno pogledati create table sintaksu u MySQL manualu posljednje stabilne

verzije MySQL-a. ( http://dev.mysql.com/doc/refman/5.5/en/create-table.html )

CREATE TABLE users (

id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,

name varchar(50),

lastname varchar(50),

username varchar(100) NOT NULL,

password varchar(100) NOT NULL,

about text,

created tinyint(1) UNSIGNED NOT NULL,

modified tinyint(1) UNSIGNED NOT NULL,

PRIMARY KEY (id),

UNIQUE KEY username_key (username)

) ENGINE=InnoDB DEFAULT CHARSET=latin2 COLLATE=latin2_croatian_ci;

Page 23: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3.2. DROP

Drop je naredba koja obavlja suprotnu zadaću od naredbe create.

DROP DATABASE – briše bazu podataka

I sve sve tablice u njoj.

Sintaksa:

DROP TABLE – briše tablicu

Sintaksa:

RESTRICT i CASCADE opcije ne rade ništa i postoje radi kompatibilnosti sa drugim bazama podataka.

DROP USER – briše korisnika baze podataka

Sintaksa:

Ova naredba će obrisati korisnika i sva njegova prava (pogledati naredbu GRANT).

23

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

DROP [TEMPORARY] TABLE [IF EXISTS]

tbl_name [, tbl_name] ...

[RESTRICT | CASCADE]

DROP USER user [, user] ...

Page 24: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3.3. ALTER

Alter SQL naredba služi za izmjenu već stvorenih objekata kao što su baza podataka ili tablica unutar

baze.

ALTER DATABASE – može promijeniti postavljeni character set ili poredak abecede baze podataka.

ALTER TABLE – može dodati, oduzeti ili promijeniti bilo koji dio tablice. Npr. dodati polje, maknuti

polje, dodati ključ itd.

24

ALTER {DATABASE | SCHEMA} [db_name]

alter_specification ...

alter_specification:

[DEFAULT] CHARACTER SET [=] charset_name

| [DEFAULT] COLLATE [=] collation_name

ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name

alter_specification [, alter_specification]

alter_specification:

table_options

| ADD [COLUMN] col_name column_definition

[FIRST | AFTER col_name ]

| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

index_col_name:

col_name [(length)] [ASC | DESC]

index_type:

USING {BTREE | HASH | RTREE}

index_option:

KEY_BLOCK_SIZE [=] value

| index_type

| WITH PARSER parser_name

table_options:

table_option [[,] table_option] ...

Page 25: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3.4. SELECT

Select je sql naredba za dohvat tj. pretraživanje podataka iz baze podataka.

Ovo je vjerojatno najupotrebljavanija SQL naredba.

Najlakše ju je podijeliti na nekoliko segmenata:

1. SELECT dio odmah iza SELECT ključne riječi i mogućih dodatnih opcija. Ovaj dio je listanje svih polja

koja se želi dohvatiti.

Npr. "SELECT 1, 2, 3, 4, 5;" će dohvatiti brojeve od 1 do 5.

25

SELECT

[ALL | DISTINCT | DISTINCTROW ]

[HIGH_PRIORITY]

[STRAIGHT_JOIN]

[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]

[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]

select_expr [, select_expr ...]

[FROM table_references

[WHERE where_condition]

[GROUP BY {col_name | expr | position}

[ASC | DESC], ... [WITH ROLLUP]]

[HAVING where_condition]

[ORDER BY {col_name | expr | position}

[ASC | DESC], ...]

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

[PROCEDURE procedure_name(argument_list)]

[INTO OUTFILE 'file_name'

[CHARACTER SET charset_name]

export_options

| INTO DUMPFILE 'file_name'

| INTO var_name [, var_name]]

[FOR UPDATE | LOCK IN SHARE MODE]]

Page 26: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

Select naredba sve podatke dohvaća kao tablicu. U ovom slučaju rezultat ove select naredbe će biti

jedan redak sa pet ćelija

2. FROM dio koji može slijediti sadrži popis tablica iz kojih se podaci uzimaju i može opisivati kako su

podaci u njima spojeni ali o tome više kasnije.

Npr. "SELECT ime, prezime FROM tablica_osobe;" će dohvatiti imena i prezimena svih osobi iz tablice

po imenu "tablica_osobe".

3. WHERE dio koji može slijediti FROM dio sadrži uvjete po kojima se podaci pretražuju.

Npr. "SELECT ime, prezime FROM tablica_osobe WHERE grad='Karlovac';" će dohvatiti imena i

prezimena svih osoba koje žive u Karlovcu.

4. GROUP BY dio koji može slijediti WHERE sadrži uvjete po kojima se podaci trebaju grupirati.

Npr. "SELECT grad, COUNT(broj_osobe) as broj_osoba_u_gradu FROM tablica_osobe GROUP BY

grad;" će dohvatiti sve gradove i broj ljudi koji je u njima a njihovi podaci se nalaze u našoj tablici.

5. HAVING je isto kao i WHERE blok osim u jednoj vrlo bitnoj činjenici. HAVING će iz filtrirati već

dohvaćene rezultate prije slanja korisniku a nakon dohvata iz tablica tako da baza podatka ne

optimizira uvjete koji su postavljeni u ovom bloku za razliku od WHERE bloka.

6. ORDER BY određuje kako će se dohvaćeni podaci posložiti. Ključna riječ na kraju određuje dali je

poredak rastući (ASC) ili padajući (DESC).

Npr. "SELECT ime, prezime FROM tablica_osobe ORDER BY prezime ASC, ime ASC;" će dohvatiti sva

imena i prezimena ljudi iz tablice tablica_osoba poredanih po prezimenu a zatim po imenu (dvije

osobe sa istim prezimenom će biti poredane po imenu).

7. LIMIT određuje koliko će se redova maksimalno dohvatiti. LIMIT blok je MySQL dodatak u

standard SQL i ne postoji u većini drugih baza podatak. Radi u dva načina. U prvom je naveden samo

jedan broj npr. "SELECT ime, prezime FROM tablica_osobe ORDER BY prezime ASC LIMIT 10;" će

dohvatiti prvih 10 imena i prezimena iz tablice tablica_osobe poredanih po prezimenu.

U drugom načinu su prisutna dva broja npr. "SELECT ime, prezime FROM tablica_osobe ORDER BY

26

Page 27: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

prezime ASC LIMIT 10, 5;" će dohvatiti 5 imena i prezimena poredanih po prezimenu odmaknutih od

početka rezultata za 10 redaka. Znači redove od 10 do 15. Redovi rezultata se broje počevši od 0.

Način kad se navede jedan broj je ubiti kao da se navelo od retka 0 tj. "LIMIT 0, 10".

3.5. INSERT

Insert je naredba za upis novih sadržaja u tablicu.

Sintaksa naredbe izgleda ovakvo:

ili

ili

27

Za ostale opcije (i dublje poznavanje postojećih) SELECT naredbe pogledati

posljednju stabilnu verziju MySQL priručnika. ( http://dev.mysql.com/doc/refman/5.5/en/create-table.html )

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

{VALUES | VALUE} ({expr | DEFAULT},...),(...),...

[ ON DUPLICATE KEY UPDATE

col_name=expr

[, col_name=expr] ... ]

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

SET col_name={expr | DEFAULT}, ...

[ ON DUPLICATE KEY UPDATE

col_name=expr

[, col_name=expr] ... ]

Page 28: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

Prvi oblik je SQL standard, drugi je MySQL specifičan dok se treći upotrebljava da se tablica napuni

podacima već prisutnima u drugim tablicama.

Primjer:

3.6. UPDATE

Naredba za mijenjanje već postojećih podataka u tablicama.

Sintaksa:

ili za slučaj mijenjanja podataka u više tablica

28

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

SELECT ...

[ ON DUPLICATE KEY UPDATE

col_name=expr

[, col_name=expr] ... ]

INSERT INTO tablica_osoba (ime, prezime, grad) VALUES ('Iva', 'Ivić', 'Zagreb'), ('Joža', 'Horvat',

'Osijek');

UPDATE [LOW_PRIORITY] [IGNORE] table_reference

SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

UPDATE [LOW_PRIORITY] [IGNORE] table_references

SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

[WHERE where_condition]

Page 29: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

Update naredba će promijeniti sve podatke koji zadovoljavaju WHERE uvjet ako on nije prisutan

promjena će se desiti na svim podacima u tablici!

Primjer:

3.7. DELETE

Naredba za brisanje podataka iz tablica.

Sintaksa:

ili za slučaj brisanja podataka u više tablica:

ili

Delete naredba će izbrisati sve zapise (retke) koji zadovoljavaju WHERE uvjet. Ako WHERE nije

prisutan izbrisat će se svi zapisi (redci)!

29

UPDATE tablica_osobe SET ime='Vedran' WHERE id_osobe=3;

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

tbl_name[.*] [, tbl_name[.*]] ...

FROM table_references

[WHERE where_condition]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]

FROM tbl_name[.*] [, tbl_name[.*]] ...

USING table_references

[WHERE where_condition]

Page 30: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

Primjer:

3.8. TRUNCATE

Truncate je naredba za brisanje svih podataka u tablici. Tu zadaću obavlja bolje od delete naredbe

zato jer ju MySQL interno izvrši tako da tablicu izbriše iz baze podataka i ponovno stvori u jednom

koraku, radi čega je izvršavanje ove naredbe puno brže.

Sintaksa:

Primjer:

3.9. GRANT

Grant je naredba za kreiranje i davanje dozvola korisnicima baze podataka.

MySQL server nudi veliku kontrolu nad pravima koje pojedini korisnici mogu raditi. Prava se dijele po

opsežnosti, postoje prava na administraciju cijelog servera, npr. brisanje log datoteka.

Prava nad bazama podataka. Prava nad tablicama. Prava nad pojedinim kolonama u pojedinoj tablici.

Prava se mogu dodjeljivati i oduzimati. Osim za slučaj root korisnika. To je korisnik koji koristi glavni

administrator MySQL servera i on ima prava na sve. Njega se koristi da bi se stvorilo nove korisnike ili

da bi se nešto popravilo ako dođe do greške u radu servera.

Sa novom instalacijom MySQL servera dođe root korisnik koji nema postavljenu zaporku. Ako se radi

o serveru koji će biti javno dostupan na web-u, obavezno postaviti zaporku!

Sintaksa grant naredbe je prevelika i preopširna da bi stala u ovaj priručnik.

30

DELETE FROM tablica_osobe WHERE id_osobe=3;

TRUNCATE [TABLE] tbl_name

TRUNCATE tablica_osobe;

Page 31: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

Primjer:

će kreirati korisnika proba_korisnik koji im prava izvršavati naredbe select, insert, update i delete

nad svim tablicama baze podataka test te mu je zaporka za ulaz na MySQL server zaporka123.

3.10. REVOKE

Suprotna naredba od naredbe grant. Briše prava korisnika.

Sintaksa:

Primjer:

će maknuti pravo na izvršavanje naredbe insert nad tablicama test baze korisniku proba_korisnik.

31

Obavezno pogledati grant sintaksu u MySQL manualu posljednje stabilne verzije

MySQL-a. ( http://dev.mysql.com/doc/refman/5.5/en/grant.html )

GRANT SELECT, INSERT, UPDATE, DELETE ON test.* TO 'proba_korisnik'@'localhost' IDENTIFIED

BY 'zaporka123';

REVOKE

priv_type [(column_list)]

[, priv_type [(column_list)]] ...

ON [object_type] priv_level

FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION

FROM user [, user] ...

REVOKE INSERT ON test.* FROM 'proba_korisnik'@'localhost';

Page 32: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3.11. START TRANSACTION, COMMIT, ROLLBACK

START TRANSACTION je naredba za započinjanje transakcije.

Transakcija je izolirani slijed SQL naredbi koje se moraju izvršiti zajedno. Npr. čin kupovine u web

trgovini bi se mogao sastojati od sljedećeg slijeda naredbi:

1. Izvrši se smanjivanje broja raspoloživih proizvoda na skladištu svih odabranih artikala

(UPDATE).

2. Pokušati naplatiti korisniku narudžbu od banke.

3. Zapisati da je narudžba naplaćena i da se može dostaviti (UPDATE i INSERT).

Sve ove naredbe i provjere se moraju izvršiti kao jedna naredba na bazi. Ako u bilo kojem trenutku

dođe do greške ili neka provjera ne uspije sve prethodno izvršene naredbe se trebaju premotati tj.

ono što su one učinile nad podacima (dodali nove podatke, izbrisali postojeće ili ih izmijenili) treba

biti poništeno.

Transakcije to omogućavaju.

Nakon što transakcija starta MySQL vodi računa o svom promjenama koje svaka pojedina naredba

unutar transakcije radi po bazi podataka. Ako nešto pođe po krivu transakcije se poništava sa

naredbom ROLLBACK koja poništi djelovanje svih prethodno izvršenih naredbi koje su izvršene od

početka izvršavanja transakcije kao da ona nikada nije postojala. Ako se sve naredbe koje čine

transakciju uspješno izvrše njihove promjene nad podacima u bazi postaju trajne naredbom

COMMIT čime transakcija prestaje postojati.

Sintaksa:

3.12. USE

Naredba koja definiran sa kojom bazom podataka ćemo raditi. MySQL server sadrži mnogo baza

podataka i da bi se radilo sa određenom bazom prvo se sa njom moramo povezati. Ova je naredba sa

kojom to činimo.

32

START TRANSACTION [WITH CONSISTENT SNAPSHOT] | BEGIN [WORK]

COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]

Page 33: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

Sintaksa:

3.13. SET

Je naredba za mijenjanje serverskih i klijentskih postavki.

Sintaksa:

Mi ćemo je najviše koristi za postavljenje character set veze našeg klijenta iz PHP aplikacije sa MySQL

serverom npr.:

koji postavlja charcter set veze sa bazom podataka na utf8 i omogućava ispravno prenošenje

hrvatskih znakova.

33

USE db_name

SET variable_assignment [, variable_assignment] ...

variable_assignment:

user_var_name = expr

| [GLOBAL | SESSION] system_var_name = expr

| [@@global. | @@session. | @@]system_var_name = expr

SET NAMES 'utf8';

Page 34: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3.14. DESCRIBE

Naredba za opisivanje tablice.

Sintaksa:

Primjer:

3.15. EXPLAIN

Naredba za optimizaciju izvršavanja upita na bazu. Omogućava uvid u interno izvršavanje pojedinog

upita nad bazom. Radi samo sa SELECT naredbom, ako se želi optimizirati neka druga vrsta upita prvo

je treba pretvoriti u select.

Sintaksa:

Detaljnije o ovoj naredbi potražite u poglavlju o indeksima.

34

{DESCRIBE | DESC} tbl_name [col_name | wild]

mysql> DESCRIBE City;+------------+----------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+------------+----------+------+-----+---------+----------------+| Id | int(11) | NO | PRI | NULL | auto_increment || Name | char(35) | NO | | | || Country | char(3) | NO | UNI | | || District | char(20) | YES | MUL | | || Population | int(11) | NO | | 0 | |+------------+----------+------+-----+---------+----------------+5 rows in set (0.00 sec)

EXPLAIN [EXTENDED | PARTITIONS] SELECT select_options

Page 35: Netakadmija m4 Mysql

PHP i MySQL tečaj 3. Osnove SQL-a

3.16. SHOW

Generalna naredba za prikaz. Show može prikazati koje sve baze postoje na serveru, koje sve tablice

postoje u pojedinoj bazi podataka, korisnike itd. Za potpunu listu pogledati mysql manual posljednje

stabilne verzije MySQL-a.

Primjeri:

će prikazati sve baze podataka koje postoje na server a koje trenutni korisnik može vidjeti.

će prikazati sve tablice u trenutnoj bazi podataka.

35

SHOW DATABASES;

SHOW TABLES;

Page 36: Netakadmija m4 Mysql

PHP i MySQL tečaj 4. Funkcije MySQL-a

4. Funkcije MySQL-aOvdje će biti pregled vrlo malog broja češće upotrebljavanih funkcija. Kompletan popis sa primjerima

upotrebe se može naći u MySQL manualu, poglavlje 11.

4.1. Agregatne funkcije

Agregatne funkcije se moraju koriste zajedno sa GROUP BY djelom query-a .

AVG – daje prosjek numeričkih vrijednosti svih dobivenih zapisa. Npr.

će vratiti popis svih studenata i prosjek njihovih ocjena. Grupiranje ocjena se vrši prema nazivu

studenta.

COUNT – daje broj zapisa, može se koristiti i bez GROUP BY djela. Npr.

će vratiti popis studenta i broj ispita koji su položili.

će vratiti broj zapisa u tablici student.

Ako se koristi MyISAM tip tablice taj podatak je zapisan i brzo dohvatljiv te MySQL ne treba brojati

sve zapise tablice. Dok se kod npr. InnoDB tipa brojanje treba izvršiti jer njegove mogućnosti

transakcija onemogućavaju da se u svakom trenutku zna broj zapisa u tablici.

MAX / MIN – dohvat maksimalne odnosno minimalne vrijednosti. Npr.

će vratiti popis svih studenta sa dobivenom najmanjom i najvećim ocjenom pojedinog studenta.

36

SELECT student_name, AVG(test_score) FROM student GROUP BY student_name;

SELECT student_name, COUNT(test_score) FROM student GROUP BY student_name;

SELECT COUNT(*) FROM student;

SELECT student_name, MIN(test_score), MAX(test_score) FROM student GROUP BY student_name;

Page 37: Netakadmija m4 Mysql

PHP i MySQL tečaj 4. Funkcije MySQL-a

4.2. String funkcije

CONCAT – Spaja više stringova u jedan. Npr.

će rezultirati sa ispisom riječi MySQL.

LIKE – već spominjani operator LIKE je u biti string funkcija koja vraća sve zapise koji sadrže tekst.

Npr.

Znak % označava bilo koji znak, 0 ili više, dok znak _ označava točno 1 bilo koji znak.

4.3. Numeričke funkcije

ABS – Vraća apsolutnu vrijednost broja.

CEILING – Zaokružuje decimalan broj na veći cijeli. Npr.

će vratiti 2.

FLOOR – Zaokružuje decimalni broj na manji cijeli. Npr.

će vratiti -2.

RAND – Vraća slučajni decimalni broj između 0 i 1.

ROUND – Zaokružuje decimalni broj na proizvoljnu decimalu. Npr.

će vratiti 1.55.

37

SELECT CONCAT('My', 'S', 'QL');

SELECT 'abcdef..' LIKE 'ABC%';

SELECT CEILING(1.23);

SELECT FLOOR(-1.23);

SELECT ROUND(1.548, 2);

Page 38: Netakadmija m4 Mysql

PHP i MySQL tečaj 4. Funkcije MySQL-a

Ako se pozove bez drugog parametra, podrazumijeva se 0 i decimalni broj će biti zaokružen na

najbliži cijeli broj.

4.4. Funkcije datuma i vremena

DATE_FORMAT – Vraća datum formatiran po naši potrebama. Npr.

će vratiti: 04.10.1997. 22:23

Funkcija kao što je vidljivo prima 2 parametra. Prvi je datum tj. vrijeme, drugi je string instrukcija koja

određuje format. Moguće vrijednosti modifikatora su:

Modifikator Značenje%a Skraćeni dan u tjednu (Sun..Sat)%b Skraćeno ime mjeseca (Jan..Dec)%c Mjesec, numerički (0..12)%D Dan u mjesecu sa engleskim sufiksom (0th, 1st, 2nd, 3rd, …)%d Dan u mjesecu, numerički (00..31)%e Dan u mjesecu, numerički (0..31)%f Mikrosekunde (000000..999999)%H Sati (00..23)%h Sati (01..12)%I Sati (01..12)%i Minute (00..59)%j Dan u godini (001..366)%k Sati (0..23)%l Sati (1..12)%M Ime mjeseca (January..December)%m Mjesec (00..12)%p AM ili PM%r Vrijeme, 12 satni format (hh:mm:ss slijedi AM ili PM)%S Sekunde (00..59)%s Sekunde (00..59)%T Vrijeme, 24 satni format (hh:mm:ss)%U Tjedan (00..53), nedjelja se zima kao prvi dan tjedna%u Tjedan (00..53), ponedjeljak se uzima kao prvi dan tjedna%V Tjedan (01..53), nedjelja prvi dan u tjednu; koristi se sa %X%v Tjedan (01..53), ponedjeljak je prvi dan tjedna; koristi se sa %x%W Naziv dana u tjednu (Sunday..Saturday)%w Dan u tjednu, numerički (0=nedjelja.6=subota)%X Godina u kojoj tjedan počine sa nedjeljom, koristi se sa %V%x Godina u kojoj tjedan počinje sa ponedjeljkom, koristi se sa %v

38

SELECT DATE_FORMAT('1997-10-04 22:23:00', '%d.%m.%Y. %H:%i');

Page 39: Netakadmija m4 Mysql

PHP i MySQL tečaj 4. Funkcije MySQL-a

%Y Godina, 4 znamenke%y Godina, 2 znamenke%% Znak %%x x, za svaki „x“ koji nije naveden, čisto format

CURDATE – Vraća trenutni datum u 'YYYY-MM-DD' ili YYYYMMDD formatu ovisno o tome dali se

upotrijebila u string kontekstu ili integer.

će vratiti današnji datum npr. 2008-05-30.

CURTIME – Vraća trenutno vrijeme u 'HH:MM:SS' ili HHMMSS.uuuuuu formatu, ovisno o tome dali

se upotrijebila u string ili integer kontekstu.

će vratiti trenutno vrijeme npr. 23:12:44

NOW – Vraća trenutni datum i vrijeme (broj sekundi protekao od 1.1.1970) u 'YYYY-MM-DD

HH:MM:SS' ili YYYYMMDDHHMMSS.uuuuuu formatu ovisno o tome dali se upotrijebila u string ili

integer kontekstu.

će vratiti trenutni datum i vrijeme npr. 2008-05-30 23:16:14.

UNIX_TIMESTAMP – Vraća Unix timestamp, broj sekundi protekao od početka Unix epohe, 1.1.1970.

Kao prvi parametar prima datum i vrijeme, ako nije naveden uzima se trenutno.

će vratiti 1196440219

39

SELECT CURDATE();

SELECT CURTIME();

SELECT NOW();

SELECT UNIX_TIMESTAMP('2007-11-30 10:30:19');

Page 40: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

5. Proces dizajniranja baze podatakaPostoji 5 glavnih koraka u procesu dizajniranja baze podataka:

1. Identificirati entitete i njihove veze.

2. Identificirati potrebne podatke.

3. Normalizirati podatke.

4. Napraviti bazu podataka u odgovarajućem softwareu.

5. Provjeriti dizajn.

Iako se koraci u procesu dizajniranja isprepliću te su neki ne zamjetni ovih 5 točaka postoji i svaki se

proces dizajniranja baze može na njih razložiti.

5.1. Identificirati entitete i njihove veze

Da bi se identificirali entiteti i njihove veze može se koristiti školski pristup koji se sastoji od 5 koraka:

1. Definirati aktivnosti visokog nivoa. Što znači identificirati generalne aktivnosti za koje će se

baze podataka koristiti npr. pratiti se informacije o zaposlenima.

2. Identificirati entitete. Za listu generalnih aktivnosti identificirati područja subjekata čije se

informacije prate. Ti subjekti će postati entiteti.

3. Identificirati relacije. Pogledati listu aktivnosti i odrediti veze između entiteta. Definirati dvije

uloge koje opisuju tu relaciju.

4. Razložiti aktivnosti. Aktivnosti visokog nivoa je sad potrebno detaljnije promotriti i pokušati

razdijeliti na aktivnosti nižeg nivoa. Npr. praćenje informacija o zaposleniku se može razložiti

na :

1. Dodavanje novog zaposlenika

2. Promjena podataka zaposlenika

3. Brisanje zaposlenika

5. Identificirati pravila poslovanja. Potrebno je pregledati pravila poslovanja i vidjeti koja

pravila se mogu upotrijebiti u bazi podataka. Npr. pravilo poslovanja može propisati da svaki

odjel može imati samo jednog voditelja. Takva pravila se ugrade u strukturu baze podataka.

Treba međutim biti oprezan da se ne ugrade prerestriktivna pravila zato jer se poslovan

logika često mijenja a bazu podataka je teže izmijeniti od aplikacije. Tako da je nekad mudrije

40

Page 41: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

programski izvesti ograničenja u poslovnoj logici i bazu pritom ostaviti u lošijoj poziciji tako da

se promjene unutar poslovne logike mogu lakše provesti kroz rad aplikacije.

Primjer:

Čačkalica je kompanija sa uredima na 5 lokacija. Sastoji se od 75 zaposlenika koji rade u 3 odjela.

Odjel za upravljanje ljudskim resursima je identificirao 60 osobina koji su važni firmi prilikom

zapošljavanja novih zaposlenika. Potrebno je napraviti sustav baze podataka koji će pratiti

informacije o navedenim strukturama i procesima unutar tvrtke.

5.1.1. Aktivnosti visokog nivoa

Možemo popisati sljedeće aktivnosti visokog nivoa:

• Zapošljavanje zaposlenika

• Otpuštanje zaposlenika

• Praćenje osobnih informacija o zaposlenima

• Praćenje informacija o osobinama zaposlenika potrebnih tvrtci

• Praćenje koje osobine ima koji zaposlenik

• Praćenje informacija o odjelima

• Praćenje informacija o uredima

41

Page 42: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

5.1.2. Identificiranje entiteta

Identificiranje entiteta se radi tako da se u listi aktivnosti visokog nivoa popiše sve imenice i pretvori

u jedninu.

Tako možemo definirati sljedeće entitete:

• Zaposlenik

• Osobina

• Odjel

• Ured

5.1.3. Identificirati relacije

Sve entitete je potrebno staviti na graf i povezati međusobno ovisne entitete:

Veze se prilikom izrade grafa raspišu:

Pojedini odjel se nalazi u jednom ili više ureda, svaki ured može sadržavati jedan ili više odjela.

Svaki zaposlenik je zaposlen u jednom odjelu i u jednom uredu. Ured i odjel mogu imati jednoga ili

više zaposlenika.

Svaki zaposlenik ima neograničeni broj osobina. Svaka osobina može biti prisutna kod više

zaposlenika.

42

Page 43: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

Sada se broj pojedinog entiteta u vezi može nadodati na graf:

Sa + smo označili da drugi entitet u vezi ima ovog (kraj kojeg je +) u više mogućih veza npr. Odjel

sadrži jednog ili više zaposlenika.

Sa 1 smo označili da drugi entitet u vezi ima ovoga (kraj kojeg je 1) u jedno mogućoj vezi npr.

Zaposlenik može pripadati samo jednom odjelu.

Ove informacije će nam koristiti kasnije prilikom stvaranja tablica baze podataka.

5.1.4. Razlaganje aktivnosti

Svaku od aktivnosti visokog nivoa se sada razlomi na pod aktivnosti.

Zapošljavanje zaposlenika

1. Upis zaposlenika u bazu podataka

2. Dodjeljivanje zaposlenika uredu

3. Dodjeljivanje zaposlenika odjelu

4. Upis osobina zaposlenika

Otpuštanje zaposlenika

1. Brisanje zaposlenika iz baze podataka

2. Brisanje veze zaposlenika sa odjelom

43

Page 44: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

3. Brisanje veze zaposlenika sa ureom

4. Brisanje osobina zaposlenika

Praćenje osobnih informacija o zaposlenima

1. Izlist podataka zaposlenika

2. Promjena podataka zaposlenika

3. Promjena njegovih osobina

4. Promjena ureda u kojem radi

5. Promjena odjela u kojem radi

Praćenje informacija o osobinama zaposlenika potrebnih tvrtci

1. Upis nove osobine

2. Brisanje osobine

3. Bodovanje osobine

4. Pretraživanje za osobama koje sadrže osobinu

Praćenje koje osobine ima koji zaposlenik

1. Izlist svih osobina zaposlenika

2. Upis osobine zaposlenika

3. Brisanje osobine zaposlenika

Praćenje informacija o odjelima

1. Upis novog odjela

2. Promjena podataka postojećeg odjela

3. Brisanje odjela

4. Izlist svih zaposlenika u odjelu

44

Page 45: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

Praćenje informacija o uredima

1. Unos novog ureda

2. Promjena podataka postojećeg ureda

3. Brisanje ureda

4. Izlist svih zaposlenika u uredu

5. Izlist svih odjela u uredu

6. Upis svih odjela koje postoje u uredu

7. Brisanje odjela iz ureda

Nakon razlomljavanja aktivnosti na manje treba pogledati da li postoji još neki entitet ili se neki može maknuti te dali sve veze između entiteta zadovoljavaju nove bolje razrađene informacije.

5.1.5. Identifikacija pravila poslovanja

U ovom koraku treba proći kroz sva pravila poslovanja koja postoje u tvrtci za koju radimo aplikaciju a koja nas se tiču te razmisliti dali neko utječe na našu buduću bazu podataka. Ako npr. nađemo pravilo koje određuje da postoji vrsta zaposlenika koji je zaposlen u više odjela onda naša veza između tih entiteta mora biti promijenjena.

5.2. Identifikacija potrebnih podataka

Za svaki od entiteta popišemo podatke koje o njima moram pratiti.

Zaposlenik:

• ime

• prezime

• adresa

• grad

• broj telefona

• u kojem uredu radi

45

Page 46: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

• u kojem odjelu radi

• koje osobine posjeduje

Odjel:

• naziv

• u kojim se uredima nalazi

• broj zaposlenika u odjelu

Ured:

• naziv

• adresa

• koje odjele sadržava

• koji zaposlenici u njemu rade

Osobina:

• naziv

• prioritet za firmu

• zaposlenici koje ga imaju

46

Page 47: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

5.3. Normalizacija podataka

Jednom kada znamo koje sve podatke trebamo spremati potrebno je razmisliti o tome gdje se koji podatak treba spremiti tako da bude što lakše promjenjiv, da zauzima što manje prostora, da ga je lagano moguće dohvatiti uz pomoć query-a. Razmišljanje o svemu tome se zove normalizacija podataka.

Normalizacija je pristup izradi baze podataka čiji će dizajn biti optimiziran za izvršavanje generalnih query-a nad bazom i koji će umanjivati mogućnost dobivanja anomalija u podacima baze podataka.

Normalizacija baze podatak je podijeljena na stupnjeve, zasada je poznato osam stupnjeva od kojih su nama važna tri: Prva normalna forma, druga normalna forma i treća normalna forma.

Prva normalna forma ima dva koraka:

• Eliminirati duplikate kolona u istoj tablici

• Definirati unikatni podataka za svaki zapis u tablici, primarni ključ.

Idemo vidjeti kako to izgleda na primjeru.

Uzmimo da idemo kreirati bazu podatka u kojoj će se pohranjivati informacije o zaposlenima. Tvrtka za koju radimo bazu podataka je definirala da svaki zaposleni ima jednog nadređenoga koji ispod sebe može imati nekoliko podređenih zaposlenika.

Sa takvim zahtjevima bi mogli složiti ovakvu tablicu u bazi podataka:

Nadređeni Podređeni 1 Podređeni 2 Podređeni 3 Podređeni 4

Ivan Ivica Joža Ana Kristijan

Anita Luka Stjepan Kristina Igor

Ova tablica ima nekoliko problema, prvi je dupliciranost kolona, kolone "Podređeni 1", "Podređeni

2", "Podređeni 3" i "Podređeni 4" su duplikati, sadrže podatke iste vrste. Drugi problem je

mogućnost da određeni nadređeni nema 4 podređene nego manje, npr. jednoga. U tom slučaju će

tablica sadržavati 3 prazna mjesta koji ne sadrže podatke ali zauzimaju prostor. Treći problem je

mogućnost da Ivan npr. dobije 5. podređenog, taj podatak se nema gdje zapisati i tablica se mora

modificirat.

Jedno od mogućih rješenja je stvoriti ovakvu tablicu:

Nadređeni Podređenici

47

Page 48: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

Ivan Ivica, Joža, Ana, Kristijan

Anita Luka, Stjepan, Kristina, Igor

Međutim i ona ima problema. Što ako odlučimo maknuti ili dodati zaposlenika, moramo prolaziti

kroz cijelu tablicu i pregledavati svako polje "Podređenici" da bi ga našli. To nije problema kad ima

ovakvo malo zaposlenika, ali što ako ih ima na tisuće. Isti tip problema se javlja kad bi htjeli dohvatiti

podatak tko je nadređen određenom podređenom.

Evo tablice koja zadovoljava prvu normalnu formu:

Nadređeni Podređeni

Ivan Ivica

Ivan Joža

Ivan Ana

Ivan Kristijan

Anita Luka

Anita Stjepan

Anita Kristina

Anita Igor

Još trebamo napraviti korak dva, definirati unikatan podatak za svaki red, takozvani primarni ključ.

U ovom slučaju to su oba polja, par nadređeni – podređeni je primarni ključ.

Primarni ključ je podatak ili set podataka koji su jedinstveni u cijeloj tablici i o kojem ostali podaci u

zapisu ovise. Da bi bilo jasnije idemo nadodati podatak u našu tablicu:

Nadređeni Podređeni Trajanja odnosa

Ivan Ivica 1 godina

Ivan Joža 2 godine

Ivan Ana 3 godine

Ivan Kristijan 4 godine

Anita Luka 1 godina

Anita Stjepan 2 godine

Anita Kristina 3 godine

48

Page 49: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

Anita Igor 4 godine

Dodatni podatak, trajanje odnosa ovisi o primarnom ključu tj. vezi nadređenoga sa njegovim

podređenim.

Druga normalna forma također ima dva koraka:

• Maknuti podskup podataka koji se nalazi u više zapisa tablice u zasebnu tablicu

• Stvoriti vezu između stari i nove tablice upotrebom stranih ključeva

Idemo pogledati primjer:

On-line trgovina ima tablicu u koju bilježi podatke kupaca, tablica se sastoji od:

• Broj kupca

• Ime

• Prezime

• Adresa

• Grad

• Županija

• Poštanski broj

A nekoliko njenih zapisa:

Broj kupca Ime Prezime Adresa Grad Županija Poštanski broj

1 Ivica Ivić Neka 1 Zagreb Zagrebačka 10000

2 Joža Jožić Neka 2 Zagreb Zagrebačka 10000

3 Ana Anić Neka 3 Zagreb Zagrebačka 10000

4 Kristijan Horvat Neka 4 Osijek Osječka 21000

5 Luka Horvat Neka 5 Osijek Osječka 21000

6 Stjepan Stipić Neka 6 Rijeka Primorska 31000

Brzi pregledom ćemo uočiti da se podaci za grad i poštanski broj mnogo puta ponavljaju. Iako to ne

izgleda kao velika mana ona to jest ako ćemo u tablici imati npr. 200 000 zapisa.

49

Page 50: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

Prvi korak je maknuti duplicirane zapise u zasebnu tablicu grad u koju premjestimo polja:

• Grad

• županija

• Poštanski broj

Primarni jedinstveni podatak je Poštanski broj i njega možemo postaviti za primarni ključ.

Grad Županija Poštanski broj

Zagreb Zagrebačka 10000

Osijek Osječka 21000

Rijeka Primorska 31000

Kada smo to napravili prelazimo na korak 2, stvoriti vezu između stare i nove tablice upotrebom

stranih ključeva. Strani ključe je podatak u tablici koji veže zapis sa dodatnim zapisom u drugoj

tablici.

Broj kupca Ime Prezime Adresa Poštanski broj

1 Ivica Ivić Neka 1 10000

2 Joža Jožić Neka 2 10000

3 Ana Anić Neka 3 10000

4 Kristijan Horvat Neka 4 21000

5 Luka Horvat Neka 5 21000

6 Stjepan Stipić Neka 6 31000

Grad Županija Poštanski broj

Zagreb Zagrebačka 10000

Osijek Osječka 21000

Rijeka Primorska 31000

Sada je količina koju zauzimaju podaci na disku mnogostruko smanjena. Također je moguće mnogo

lakše vršiti upite za modifikaciju podataka.

Ostala nam je treća normalna forma.

Ona se sastoji od samo jednog pravila:

50

Page 51: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

• Potrebno je maknuti sve kolone tablice koje u potpunosti ne ovise o primarnom ključu te

tablice.

Pogledajmo primjer:

On-line trgovina ima tablicu u koju se pamte podaci narudžbi, ona izgleda ovakvo:

• Broj narudžbe

• Broj kupca

• Cijena

• Količina

• Ukupno

Broj narudžbe Broj kupca Cijena Količina Ukupno

1 1 10 1 10

2 1 20 2 40

3 2 30 1 30

Prvo se moramo uvjeriti da se tablica nalazi u prvoj i drugoj normalnoj formi. Dali imamo duplikaciju

kolona? Ne! Dali imamo primarni ključ? Da, broj narudžbe. Znači tablica se nalazi u prvoj normalnoj

formi. Dali imamo duplikacije podataka? Ne, znači tablica se nalazi i u drugoj normalnoj formi.

Sad trebao ustanoviti dali postoje kolone koje nisu direktno ovisne o primarnom ključu?

• Dali je broj kupca ovisan o primarnom ključu (broju narudžbe)?

Je, svaki narudžbu je napravio neki kupac.

• Dali je cijena ovisna o primarnom ključu?

Je, svaka narudžba ima svoju cijenu

• Dali je količina ovisna o primarnom ključu?

Je.

• Dali je ukupno ovisno o primarnom ključu?

Nije baš, ono je ovisno o cijeni i količini i iz njih se računa. To znači da njega možemo izbrisati.

Kako ćemo onda dobiti ukupnu cijenu narudžbe? Sa upitom kao što je:

51

Page 52: Netakadmija m4 Mysql

PHP i MySQL tečaj 5. Proces dizajniranja baze podataka

Normalizacija baze podatak se rijetko kada vrši forma po forma već se prilikom dizajniranja baze

podataka tablice stvaraju tako da odmah zadovoljavaju prve tri normalne forme.

5.4. Napraviti bazu podataka u odgovarajućem softwareu

Program u kojem će se napraviti baza podataka nije bitan. Neki su jednostavni za korištenje drugi

imaju više opcija. Osim komandlinijskih programa koje smo već upoznali u trenutku pisanja ovog

priručnika poznati su i popularni:

• MySQL Workbench ( http://www.mysql.com/products/workbench/ )

• PhpMyAdmin ( http://www.phpmyadmin.net/ )

5.5. Provjeriti dizajn

Kao zadnji korak procesa dizajniranja baze podataka ostaje nam provjeriti dizajn koji smo stvorili.

Provjeriti dizajn baze podataka znači pokušati iz baze podataka dobiti sve podatke koje nam trebaju

u radu aplikacije. To se može napraviti tako da se bazu podataka napuni testni podacima i na njoj

pokuša izvršiti sve upite koje će aplikacija slati prema bazi podataka u svom radu.

Ukoliko baza podatak neće biti potrebna klijentu dok se aplikacija u potpunosti ne dovrši ovaj korak

se ne treba činiti zato jer će razvojem aplikacije ona nametati podatke koje od baze treba te će se

bazi podataka mijenjati dizajn ukoliko će to biti potrebno.

52

SELECT broj_narudzbe, cijena*kolicina AS ukupno FROM nardzbe;

Page 53: Netakadmija m4 Mysql

PHP i MySQL tečaj 6. Vrste spojeva

6. Vrste spojevaSQL spojevi (veze) se dijele na unutarnje (inner) te vanjske (outer). Od čega se vanjske dijele na ljeve,

desne i pune. Vanjske pune veze MySQL ne podržava tako da o njima neće biti govora.

Klasična unutarnja veza je suma svih ćelija prve i druge tablice u vezi koje su povezane nekim

atributima. Ako oni nisu navedeni onda se radi o svim mogućim kombinacijama ćelija.

Za primjer ćemo koristiti dvije tablice sljedeće strukture:

Njih ćemo napuniti sljedećim podacima:

53

CREATE TABLE `t1` (

`id` int(10) unsigned NOT NULL,

`slovo` char(1) NOT NULL,

PRIMARY KEY (`id`)

);

CREATE TABLE `t2` (

`id` int(10) unsigned NOT NULL,

`code` varchar(255) NOT NULL,

PRIMARY KEY (`id`)

);

INSERT INTO `t1` (`id`,`slovo`) VALUES

(1,'a'),

(2,'b'),

(3,'c');

INSERT INTO `t2` (`id`,`code`) VALUES

(1,'X123'),

(3,'Y229'),

(5,'Z457');

Page 54: Netakadmija m4 Mysql

PHP i MySQL tečaj 6. Vrste spojeva

Sljedeći SQL query su primjeri unutarnje veze:

id slovo id code1 a 1 X1232 b 1 X1233 c 1 X1231 a 3 Y2292 b 3 Y2293 c 3 Y2291 a 5 Z4562 b 5 Z4573 c 5 Z457

id slovo id code1 a 1 X1233 c 3 Y229

id slovo code1 a X1233 c Y229

Karakteristika unutarnjih spojeva je u tome što svi redovi trebaju zadovoljavati uvjet veze ako je on

naveden.

Vanjske veze su veze kod kojih se podaci jedne tablice nadodaju na drugu bez obzira dali je vezni

element prisutan ili ne.

54

SELECT * FROM t1 JOIN t2;

SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id;

SELECT * FROM t1 INNER JOIN t2 USING (id);

Page 55: Netakadmija m4 Mysql

PHP i MySQL tečaj 6. Vrste spojeva

Kod MySQL-a postoje samo lijeva i desna vanjska veza. Lijeva vanjska veza radi tako da se iz prve

naveden tablice (lijeve) uzmu svi redovi koji zadovoljavaju uvjet spoja, nakon toga se na te rezultate

nadodaju redovi iz druge tablice (desne) koji zadovoljavaju uvjet spoja. Tamo gdje nema

pripadajućeg reda u drugoj tablici koji bi zadovoljio uvjet dostavljaju se null vrijednosti.

id slovo id code1 a 1 X1232 b null null3 c 3 Y229

Desni vanjski spoj djeluje identično samo se prvo uzmu redov desne tablice i na njih se nadodaju

redovi lijeve.

id slovo id code1 a 1 X1233 c 3 Y229null null 5 Z457

55

SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id;

SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id;

Page 56: Netakadmija m4 Mysql

PHP i MySQL tečaj 7. Subquery

7. SubquerySubquery su ukratko rečeno query-i unutar query.

Najjednostavniji primjer bi bio:

Ovaj isti query smo mogli riješiti sa joinom između tablice t1 i t2. Subquery je povećao čitkost koda i

pojednostavnio njegovu logiku.

Subquery je ustvari zamjena za join.

Međutim ponekad se neki podatak može dobiti samo upotrebom subquery dok odgovarajući join ne

postoji, npr:

Selektira zapise iz tablice t1 čija kolona columne1 je jednaka najvećoj vrijednosti columne2 u tablici

t2.

Sa subquery-ima se često koriste operatori kao što su IN, NOT IN, ALL itd.

će vratiti sve zapise iz tablice t1 gdje je vrijednost kolone s1 jednaka onima koji se nalaze u tablici t2.

će vratiti sve zapise iz tablice t1 čija vrijednost kolone s1 ne postoji u tablici t2.

će vratiti sve zapise iz t1 čija je vrijednost kolone s1 veća od svih vrijednosti kolone s1 u tablici t2.

56

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

SELECT column1 FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2);

SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);

SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);

SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);

SELECT DISTINCT store_type FROM stores

WHERE EXISTS (SELECT * FROM cities_stores

WHERE cities_stores.store_type = stores.store_type);

Page 57: Netakadmija m4 Mysql

PHP i MySQL tečaj 7. Subquery

Koja vrste trgovina se nalaze u jednom ili više gradova.

Koje vrste trgovina se ne nalazi ni u jednom gradu.

Subqueryi imaju mogućnost referenciranja na vanjsku tablicu npr.

Također ih se može postaviti u FROM dio query npr.

Postavljanje subquery u FROM dio se preporuča jer tada MySQL bolje izvrši kompletan query.

Što se optimizacije tiče općenito za MySQL se preporuča upotreba subquery kao zamjena inner joinu

dok se outer join ima ipak bolje performanse.

57

SELECT DISTINCT store_type FROM stores

WHERE NOT EXISTS (SELECT * FROM cities_stores

WHERE cities_stores.store_type = stores.store_type);

SELECT * FROM t1 WHERE column1 IN (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);

SELECT AVG(sum_column1)

FROM (SELECT SUM(column1) AS sum_column1

FROM t1 GROUP BY column1) AS t1;

Page 58: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

8. IndeksiPostavljanjem indeksa na kolone tablice podaci u tim kolonama postaju indeksirani te je njihov

dohvat mnogo brži.

Postoje tri razloga za korištenje indeksa:

1. Ubrzavanje pretrage po kolonama koje su indeksirane

2. Stavljanje restrikcije unikatnosti na sadržaj kolone

3. Korištenje naprednih mogućnosti kao što je puno tekstna pretraga

Vrijeme izvršavanja upita na bazu je važno iz više razloga. Prvi razlog je brže izvršavanje aplikacije.

Drugi je broj konekcija na MySQL server. Ako se upiti na bazu dugo izvršavaju manje korisnika će u

istom vremenskom razdoblju moći koristiti bazu a time i cijelu web aplikaciju.

Optimizacija query se vrši SQL naredbom EXPLAIN na SELECT query-u. Čak i ako ubiti optimiziramo delete, update ili neki drugi query, WHERE i JOIN dio utječu na način izvršavanja querya nad bazom i time na njegovu brzinu izvršavanja. Tako da sve query-e koje želimo optimizirati treba pretvoriti u SELECT query-e zadržavajući pritom isto JOIN i WHERE dio.

Za primjer ćemo napraviti sljedeću tablicu:

Tablicu popunite proizvoljnim podacima po volji.

Izvršimo sljedeći query:

Dobiti ćemo sljedeće:

58

CREATE TABLE `test_table` (

`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

`integer_columne` INTEGER UNSIGNED NOT NULL,

`varchar_columne` VARCHAR(255) NOT NULL,

`text_columne` TEXT NOT NULL,

PRIMARY KEY (`id`)

) ENGINE = MyISAM CHARACTER SET latin2 COLLATE latin2_croatian_ci;

explain select * from test_table where id=10;

Page 59: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

Id Select_type Table Type Possible_keys Key Key_len Ref Rows Extra1 SIMPLE test_table Const Primary Primary 4 Const 1

To su rezultati explain naredbe koji nam govore kako select query radi i koji je podloga za optimizaciju.

Vraćene kolone i značenja:

Kolona Moguće vrijednosti i značenja

Select_type SIMPLE – jednostavan query koji ne koristi unione ili neke druge napredne mogućnosti

PRIMARY – vanjski select (primarna tablica na koju su se ostale vezale)

UNION – druge tablice u union-u

DEPENDENT UNION – druga tablica u union-u koja je vezana sa vanjskom

UNION RESULT – rezultat uniona

SUBQUERY- prvi select u subquery-u

DEPENDENT SUBQUERY – prvi select u subquery koji je vezan sa vanjskim

DERIVED – derivirana tablica subquery-a (subquery u FROM djelu)

UNCACHEABLE SUBQUERY – derivirana tablica čiji rezultat ne može biti keširan I koja će se ponovo stvarati za svaki row koji zadovolji uvjete veze.

Type Tip veze sa drugim tablicama, poredano od najbolje prema lošijima:

system – tablica ima samo jedan redak

const – tablica ima samo jedan zadovoljavajući record, prisutan kod dohvata prema primarnom ključu ili unikatnim indeksom

59

Page 60: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

eq-ref – jedan redak iz ove tablice je pročitan za svaku kombinaciju redaka iz vezne tablice

ref – Svi redovi sa zadovoljavajućom vrijednosti indeksa su pročitani za svaku kombinaciju redaka iz vezene tablice

fulltext – search preko fulltext indeksa

ref_or_null – identičan ref tipu sa dodatkom što gleda dali postoji null vrijednost

index_merge – upotrebljena optimizacija spajanja indeksa

unique_subquery – subquery interno zamijenjen sa index pregledom koji sadrži unikatne vrijednosti, prisutan u SQL oblika (value IN (SELECT primary_key FROM single_table WHERE some_expr))

index_subquery – identično kao sa unique_subquery-em samo što se indeks ne sastoji samo od unikatnih vrijednosti

range – pregledavaju se samo recordi koji zadovoljavaju raspon vrijednosti koristeći indeks. Range će se koristiti u slučajevima korištenja operatora =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()

index – pretražuju se svi recordi tablice koristeći njen indeks

ALL – pretražuje se svi recordi tablice (kombinacije svih recorda sa svim kombinacijama recorda vezne tablice)

Possible_keys Popis ključeva i indeksa koje je MySQL mogao upotrijebiti da brže izvrši pretragu i spajanje tablice sa drugim tablicama.

60

Page 61: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

Key Ključ upotrijebljen u dohvatu recorda tablice

Key_len Duljina ključa upotrebljena u pretrazi

Ref Kaže koje sve kolone su uspoređene sa indeksom da bi se izvršio dohvat

Rows Broj recorda tablice uključen u dohvat, što manji broj tim bolje!

Extra Dodatne informacije o dohvatu recorda iz tablice.

Distinct – MySQL je tražio unikatne recorde te je prestao tražiti čim je našao traženu vrijednost.

Full scan on Null key – Fallback metoda u slučaju subquery kada MySQL ne može upotrijebiti index-lookup metodu.

Impossible WHERE noticed after reading const tables – MySQL je skenirao sve const I system tablice uključene u vezu I zaključio da WHERE dio uvijek vraća false u svim mogućim slučajevima.

No tables – FROM dio nije prisutan.

Not exists – Vrši se na JEFT JOIN tipu veze kada where dio predstavlja visak.

Range checked for each record (index map: N) – MySQL nije našao dobar način da iskoristi indeks osim njihovom kombinacijom sa drugim indeksom ili usporedbom sa rasponom vrijednosti.

Select tables optimized away – query sadrži samo agregatne funkcija kao što su MIN(), MAX() koje su riješen upotrebom indeksa.

Using filesort – MySQL mora napraviti još

61

Page 62: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

jedan prohod kroz tablice da bi ih poredao po željenom redoslijedu.Using index – informacije su dohvaćene korištenjem jedino indeksa.

Using temporary – da bi dohvatio recorde MySQL je morao napraviti privremenu tablicu.

Using where – MySQL koristi WHERE dio da bi eliminirao recorde koji ga ne zadovoljavaju.

Using sort_union(...), Using union(...), Using intersect(...) – opisuje način na koji su indeksi spojenu prilikom index_merge tipa.

Using index for group-by – Koristi se indeks da bi se izvršio group-by dio.

Using where with pushed condition – Pojavljuje se samo u NDBCLUSTER tablicama.

Nakon tumačenja rezultata explain naredbe vidljivo je da je ovo vrlo optimiziran query.

Međutim pokušajmo izvršiti sljedeći query:

Rezultati su poražavajući. Broj pregledanih zapisa je jednak ukupnom broju zapisa u tablici.

Da bi se ovakav query optimizirao potrebno je napraviti indeks nad onim kolonama koji se koriste u where djelu ili jednom djelu njih.

62

explain select * from test_table where integer_columne=0;

Page 63: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

Postoje 3 važne vrste indeksa:

• indeksi

• unikatni indeksi

• fulltext indeksi

Obični indeksi se upotrebljavaju na kolonama koje imaju duplicirane vrijednosti ili ih mogu imati. Unikatni tamo gdje imamo unikatne vrijednosti (dvije iste se ne mogu desiti) a fulltext tamo gdje nam treba pretrage teksta. Fulltext indeks je podržan samo na MyISAM tipu tablica.

Indeksi mogu sadržavati više od jednog polja u kojem slučaju se unikatnost odnosi na sva uključenja polja (ne smije i ne može se pojaviti dupla kombinacija).

Ključevi su ujedno i indeksi, tj. ključ sa sobom nosi indeks ali indeks može postojati odvojeno od ključa. Npr. primarni ključ sa sobom nosi unikatan indeks.

Vratimo se nazad na naš primjer. Dodajmo indeks na kolonu integer_columne:

Ponovnim izvršavanjem explain query-a vidimo promjene koje je donijelo uvođenje indeksa. Type je sa ALL prešlo na ref te je broj ćelija pregledanih u dohvatu bitno manji.

Unikatni indeksi su bolji ali za njih trebamo imati kolonu ili set čija vrijednost nikad ne može biti ista. Ako na kolonu koja ima unikatan indeks pokušamo napraviti promjenu koja bi narušila stanje indeksa (dupla vrijednost) MySQL neće izvršiti zadani query i vratiti će grešku.

Kod tekstualnih tipova podataka indeks će se upotrijebiti samo ako je upotrijebljeno pretraživanje za cijelom string vrijednosti ili za njegovim početkom. Za primjer dodajmo indeks na polje string_columne:

Te izvršimo 3 query:

• explain select * from test_table where varchar_columne='vrijednost';

63

ALTER TABLE `test`.`test_table` ADD INDEX `integer_columne_indeks`(`integer_columne`);

ALTER TABLE `test`.`test_table` ADD INDEX `varchar_columne_indeks`(`varchar_columne`);

Page 64: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

• explain select * from test_table where varchar_columne like 'a%';

• explain select * from test_table where varchar_columne like '%a%';

Prvi query pretražuje tablicu za točno određenu vrijednost te će sa postojanjem indeksa biti tipa ref.

Drugi query pretražuje tablicu za sve vrijednosti kolone varchar_columne čije vrijednosti počinju sa malim slovom a. Te će biti tipa range.

Treći query pretražuje tablicu za sve vrijednosti kolone varchar_columne čija vrijednost sadrži malo slovo a. U ovom slučaju indeks neće biti upotrijebljen i tip će biti ALL.

Razlog je u načinu na koji indeks radi, indeks će biti upotrijebljen ako je dana cijela vrijednost ili njen početak. Da bi mogli optimizirati pretraživanje unutar cijelog teksta potrebno je kreirati full text indeks.

Kreirajmo full text indeksa na koloni text_columne:

Upotreba full text indeksa zahtjeva drugačiju sintaksu za dohvat sadržaja tablice.

Npr. ako želimo dohvatiti svije zapise iz tablice test_table koji sadrže riječ “prvi” query bi izgledao ovakvo:

Kao što je vidljivo iz querya sintaksa je sljedeća:

Mach ({popis kolona koje želimo pretražiti, sve moraju biti u istom full text indeksu}) against ('{string koji tražimo}' {načina na koji tražimo})

String koji tražimo ovisno o načinu može sadržavati različite stvari. U našem primjeru u kojem smo koristili način „in boolean mode“ string može sadržavati standardne operatore pretraživanja prisutne na većini tražilica danas. To su:

+ operator – npr. ako tražimo '+Ivan +Igor' tekst mora sadržavati obje riječi.

- operator – npr. '+Igor -Ivan' će vratiti tekst koji sadrži riječ „Igor“ ali ne sadrži riječ „Ivan“.

razmak operator – npr. 'Ivan Igor' će vratiti tekst koji sadrži riječ „Ivan“ ili „Igor“ ili oboje.

*operator - npr. 'rije*' će vratiti tekst koji sadrži riječi koji počinju sa „rije“ npr. riječ, rijeka itd.

64

ALTER TABLE `test`.`test_table` ADD FULLTEXT INDEX `text_columne_indeks`(`text_columne`);

select * from test_table where match (text_columne) against ('prvi' in boolean mode);

Page 65: Netakadmija m4 Mysql

PHP i MySQL tečaj 8. Indeksi

““ operator – npr. '“Tri jabuke“' će vratiti tekst koji sadrži točan izraz „Tri jabuke“.

Još ima mnogo drugih operatora ali su ovo najvažniji.

Osim načina „in boolean mode“ postoji još dva: prirodna pretraga i proširena prirodna pretraga. Obje pokušavaju interpretirati traženi izraz i naći njegove varijacije a ne samo identičan izraz. Više informacija se može pronaći u MySQL manualu.

Broj pojavljivanja traženog izraza se može selektirati ovakvo:

Bitno je znati nekoliko činjenica prilikom upotrebe full tekst pretrage:

• Ako se ne koristi način „in boolean mode“ MySQL pazi da se tražena riječ ne pojavljuje prečesto, ako se pojavljuje smatra se učestalom veznom riječi u tekstu i zanemaruje u pretrazi.

• Neke riječi se automatski izostavljaju iz pretrage, njihov popis se može pronaći na: http://dev.mysql.com/doc/refman/5.0/en/fulltext-stopwords.html

• Ako je riječ prekratka također se izuzima iz pretrage. Duljina riječi se može podesiti u konfiguraciji MySQL servera izmjenom vrijednosti varijable ft_min_word_len koja uobičajeno iznosi 4.

Treba napomenuti da su indeksi odvojene strukture od podataka te se u nekim slučajevima mogu početi razlikovati. Iz toga razloga je potrebno održavati MySQL bazu. Popravljanje i analiza indeksa se vrši ANALYZE TABLE query-em čija sintaksa izgleda ovakvo: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

65

select *, match (text_columne) against ('prvi' in boolean mode) as broj_pojavljivanja from test_table

where match (text_columne) against ('prvi' in boolean mode);

Page 66: Netakadmija m4 Mysql

PHP i MySQL tečaj 9. Dodatno o stranim ključevima

9. Dodatno o stranim ključevima

Već smo rekli da strani ključ veže zapis u jednoj tablici sa zapisom u drugoj tablici npr.

Zaposlenici:

jmbg ime prezime adresa grad broj_odjela

123123123 Joža Jožić Neka 12 Rijeka 1

234234666 Ivan Ivić Adresa 123 Varaždin 1

Odjeli:

broj_odjela ime adresa grad

1 Odjel za marketing Neka 123 Rijeka

2 Knjigovodstveni odjel Adresa 543 Rijeka

Osim te logičke funkcije stranih ključeva postoji i njihova druga strana. Ako se koristi InnoDB mehanizam za pohranu tablica ili neki drugi koji omogućava stvaranje stranih ključeva nad poljima tablice onda se prilikom njihovog stvaranja mogu definirati dodatna pravila.

Ta dodatna pravila se odnose na slučaj da se zapis u drugoj tablici na koji strani ključ pokazuje mijenja ili briše. Tako se može postaviti:

1. da se SQL upit koji bi rezultirao promjenom vrijednosti atributa zapisa u drugoj tablici sa kojom je trenutni atribut u vezi preko stranog ključa zabrani od izvršavanja

2. da se u slučaju promjene vrijednosti atributa zapisa u drugoj tablici sa kojom je trenutni atribut u vezi preko stranog ključa ta promjena automatski primjeni i na trenutnu vrijednost

3. da se u slučaju promjene vrijednosti atributa zapisa u drugoj tablici sa kojom je trenutni atribut u vezi preko stranog ključa trenutna vrijednost ne mijenja

4. da se SQL upit koji bi rezultirao brisanjem zapisa u drugoj tablici sa kojom je trenutni atribut u vezi preko stranog ključa zabrani od izvršavanja

5. da se u slučaju brisanja zapisa u drugoj tablici sa kojom je trenutni atribut u vezi preko stranog ključa to brisanje primjeni i na zapis u ovoj tablici

6. da se u slučaju brisanja zapisa u drugoj tablici sa kojom je trenutni atribut u vezi preko stranog ključa to brisanje ne rezultira nikakvom akcijom u trenutnoj tablici

66

Page 67: Netakadmija m4 Mysql

PHP i MySQL tečaj 9. Dodatno o stranim ključevima

To bi za gornji primjer moglo izgledati ovakvo:

U slučaju da imamo postavljeno pravilo 1 i da odjelu za marketing u tablici odjeli idemo promijeniti broj odjela taj query bi bio spriječen od izvršavanja zato jer je broj odjela vezan sa tablicom zaposlenici.

U slučaju da imamo postavljeno pravilo 2 i da odjelu za marketing u tablici odjeli idemo promijeniti broj odjela taj query bi bio također rezultirao promjenom broja odjela u tablici zaposlenici zato jer su ti atributi u vezi.

U slučaju da imamo postavljeno pravilo 3 i da odjelu za marketing u tablici odjeli idemo promijeniti broj odjela taj query bi promijenio broj odjela u tablici odjeli ali ne bi promijenio vezane vrijednosti u tablici zaposlenici te bi se oni počeli razlikovati i veza više ne bi bila valjana. Ovo je slučaj kada imamo vezane podatke u tablicama a ne možemo ih staviti u vezu uz pomoć stranog ključa npr. MyISAM mehanizam pohrane.

U slučaju da imamo postavljeno pravilo 4 i da odjel za marketing u tablici odjeli idemo obrisati taj query bi bio spriječen od izvršavanja zato jer za taj broj odjela postoje zaposlenici u tablici zaposlenici.

U slučaju da imamo postavljeno pravilo 5 i da odjel za marketing u tablici odjeli idemo obrisati taj query bi bio rezultirao brisanjem svih zaposlenika u tablici zaposlenici koji su u vezi sa tim odjelom.

U slučaju da imamo postavljeno pravilo 6 i da odjel za marketing u tablici odjeli idemo obrisati taj query bi bio rezultirao brisanjem tog odjela iz tablice odjeli ali bi ostavio sve zaposlenika u tablici zaposlenici koji su u vezi sa tim odjelom i imali bi pokvarene podatke u našoj bazi podataka.

67

Obavezno pročitati poglavlje "FOREIGN KEY Constraints" posljednje stabilne

verzije MySQL manual-a.

( http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html )

Page 68: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10. Rad sa MySQL bazom iz PHP-a

Rad sa MySQL bazom podataka iz PHP je vrši preko PHP ekstenzija Njih ima više, danas su najkorištenije sljedeće tri:

• mysql

• mysqli

• pdo

Kao i za svaki drugu PHP ekstenziju potrebno ih je omogućiti u php.ini konfiguracijskoj datoteci.

10.1. mysql ekstenzija

mysql ekstenzija je najstarija PHP ekstenzija za rad sa MySQL bazom podataka. Do verzije 5 PHP je

dolazila kompajlirana u samu jezgru PHP-a te ju nije bilo potrebno dodatno uključivati.

mysql je funkcijska ekstenzija te iako se sa njom može raditi sa novim verzijama MySQL-a mnoge

mogućnosti nije moguće iskoristiti.

Nove projekte se preporuča programirati korištenjem druge dvije ekstenzije dok je mysql ekstenziju

potrebno poznavati radi i dalje velikog broja PHP aplikacija napravljenih koristeći nju.

Ovo su funkcije koje mysql ekstenzija sadrži:

Naziv funkcije Svrha

mysql_affected_rows Vraća broj zapisa kojima je nešto bilo promijenjeno u zadnjem query-

u

mysql_change_user Mijenja korisnika baze

mysql_client_encoding Vraća naziv encodinga

mysql_close Zatvara vezu sa MySQL serverom

mysql_connect Otvara vezu sa MySQL serverom

mysql_create_db Kreira bazu podataka

mysql_data_seek Pomiče pokazivač u recordset-u

68

Page 69: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

mysql_db_name Vraća ime baze podataka na koju smo spojeni

mysql_db_query Izvršava SQL naredbu (query) nad bazom podataka

mysql_drop_db Briše bazu podataka

mysql_errno Vraća numerički kod zadnje greške nastale na MySQL serveru

mysql_error Vraća tekst zadnje poruke nastale na MySQL serveru

mysql_escape_string Priredi string podataka za upotrebu u SQL naredbi

mysql_fetch_array Dohvaća zapis (row) u niz

mysql_fetch_assoc Dohvaća zapis u asocijativni niz

mysql_fetch_field Vraća informacije o kolonama u obliku objekta

mysql_fetch_lengths Vraća duljinu svake ćelije zapisa u obliku niza

mysql_fetch_object Dohvaća zapis u obliku objekta

mysql_fetch_row Dohvaća zapis u obliku numeriranog niza

mysql_field_flags Dohvaća zastavice pojedinih kolona zapisa

mysql_field_len Vraća duljinu dane kolone

mysql_field_name Vraća naziv dane kolone

mysql_field_seek Mijenja poziciju pokazivača unutar retka

mysql_field_table Vraća naziv tablice u kojoj se nalazi dana kolona

mysql_field_type Vraća naziv tipa kolone

mysql_free_result Dealocira memoriju koju je zauzimao recordset

mysql_get_client_info Informacije o klijentu

mysql_get_host_info Informacije o vezi sa serverom

mysql_get_proto_info Informacije o protokolu

mysql_get_server_info Informacije o serveru

mysql_info Informacije o zadnje izvršenom queryu

mysql_insert_id Vrijednost auto generiranog ID u zadnjem izvršenom queryu

mysql_list_dbs Lista baza podataka na serveru

69

Page 70: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

mysql_list_fields Lista kolona tablice

mysql_list_processes Lista procesa

mysql_list_tables Lista tablica u bazi

mysql_num_fields Broj kolona u zapisu

mysql_num_rows Broj dohvaćenih zapisa

mysql_pconnect Otvaranje perzistentne konekcije sa bazom podataka

mysql_ping Provjeravanje veze sa serverom i rekonekcija u slučaju da je veze

pukla

mysql_query Izvršavanje SQL query-a nad bazom podataka

mysql_real_escape_string Priprema string podataka za upotrebu u SQL naredbi

mysql_result Podaci o rezultatima izvršavanja SQL querya

mysql_select_db Selektiranje baze podataka

mysql_stat Status sustava

mysql_tablename Ime tablice

mysql_thread_id Identifikator trenutnog threada

mysql_unbuffered_query Izvršavanje SQL querya nad bazom bez dohvaćanja rezultata tog

izvršavanja

Važnije funkcije sa primjerom korištenja:

10.1.1. mysql_connect

Sintaksa:

Prvi parametar je naziv ili IP adresa MySQL servera i port na kojem se on nalazi. Ako se port ne

navede pretpostavlja se uobičajeni 3306 za MySQL server. Primjer: 'localhost',

'localhost:3388','http://mysql.some-site.com/'

70

resource mysql_connect ([ string $server [, string $username [, string $password [, bool $new_link [,

int $client_flags ]]]]] )

Page 71: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

Drugi parametar je korisničko ime korisnika baze podataka sa kojim se želimo spojiti.

Treći parametar je zaporka korisnika baze podataka.

Četvrti parametar određuje da li će se koristiti veza sa bazom uspostavljena prije u izvršavanju

skripte ili će se otvoriti nova.

Petim parametrom se određuje specifične postavke veze i u većini slučajeva nisu potrebne. Za više

informacija pogledati manual.

U slučaju uspješnog spajanja funkcija vraća resurs veze sa bazom, false u suprotnom.

10.1.2. mysql _close

Sintaksa:

Funkcija pokušava prekinuti vezu sa MySQL serverom. Vraća true ili false.

Prvi opcionalni parameter je resurs veze sa bazom podataka. Ako se ne navede uzima se zadnje

otvoreni.

71

<?php

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

if (!$link)

{

die('Spajanje nije uspjelo: ' . mysql_error());

}

echo 'Spajanje uspjesno!';

mysql_close($link);

?>

bool mysql_close ([ resource $link_identifier ] )

Page 72: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.1.3. mysql_select_db

Sintaksa:

Funkcija određuje na koju će se bazu podataka SQL queryi odnositi.

Prvi parameter je ime baze podataka, drugi opcionalni je resurs veze sa serverom.

Funkcija vraća true ili false ovisno o svom uspjehu.

72

bool mysql_select_db ( string $database_name [, resource $link_identifier ] )

<?php

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');

if (!$link)

{

die('Spajanje nije uspjelo: ' . mysql_error());

}

// selekcija tesne baze

$db_selected = mysql_select_db('test');

if (!$db_selected)

{

die('Selekcija baze test nije uspjela: ' . mysql_error());

}

?>

Page 73: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.1.4. mysql_query

Sintaksa:

Funkcija izvršava SQL query na server i vraća rezultat upita.

Prvi parameter je SQL query koji se želi izvršiti, a drugi opcionalni je resurs veze.

Ovisi o tome koja se vrsta SQL querya izvršavala, vraćene vrijednosti će biti drugačije.

• U slučaju greške funkcija će uvijek vratiti false.

• Ako je izvršeni query trebao vratiti recordset i query je uspješno izvršen vraća se resurs preko

kojeg se može pristupiti tom recordsetu.

• Međutim ako se radilo o queryu koji koji ne vraća recordset funkcija će vratiti true u slučaju

uspjeha.

73

resource mysql_query ( string $query [, resource $link_identifier ] )

<?php

$result = mysql_query('SELECT * WHERE 1=1');

if (!$result)

{

die('Greska u query-u: ' . mysql_error());

}

?>

Page 74: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.1.5. mysql_fetch_array

Sintaksa:

Funkcija dohvaća sljedeći red u recordsetu i vraća ga u obliku niza.

Prvi parameter je resurs recordseta koji je dobiven izršavanjem queryja (SELECT querija). Drugi

opcionalni parameter određuje dali će vraćeni niz biti asocijativan, numeriran ili oboje.

Ako se ne navede podrazumijeva se oboje.

Derivacije ove funkcije su mysql_fetch_assoc($result) i mysql_fetch_row($result), gdje jedna

dohvaća asocijativno, a druga numerirano polje zapisa iz baze.

74

array mysql_fetch_array ( resource $result [, int $result_type ] )

<?php

mysql_connect("localhost", "mysql_user", "mysql_password") or die('Spjanje nije uspjelo: ' .

mysql_error());

mysql_select_db('test');

$result = mysql_query('SELECT 2+2 as zbroj');

while ($row = mysql_fetch_array($result))

{

echo 'Zbroj je ' . $row['zbroj'];

}

mysql_free_result($result);

?>

Page 75: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.1.6. mysql_num_rows

Sintaksa:

Funkcija vraća broj redaka u recordsetu. Može se koristiti samo ako imamo resurs recordseta tj.

samo nakon SELECT i sličnih SQL querya.

10.1.7. mysql_affected_rows

Sintaksa:

Funkcija vraća broj zapisa na kojih je zadnji izvršeni query ima utjecaja. Koristi se za dobivanje broja

izmijenjenih, dodanih ili obrisanih zapisa nakon INSERT, UPDATE, DELETE i REPLACE querya.

10.1.8. mysql_insert_id

Sintaksa:

Funkcija vraća identifikator izgeneriran AUTO_INCERMENT poljem zadnjeg querya ili 0 ako

identifikator nije bio izgeneriran.

Ovu funkciju je moguće koristi isključivo nakon INSERT INTO querija, ako se ni jedan query nakon

toga nije poslao bazi.

Jedan česti trik kako ovo zaobići kada trebamo zadnji AUTO_INCREMENT broj, čak i ako INSERT upit

nije bio poslan, je poslati bazi sljedeći query:

Nakon toga asocijativno dohvatiti podatke mysql_fetch_assoc($recid) funkcijom, a na ključu

'Auto_increment' se nalazi prava vrijednost zadnjeg id-a.

75

int mysql_num_rows ( resource $result )

int mysql_affected_rows ([ resource $link_identifier ] )

int mysql_insert_id ([ resource $link_identifier ] )

SHOW TABLE STATUS LIKE 'ime_tabele';

Page 76: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2. mysqli ekstenzija

mysqli stoji za MySQL improved i napravljena je zato da se omoguće nova svojstva MySQL baze

podataka uvedena u verzijama 4.1.3 na više.

Glavne prednost u odnosu na staru mysql ekstenziju su:

• objektno orijentirano sučelje

• mogućnost pripreme upita

• potpora za višestruke upite

• potpora za transakcije

Ekstenzija pruža funkcijsko i objektno sučelje te su sve metode i funkcije rađene imajući na umu

laganu preradu postojećih aplikacija pisanih za rad sa starom mysql ekstezijom na novu poboljšanu

ekstenziju.

U ovom priručniku će biti prezentirano objektno sučelje. Svaka metoda ima pripadajući sestrinsku

funkciju koja obavlja istu zadaća, sintaksu potražiti u MySQL priručniku.

mysqli ekstenzija se sastoji od tri važne klase:

• MySQLi za rad sa bazom

• MySQLi_STMT za rad sa pripremljenim upitom

• MySQLi_Result za rad sa vraćenim record setovima iz baze

Važnije metode u njihova upotreba slijedi.

76

Page 77: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.1. MySQLi konstruktor

Sintaksa:

Prilikom kreiranja objekta konstruktoru se daju svi parametri potrebni u spajanju na MySQL server te

ime baze podataka sa kojom će se raditi.

77

mysqli::__construct ([ string $host = ini_get("mysqli.default_host") [, string $username =

ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") [, string

$dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket =

ini_get("mysqli.default_socket") ]]]]]] )

<?php

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

if ($mysqli->connect_error)

{

die('Greška prilikom spajanja: (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);

}

echo 'Uspjeh: ' . $mysqli->host_info . "<br />\n";

$mysqli->close();

?>

Page 78: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.2. MySQLi query metoda

Sintaksa:

Metoda za izvršavanje upita nad bazom.

Prvi parametar je pravilno escapan sql upit. Preporuča se escapanje korištenjem mysqli

real_escape_string metode.

Povratna vrijednost ovisi o vrsti upita koji je bio izvršen. Ako izvršavanje nije uspjelo bit će vraćeno

false. Ako je uspješno izvršen upit koji rezultira recordsetom bit će vraćen objekt tipa MySQLi_Result

za ostale vrste upita se slučaju uspjeha vraća true.

78

mixed mysqli::query ( string $query [, int $resultmode ] )

<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "db_name");

if (mysqli_connect_errno())

{

printf("Greška u spajanju: %s", mysqli_connect_error());

exit();

}

if ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE)

{

printf("Tablica myCity kreirana!");

}

$mysqli->close();

?>

Page 79: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.3. MySQLi prepare metoda

Sintaksa:

Prepare metoda priprema sql upit za izvršavanje. Time se baza obavještava o upitu koji se sprema

izvršiti te se baza može za njega pripremiti ovo je pogotovo bitno ako ćemo upit izvršiti puno puta sa

različitim podacima npr. INSERT koji u petlji upisuje mnogo zapisa u bazu.

Prvi parametar je sql upit koji treba na mjestima gdje će biti ubačene vrijednosti imati postavljen

znak ? vidjeti primjer koji slijedi. Važno za napomenuti je da parametri čija su mjesta označena ? Ne

trebaju biti eskejpana već će to učiniti sama ekstenzija ovisno o podatkovnom tipu određenog

parametra. Metoda vraća MySQLi_STMT objekt.

79

mysqli_stmt mysqli::prepare ( string $query )

<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "db_name");

if (mysqli_connect_errno())

{ printf("Greška u spajanju: %s", mysqli_connect_error()); exit(); }

$grad = 'Zagreb';

if ($stmt = $mysqli->prepare("SELECT zip_code FROM city WHERE name=?"))

{

$stmt->bind_param("s", $grad);

$stmt->execute();

$stmt->bind_result($zip);

$stmt->fetch();

echo 'Zip kod je: ' . $zip;

$stmt->close();

}

$mysqli->close();

?>

Page 80: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.4. MySQLi insert_id property (svojstvo)

Property sadrži auto generiranu vrijednost polja prethodnog sql upita, ako prethodni upit nije

rezultirao auto generiranjem vrijednosti property će sadržavati 0.

80

<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

if (mysqli_connect_errno())

{

printf("Greška prilikom spajanja: %s", mysqli_connect_error());

exit();

}

$query = "INSERT INTO osobe VALUES (NULL, 'ime_1', 'prezime_1')";

$mysqli->query($query);

printf ("Osoba ima id %d.<br />", $mysqli->insert_id);

$mysqli->close();

?>

Page 81: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.5. MySQLi autocommit metoda

Sintaksa:

Autocommit metoda ubiti starta sql transakciju kada se poziv sa parametorom false i commita kada

se poziva sa parametrom true.

10.2.6. MySQLi commit metoda

Sintaksa:

Commita otvorenu transakciju vrača true ili false ovisno o uspjehu.

10.2.7. MySQLi rollback metoda

Sintaksa:

Premotava promjene koje je transakcija radila nad bazom i poništava utjecaj upita izvršenih unutar

transakcije.

81

bool mysqli::autocommit ( bool $mode )

bool mysqli::commit ( void )

bool mysqli::rollback ( void )

Page 82: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.8. MySQLi_STMT bind_param metoda

Sintaksa:

Metoda veže vrijednosti parametara za pripremljen upit.

Prvi parametar određuje tipove podataka, mogući su:

• i – integer

• d – double

• s – string

• b – blob

Ostali parametri su vrijednosti redom kako se pojavljuju u pripremljenom sql upitu. Ovisno o svom

tipu će automatski biti pripremljene za upis u bazu te ih nije potrebno escejpati.

82

bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )

<?php

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'db_name');

if (mysqli_connect_errno())

die("Greška prilikom spajanja: " . mysqli_connect_error());

$stmt = $mysqli->prepare("INSERT INTO city VALUES (?, ?)");

$stmt->bind_param('sd', $ime_grada, $zip_code);

$ime_grada = 'Zagreb';

$zip_code = 10000;

$stmt->execute();

$stmt->close();

$mysqli->close();

?>

Page 83: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.9. MySQLi_STMT execute metoda

Sintaksa:

Izvršava pripremljeni sql upit te vraća true/false ovisno o uspjehu.

Nakon izvršavanja sql upita od kojeg se očekuje recordset potrebno je izvršiti MySQLi_STMT fetch

metodu prije ponovnog izvršavanja upita.

Primjer se može vidjeti u opisu prethodne metode.

10.2.10. MySQLi_STMT fetch metoda

Sintaksa:

Prolazi kroz zapisnik (recordset) dobiven iz baze izvršavanjem pripremljenog sql upita pomičući se za

jedno mjesto.

Obavezno je prije dohvata potrebno povezati varijable u koje će se podaci spremiti sa mjestima na

kojima se nalaze u dohvaćenom recordsetu iz baze koristeći metodu bind_result.

Metoda vraća true na uspjeh, false na grešku i null kada više nema podataka koji bi se dohvatili.

83

bool mysqli_stmt::execute ( void )

bool mysqli_stmt::fetch ( void )

<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "db_name");

$query = "SELECT name, zip FROM city";

if ($stmt = $mysqli->prepare($query)) {

$stmt->execute();

$stmt->bind_result($name, $zip);

while ($stmt->fetch())

{ echo $name . ' - ' . $code); }

$stmt->close();

}

$mysqli->close();

?>

Page 84: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.11. MySQLi_STMT bind_result metoda

Sintaksa:

Veže varijable dane u argumentima sa vrijednostima kolona iz zapisa. Varijable su vezane mjestom,

znači u prvu varijablu će biti spremljena prva kolona dohvaćenog zapisa. Varijable će se popuniti

kada se izvrši metoda fetch.

Primjer se može vidjeti u opisu prethodne metode.

10.2.12. MySQLi_STMT free_result metoda

Sintaksa:

Oslobađa memoriju koju je zauzeo zapisnik iz baze (recrodset). Ovu metodu je posebno važno zvati

ako ćemo izvršavati više sql upita koji dohvaćaju podatke nakon svakog dohvata.

10.2.13. MySQLi_STMT close metoda

Sintaksa:

Zatvara MySQLi_STMT objekt i oslobađa sve resurse koje je on zauzeo.

84

bool mysqli_stmt::bind_result ( mixed &$var1 [, mixed &$... ] )

void mysqli_stmt::free_result ( void )

bool mysqli_stmt::close ( void )

Page 85: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.14. MySQLi_Result fetch_array metoda

Sintaksa:

Dohvaća jedan zapis iz zapisnika (recordseta) u obliku niza te se pomiče na sljedeći.

Kad nema više što za dohvatiti tj. kad je prošao kroz cjeli zapisnik (recordset) vraća null.

Opcionalnim parametrom se može ograničiti da vraćeni niz bude samo imenovan ili numerički ako ga

se ne navede vraćeni niz će sadržavati duple vrijednosti, jedne pod numeričkim a druge pod

imenovanim ključem.

85

mixed mysqli_result::fetch_array ([ int $resulttype = MYSQLI_BOTH ] )

<?php

$query = "SELECT name FROM city";

$result = $mysqli->query($query);

while ($row = $result->fetch_array())

{

echo $row['name'] . '<br />';

}

$result->close();

$mysqli->close();

?>

Page 86: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.2.15. MySQLi_Result fetch_all metoda

Sintaksa:

Vrlo slično kao i fetch_array metoda međutim fetch_all će vratiti dvodimenzionalan niz koji sadrži sve

zapise zapisnika (recordseta). Memorijski je ovo više zahtjevna metoda, također se kroz vraćeni niz

treba još jednom prolaziti ako se manipulacija treba raditi na nivu pojedinog zapisa.

10.2.16. MySQLi_Result num_rows svojstvo (property)

Sadrži broj zapisa u zapisniku (recordsetu).

86

mixed mysqli_result::fetch_all ([ int $resulttype = MYSQLI_NUM ] )

<?php

$query = "SELECT name FROM city";

$result = $mysqli->query($query);

echo 'U bazi imamo ' . $result->num_rows . ' grada!';

$result->close();

$mysqli->close();

?>

Page 87: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3. PDO ekstenzija

PDO je najnovija ekstenzija za rad sa MySQL bazom podataka i poprilično je različita od prije

opisanih. PDO je kratica od PHP Data Objects i predstavlja nivo za apstrakciju pristupanja bazama

podataka drugim riječima pruža set objekata uz pomoć kojih se na isti način može raditi sa svim

podržanim baza podataka.

Za sad PDO podržava sljedeće baze podataka:

• MS SQL Server

• Firebird/Interbase

• IBM

• Informix

• MySQL

• Oracle

• ODBC and DB2

• PostgreSQL

• SQLite

• 4D

10.3.1. PDO konstruktor

Sintaksa:

Prvi parametar je takozvani dsn string.

U njemu je određeno sa kojom bazom podatak će se raditi i gdje. Npr. dsn string za mysql bazu

podatak bi mogao izgledati ovakvo:

87

PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

$dsn = 'mysql:dbname=testdb;host=localhost';

Obavezno pročitati poglavlje "PHP Data Objects" posljednje stabilne verzije PHP

manual-a.

( http://hr.php.net/manual/en/book.pdo.php )

Page 88: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

Četvrti parametar je specifičan za svaku bazu sa kojom se radi i uz pomoć njega se može npr. navesti

character set konekcije prema MySQL serveru:

Primjer:

10.3.2. PDO exec metoda

Služi za izvršavanje upita koji ne vraćaju zapisnik (recordset).

Vraća broj promijenjenih zapisa u bazi. U slučaju greške vraća false.

88

<?php

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';

$user = 'dbuser';

$password = 'dbpass';

try {

$dbh = new PDO($dsn, $user, $password);

} catch (PDOException $e) {

echo 'Connection failed: ' . $e->getMessage();

}

?>

array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")

int PDO::exec ( string $statement )

<?php

$dbh = new PDO($dsn, 'user', 'pass');

$count = $dbh->exec("DELETE FROM voce WHERE boja = 'plava'");

print("Izbisano: $count rows.\n");

?>

Page 89: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3.3. PDO query metoda

Sintaksa:

Kao što je vidljivo PDO query ima višestruku sintaksu ovisno o drugom nacionalnom argumentu.

Uvijek vraća PDOStatment objekt u slučaju uspjeha odnosno false u slučaju neuspjeha.

Za potrebe upita koji se ponavljaju sa drugačijim podacima npr. insert koji puni tablicu sa puno zapisa

preporuča se koristiti prepare metodu te nakon toga execute metodu od PDOStatment objekta.

89

PDOStatement PDO::query ( string $statement )

PDOStatement PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno )

PDOStatement PDO::query ( string $statement , int $PDO::FETCH_CLASS , string $classname , array

$ctorargs )

PDOStatement PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object )

<?php

function getFruit($conn) {

$sql = 'SELECT name, color, calories FROM fruit ORDER BY name';

foreach ($conn->query($sql) as $row) {

print $row['name'] . "\t";

print $row['color'] . "\t";

print $row['calories'] . "\n";

}

}

?>

Page 90: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3.4. PDO lastInsertId metoda

Sintaksa:

Vraća zadnji autogenerirani id prije izvršenog insert upita.

10.3.5. PDO errorInfo metoda

Sintaksa:

Vraća informacije o grešci koje je prouzročila zadnji upit.

Vraćeni niz ima sljedeću strukturu:

• Na ključu 0: SQLSTATE error code (peto znamenkasti kod greške definiran ANSI SQL

standardom).

• Na ključu 1: Kod greške definiran od strane drivera koji se koristi za rad sa određenom bazom

podatak npr. MySQL-om.

• Na ključu 2: Opis greške kojeg je dao driver kojeg se koristi za rad sa određenom bazom

podataka npr. MySQL-om.

90

string PDO::lastInsertId ([ string $name = NULL ] )

array PDO::errorInfo ( void )

Page 91: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3.6. PDO metode za upravljenje transakcijama

Prva od metoda je beginTransaction kojom se transakcija starta.

Sintaksa:

Na kraju transakcije promjene koje su u njoj učinjene se mogu učiniti stalnim ili se stanje može

poništiti uz pomoć metoda commit i rollBack.

Sintaksa:

91

bool PDO::beginTransaction ( void )

bool PDO::commit ( void ) bool PDO::rollBack ( void )

<?php

$dbh->beginTransaction();

$sth = $dbh->exec("DELETE FROM grad");

$dbh->commit();

?>

Page 92: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3.7. PDO prepare metoda

Sintaksa:

Metoda za pripremanje upita za višestruko izvršavanje.

Pored klasičnoga formata sa ? koji označava mjesto parametra moguće je koristiti i imenovane

:ime_parametra.

92

PDOStatement PDO::prepare ( string $statement [, array $driver_options = array() ] )

<?php

$sql = 'SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour =

:colour';

$sth = $dbh->prepare($sql);

$sth->execute(array(':calories' => 150, ':colour' => 'red'));

$red = $sth->fetchAll();

?>

Page 93: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3.8. PDOStatment bindValue metoda

Sintaksa:

Metoda za vezanje vrijednosti na parametar pripremljenog upita.

Treći opcionalni parametar određuje tip podatak u bazi podatak i njime se PDO služi kada priprema

taj podataka za upis, radi toga parametre pripremljenih upita nije potrebno escapati.

Moguće vrijednosti parametra su:

• PDO::PARAM_BOOL

• PDO::PARAM_NULL

• PDO::PARAM_INT

• PDO::PARAM_STR

• PDO::PARAM_LOB - veliki podatak

• PDO::PARAM_STMT – recordset

93

bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type =

PDO::PARAM_STR ] )

<?php

$calories = 150;

$sth = $dbh->prepare(' SELECT name, colour, calories FROM fruit WHERE calories < :calories ');

$sth->bindValue(':calories', $calories, PDO::PARAM_INT);

$sth->execute();

?>

Page 94: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3.9. PDOStatment execute metoda

Sintaksa:

Izvršava pripremljen SQL upit.

Opcionalni prvi parametar prima parametre pripremljenog upita i svi se tretiraju kao

PDO::PARAM_STR tip. Druga mogućnost je korištenje bindValue metode.

94

bool PDOStatement::execute ([ array $input_parameters = array() ] )

<?php

$calories = 150;

$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories');

$sth->execute(array(':calories' => $calories));

?>

Page 95: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

10.3.10. PDO fetch metoda

Sintaksa:

Dohvaća zapis iz zapisnika (recordseta).

Prvi opcionalni parametar određuje u kojem obliku će zapis biti vraćen, ako se ne navede vrijednost

će biti PDO::FETCH_BOTH koji određuje da zapis bude vraćen u obliku niza sa numeričkim i

imenovanim kolonama.

Svaki poziv fetch metode pomiče pokazivač unutar zapisnika (recordseta) na sljedeće mjesto.

10.3.11. PDOStatment fetchAll metoda

Sintaksa:

Umjesto dohvata jednog zapisa kao metoda fetch ova metoda ih dohvaća sve i vraća u obliku

dvodimenzijonalnog niza.

95

mixed PDOStatement::fetch ([ int $fetch_style = PDO::FETCH_BOTH [, int $cursor_orientation =

PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )

<?php

$sth = $dbh->prepare("SELECT name, colour FROM fruit");

$sth->execute();

$result = $sth->fetch(PDO::FETCH_BOTH);

print_r($result);

?>

array PDOStatement::fetchAll ([ int $fetch_style = PDO::FETCH_BOTH [, int $column_index = 0 [,

array $ctor_args = array() ]]] )

Page 96: Netakadmija m4 Mysql

PHP i MySQL tečaj 10. Rad sa MySQL bazom iz PHP-a

Prilozi

11. Prilog A: SQL sintaksa MySQL manulaUglate zagrade [ ] označavaju opcionalnu riječ tj. dio upita. Npr.

riječ INTO je opcionalna. Dosta riječi tj. djela upita kao u primjeru je opcionalni u smislu da

postojanje ili ne postojanje te riječi unutar upita nema nikakvog utjecaja na sam upit osim što ga čini

čitkijim.

Uglatim zagradama se također označavaju moguće opcije djela sql upita od kojih ni jedan nije

obavezan npr.

Ako je opcija obavezna, znači neka od navedenih mogućih djela upita se mora navesti izbor je

stavljen u vitičaste zagrade { } npr.

Sa tri razmaknute . se označava dio upita koji nije naveden jer se ponavlja ili je od prije poznat npr.

ili

96

INSERT [INTO] tbl_name

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

{DESCRIBE | DESC} tbl_name [col_name | wild]

SELECT . . . INTO OUTFILE

RESET reset_option [,reset_option] . . .