Upload
robert-gadanec
View
57
Download
0
Embed Size (px)
DESCRIPTION
sql iphp skripta
Citation preview
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
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
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
PHP i MySQL tečaj
11. Prilog A: SQL sintaksa MySQL manula.............................................................................................97
4
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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 )
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;
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) }
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;
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] ...
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] ...
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]]
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
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] ... ]
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]
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]
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;
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';
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]
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';
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
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;
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;
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);
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');
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');
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
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
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
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
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
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
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
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
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
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
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
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
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;
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');
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);
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;
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);
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;
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;
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
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
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
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;
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`);
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);
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);
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
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 )
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
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
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 ]]]]] )
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 ] )
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());
}
?>
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());
}
?>
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);
?>
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';
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
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();
?>
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();
?>
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();
?>
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();
?>
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 )
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();
?>
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();
?>
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 )
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();
?>
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();
?>
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 )
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");
?>
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";
}
}
?>
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 )
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();
?>
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();
?>
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();
?>
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));
?>
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() ]]] )
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] . . .