[3] Moderne aplikacije :: MySQL server

[3] Moderne aplikacije :: MySQL server

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Internet serveri
Uvod u REST i URL rewrite




Potrebno znanje za praćenje teksta:
Korišćenje sistemskih alata
Instalacija programa


Sadržaj

[1] Uvod

[2] Instalacija i podešavanje
[2.1] Windows
[2.2] Linux
[2.3] Mac OS X

[3] Osnovne komande

[4] PHP aplikacija za rad sa bazom
[4.1] Pripremanje baze
[4.2] MySQL Improved Extension
[4.3] PHP Data Objects




[1] Uvod


Većina ljudi kada kaže baza u stvari misli na sistem za upravljanje relacionim bazama podataka (eng. relational database management system). MySQL je danas jedan od najrasprostranjenijih sistema. U velikom broju slučajeva ćete na sajtovima za gostovanje internet stranica imati na raspolaganju baš MySQL server, i zbog toga ćemo ga i mi koristiti za rad sa bazama.

Za razliku čuvanja podataka u običnim tekstualnim datotekama, koje se koristi u školskim zadacima, korišćenje sistema za upravljanje bazama podataka nam omogućava brži i lakši rad sa podacima. Možemo kontrolisati u kakvom formatu moraju biti podaci, ko sve ima pristup do njih, imamo na raspolaganju jednostavne komande za pretragu podataka i još mnogo drugih stvari na poljima fleksibilnosti, brzine i bezbednosti. Još jedna od bitnih razlika je da baze omogućavaju višekorisnički način rada, što znači da u jednom momentu, više korisnika može vršiti operacije nad podacima.



[2] Instalacija i podešavanje


Cilj ovog dela je da instaliramo MySQL server, da ga pripremimo za povezivanje klijenata i da omogućimo pristup bazama preko PHP-a. PHP ima odličnu podršku za rad sa MySQL serverom i najčešće ćete na sajtovima za gostovanje internet stranica naći već kompletno podešeno okruženje (Apache + PHP + MySQL).



[2.1] Windows


Ako ste u prošlom članku pratili instalaciju Apcahe + PHP preko WAMP-a, onda već imate podešen i MySQL server i možete preći na poglavlje [3] Osnovne komande.

Preuzmite binarnu verziju MySQL servera. Raspakujte sadržaj arhive u direktorijum C:\, a zatim preimenujte direktorijum C:\mysql-5.6.10-win32, u C:\MySQL5.

Nakon raspakivanja, potrebno je napraviti konfiguraciju. Sve što treba da uradite je da kopirate datoteku C:\MySQL5\my-default.ini u datoteku C:\MySQL5\my.ini, i popravite dve linije. Pronađite red u kojem piše:
# basedir = ..... # datadir = .....

i popravite ga u:
basedir = C:\\MySQL5 datadir = C:\\MySQL5\\data

Time smo serveru rekli gde se nalazi instalacija i u kom direktorijumu se nalaze podaci.

Sledeći korak je instalacija i pokretanje servisa. Otvorite Command Prompt pod administratorskim nalogom, i ukucajte sledeće:
C:\MySQL5\bin\mysqld.exe -install net start MySQL

MySQL je sada instaliran i pokrenu, ali potrebno je odraditi još par sitnica koje će ga učiniti bezbednijim.

Trenutno korisnik root koji ima prava da menja sve podatke u bazi, nema definisanu šifru. Da bi postavili šifru, prvo se moramo povezati na MySQL server komandom:
C:\MySQL5\bin\mysql -u root

Dočekaće vas konzolna klijent aplikacija, preko koje možemo serveru slati komande. Recimo da root korisniku želimo da postavimo šifru toor, u tom slučaju je potrebno ukucati sledeću komandu:
set password = password('toor');

Da bismo proverili da li je promena šifre uspela, prvo se moramo zatvoriti klijenta:
quit;

I zatim se ponovo prijaviti, uz dodavanje parametra -p (taj parametar znači da želimo da ukucamo i šifru):
C:\MySQL5\bin\mysql -u root -p

Ovog puta ćemo pre povezivanja na server, morati da ukucamo šifru. U slučaju da zaboravite da dodate -p, dobićete grešku jer sada korisnik root ima šifru.

Da bismo onemogućili prijavu anonimnih korisnika (bez korisničkog imena), potrebno je da izvršimo sledeću komandu:
delete from mysql.user where user = '';

Uz standardnu instalaciju MySQL servera dolazi i prazna testna baza. Ako želite da je izbrišete, izvršite sledeću komandu:
drop database test; delete from mysql.db where db = 'test' or db = 'test\\_%';

Za kraj, ukucajte sledeće komande da bi promene koje smo napravili odmah stupile na snagu, i da bi zatvorili konekciju sa serverom:
flush privileges; quit;

Ovim smo završili instalaciju i podešavanje MySQL servera.

Nakon instalacije MySQL-a, potrebno je napraviti par malih izmena u php.ini datoteci. Predpostavićemo da ste PHP instalirali u direktorijum C:\PHP5.

Pošto se u radu s podacima, često srećemo s datumima i vremenima, bitno je da PHP-u naznačimo u kojoj vremenskoj zoni se nalazimo. Vremenska zona koja odgovara Srbiji je Europe/Belgrade, a ako želite, možete pogledati i kompletnu listu podržanih vremenskih zona. Otvorite datoteku C:\PHP5\php.ini, pronađite red u kojem piše:
;date.timezone =

i popravite ga u:
date.timezone = Europe/Belgrade

PHP ima mogućnost da svoju osnovnu funkcionalnost raširi dodatnim modulima. Uz pomoć modula ćemo dodati i podršku za rad sa MySQL serverom. Pre nego što uključimo potrebne module, moramo PHP-u reći gde se oni nalaze. Standardna lokacija je pod direktorijum ext. Otvorite datoteku C:\PHP5\php.ini, pronađite red u kojem piše:
; extension_dir = "ext"

i popravite ga u:
extension_dir = "C:\PHP5\ext"

Za kraj ćemo uključiti dva modula koji služe za rad sa MySQL serverom. Mogućnosti koje nude ćemo kasnije obraditi. Otvorite datoteku C:\PHP5\php.ini, pronađite redove u kojima piše:
;extension=php_mysqli.dll ;extension=php_pdo_mysql.dll

i odkomentirajte ih (obrišite znak ; sa početka linije).



[2.2] Linux


Instalacija na Linux-ima se razlikuje od distribucije do distribucije. Mi ćemo se fokusirati na Debian i njegove derivate, Ubuntu i Linux Mint. Prvo instalirajte sledeći paket:
sudo apt-get install mysql-server

U toku instalacije će vas skripta pitati da li želite da promenite šifru za korisnika root. Taj korisnik se uglavnom koristi za administraciju servera i ima prava da menja sve podatke koji se nalaze u bazama. Zbog toga je preporučljivo da u ovom koraku upišete šifru (šifru ćete moći i kasnije da dodate/promenite). U nastavku teksta ćemo podrazumevati da ste postavili šifru toor:

Upis šifre za root korisnika u Ubuntu 12.10



Ako se odlučite za promenu šifre, uslediće još jedan prozor u kojem ćete morati ponovo da upišete šifru:

Potvrda šifre za root korisnika u Ubuntu 12.10



Nakon instalacije je preporučljivo pokrenuti komandu:
mysql_secure_installation

Ova komanda se koristi za povećanje sigurnosti podataka tako što postavlja/menja šifru za root korisnika, uklanja mogućnost prijave anonimnih korisnika (prijava bez korisničkog imena), onemogućava prijavu root korisnika sa udaljenih računara i briše testnu bazu.

Nakon pokretanja komande, upišite trenutnu šifru za root korisnika, ili samo pritisnite enter ako je prilikom instalacije niste postavili:
Enter current password for root (enter for none):

Ako želite da promenite šifru, odgovorite Y, a zatim unesite šifru i potvrdite je:
Change the root password? [Y/n]

Brisanje anonimnih korisnika je preporučljivo, i zato na ovom koraku izaberite Y:
Remove anonymous users? [Y/n]

Zbog privilegija koje korisnik root ima, preporučljivo je da na ovom koraku izaberete Y, što će onemogućiti njegovu prijavu sa drugih računara u mreži ili sa interneta:
Disallow root login remotely? [Y/n]

Uz standardnu instalaciju MySQL servera dolazi i prazna testna baza. Ako želite da je izbrišete, izaberite Y:
Remove test database and access to it? [Y/n]

Na zadnjem koraku izaberite Y da bi promene koje smo napravili odmah stupile na snagu:
Reload privilege tables now? [Y/n]

Nakon instalacije MySQL-a, potrebno je napraviti par malih izmena i na PHP strani. Prvo instalirajte sledeći paket:
sudo apt-get install php5-mysqlnd

Pošto se u radu s podacima, često srećemo s datumima i vremenima, bitno je da PHP-u naznačimo u kojoj vremenskoj zoni se nalazimo. Vremenska zona koja odgovara Srbiji je Europe/Belgrade, a ako želite, možete pogledati i kompletnu listu podržanih vremenskih zona. Sledeća komanda će napraviti datoteku u kojoj ćemo definisati vremensku zonu:
sudo nano /etc/php5/apache2/conf.d/10-timezone.ini

U datoteku upišite sledeće:
[Date] date.timezone = Europe/Belgrade

Nakon toga je potrebno ponovo pokrenuti Apache server:
sudo /etc/init.d/apache2 restart



[2.3] Mac OS X


Preuzmite binarnu verziju servera za vaš računar:
Mac OS X 10.7/10.8
X86 32-bit DMG
X86 64-bit DMG

Mac OS X 10.6
X86 32-bit DMG
X86 64-bit DMG


Instalirajte paket mysql-5.6.10 u kojem se nalazi MySQL server, a zatim MySQLStartupItem koji će nam omogućiti pokretanje MySQL-a prilikom podizanja sistema.

Nakon toga, pokrenite datoteku MySQL.prefPane. Ta datoteka sadrži potrebne informacije da se MySQL integriše u sistemska podešavanja. Prilikom instalacije ćete moći da izaberete da li će se integracija izvršiti samo za trenutnog ili za sve korisnike. Ako želite da samo vaš korisnik može da pokreće i zaustavlja MySQL servis preko sistemskih podešavanja, izaberite instalaciju samo za trenutnog korisnika, u suprotnom izaberite instalaciju za sve:

Integrisanje MySQL podešavanja u Mac OS X 10.8



Pokretanje MySQL servera u Mac OS X 10.8



Nakon instalacije je preporučljivo pokrenuti komandu:
cd /usr/local/mysql sudo ./bin/mysql_secure_installation

Ova komanda se koristi za povećanje sigurnosti podataka tako što postavlja/menja šifru za root korisnika, uklanja mogućnost prijave anonimnih korisnika (prijava bez korisničkog imena), onemogućava prijavu root korisnika sa udaljenih računara i briše testnu bazu.

Nakon pokretanja komande, samo pritisnite enter, jer root korisnik trenutno nema šifru:
Enter current password for root (enter for none):

Pošto želimo da promenimo šifru, odgovorite Y, a zatim unesite novu šifru i potvrdite je (u daljem tekstu ćemo podrazumevati da ste dali šifru toor):
Change the root password? [Y/n]

Brisanje anonimnih korisnika je preporučljivo, i zato na ovom koraku izaberite Y:
Remove anonymous users? [Y/n]

Zbog privilegija koje korisnik root ima, preporučljivo je da na ovom koraku izaberete Y, što će onemogućiti njegovu prijavu sa drugih računara u mreži ili sa interneta:
Disallow root login remotely? [Y/n]

Uz standardnu instalaciju MySQL servera dolazi i prazna testna baza. Ako želite da je izbrišete, izaberite Y:
Remove test database and access to it? [Y/n]

Na zadnjem koraku izaberite Y da bi promene koje smo napravili odmah stupile na snagu:
Reload privilege tables now? [Y/n]


Pošto se u radu s podacima, često srećemo s datumima i vremenima, bitno je da PHP-u naznačimo u kojoj vremenskoj zoni se nalazimo. Vremenska zona koja odgovara Srbiji je Europe/Belgrade, a ako želite, možete pogledati i kompletnu listu podržanih vremenskih zona. Sledeća komanda će otvoriti datoteku s podešavanjima za PHP:
sudo nano /private/etc/php.ini

Pronađite red u kojem piše:
;date.timezone =

i promenite ga u:
date.timezone = Europe/Belgrade

Nakon toga, ponovo pokrenite Apache server:
sudo apachectl restart



[3] Osnovne komande


Osnovna instalacija MySQL-a nam nudi konzolni program za konekciju na server i izvršavanje akcija nad podacima. Ako ste tačno pratili korake, klijenta možete pokrenuti sledećom komandom:
Windows: C:\MySQL5\bin\mysql
Linux: mysql
Mac OS X: /usr/local/mysql/bin/mysql

Informacija ::Idea Na Windows-u i Mac OS X-u možete dodati direktorijum, u kojem se nalazi mysql program, u PATH što će vam omogućiti da iz bilo kog direktorijuma program možete pokrenuti kucajući samo mysql (isto kao na Linux-u).

Prilikom pokretanja programa mysql, potrebno je navesti korisničko ime pod kojim želimo da se prijavimo na server. Taj podatak se definiše parametrom -u. Ako želimo da se prijavimo kao korisnik test, program ćemo pokrenuti ovako:
mysql -u test

Još jedan parametar koji se koristi skoro uvek je -p. Taj parametar označava da korisničko ime pod kojim ćemo se prijaviti ima i šifru. Šifra se upisuje tek kada se klijent pokrene i zatraži je:
mysql -u test -p Enter password:

Da bismo se prijavili na server koji smo instalirali, moramo se prijaviti kao root i uneti šifru toor:
mysql -u root -p Enter password: ****
Informacija ::Idea Ako ste prilikom instalacije izabrali drugu šifru, upišite nju umesto toor.

Nakon uspešne prijave, dočekaće vas pozdravna poruka, a odmah za njom će klijent naznačiti da je spreman tekstom:
mysql>

Da bismo uopšte mogli da radimo s podacima, prvo moramo da napravimo bazu u kojoj će se oni nalaziti. Na bazu za sada možete gledati kao na skup podataka organizovanih po tabelama. Pravljenje baze se vrši sledećom komandom:
create database imebaze;
Informacija ::Idea Obratite pažnju na zadnji karakter! Komande se završavaju znakom ;.
MySQL ne obraća pažnju na velika i mala slova u komandama. CREATE, create i cReAtE imaju isto značenje za MySQL.


Napravimo bazu s imenom test:
create database test;

Da bi videli koje sve baze postoje na serveru, ukucajte komandu:
show databases;

Rezultat komande će izgledati približno ovako:
+--------------------+ | Database           | +--------------------+ | information_schema | | mysql              | | performance_schema | | test               | +--------------------+ 4 rows in set (0.00 sec)

Prve tri baze koristi server i ne smemo ih dirati ako ne znamo tačno šta radimo. Zadnja je naša baza koju smo kreirali u prošlom koraku.

MySQL nam omogućava da izaberemo aktivnu bazu. Komanda ima ovaj oblik:
use imebaze;

Ovaj korak nije obavezan, ali se prilično često koristi jer smanjuje mogućnost pravljenja grešaka, povećava portabilnost, a i identifikatori objekata su kraći. Obratite pažnju na to da baza ostaje aktivna sve dok ne izaberemo neku drugu. Pogledajmo sledeći primer: recimo da imamo tabelu tabela u bazi baza. Njeno puno ime je baza.tabela. Tako je možemo referencirati bez obzira na to koja baza je aktivna. Ako aktiviramo bazu baza, onda do tabele možemo pristupiti imenom tabela. Na to možete gledati kao na direktorijume. Ako želite da otvorite datoteku tabela koja se nalazi u direktorijumu baza, možete je otvoriti koristeći njenu celu putanju baza.tabela, ili promeniti direktorijum komandom use baza;, i otvoriti datoteku tabela.

Aktivirajmo našu bazu test:
use test;

Ako želite da pogledate koja baza je aktivna, ukucajte komandu:
select database();

Rezultat će izgledati ovako:
+------------+ | database() | +------------+ | test       | +------------+ 1 row in set (0.00 sec)

Za rad sa podacima nam osim baze trebaju i tabele. Tabele se kreiraju sledećom komandom:
create table imetabele ( definicija polja );

Definisanjem polja određujemo kako će tabela izgledati, odnosno koji podaci će u nju moći da se zapišu. Osim imena polja, moramo da definišemo i tip. MySQL podržava većinu standardnih tipova (tekst, cele i realne brojeve, datume, i još par drugih). Tipove podataka ćemo objašnjavati usput. Recimo da želimo da napravimo tabelu u kojoj ćemo moći da upišemo ime osobe i njen broj telefona. To znači da ćemo morati da napravimo dva polja u kojima može da se upiše tekst. U MySQL-u imamo 3 vrste podataka za čuvanje teksta: char, varchar i text. Prva dva tipa su prilično slična. Najveća razlika je u tome što char može da ima najviše 255 znakova i u bazi uvek zauzima onoliko mesta koliko je polje veliko, bez obzira na to koliko je dug tekst u polju. S druge strane, varchar može da ima i to 65535 znakova, a polje u bazi će biti veliko samo onoliko koliko je dug upisan tekst. Tip text se koristi za čuvanje velike količine teksta u jednom polju. Mi ćemo za naš primer iskoristiti polje varchar:
create table persons ( name varchar(200), phone varchar(200) );

Parametar pri tipu varchar određuje maksimalnu veličinu polja. MySQL baza dozvoljava kreiranje tabela čija maksimalna veličina može da bude maksimalno 64KB, i zbog toga je potrebno ograničiti veličine polja na neku normalnu vrednost.

Pregled napravljenih tabela u aktivnoj bazi možemo pogledati komandom:
show tables;

U našem slučaju će izlaz komande izgledati ovako:
+----------------+ | Tables_in_test | +----------------+ | persons        | +----------------+ 1 row in set (0.00 sec)

Imamo sve što je potrebno da upišemo par podataka u bazu. Upis podataka se vrši sledećom komandom:
insert into imetabele values (podatak, podatak, …, podatak);

Prethodni primer zahteva da upišemo vrednosti za sva polja po redu kako su definisana u tabeli. U slučaju da podatke želimo da unesemo drugim redosledom ili ako želimo da određene podatke ostavimo prazne, onda se koristi sledeća sintaksa:
insert into imetabele (imepolja, imepolje, …, imepolja) values (podatak, podatak, …, podatak);

Upišimo par redova u tabelu:
insert into persons values ('Petar Petrovic', '064123456'); insert into persons (phone, name) values ('063987654', 'Jovan Jovanovic'); insert into persons (name) values ('Nikola Nikolic');

Komanda za prikaz podataka iz tabele ima sličnu sintaksu, i isto omogućava prikaz svi ili samo određenih kolona. Za prikaz svih kolona se koristi sledeća sintaksa:
select * from imetabele;

Za prikaz samo određenih kolona ili za promenu redosleda se koristi sledeća sintaksa:
select imepolja, imepolje, …, imepolja from imetabele;

Za prikaz svih podataka koje smo uneli, ukucajte:
select * from persons;

Rezultat komande će izgledati ovako:
+-----------------+-----------+ | name            | phone     | +-----------------+-----------+ | Petar Petrovic  | 064123456 | | Jovan Jovanovic | 063987654 | | Nikola Nikolic  | NULL      | +-----------------+-----------+ 3 rows in set (0.00 sec)

Obratite pažnju da polje phone u zadnjem redu ima vrednost NULL. To je specijalna vrednost koja označava da vrednost tog polja nije postavljena.

Vrlo često se dešava da tabela ima veliki broj redova, a mi bi želeli da prikažemo samo određene. Komanda select omogućava i filtriranje podataka. Najjednostavniji oblik filtriranja ima sledeću sintaksu:
select * from imetabele where imepolja komparacija vrednost;

Recimo da želimo da imamo milion redova u našoj tabeli i da nas zanima koji broj telefona ima Jovan Jovanovic. Napisaćemo sledeću komandu:
select * from persons where name = 'Jovan Jovanovic';

Ta komanda će nam vratiti samo red koji smo tražili:
+-----------------+-----------+ | name            | phone     | +-----------------+-----------+ | Jovan Jovanovic | 063987654 | +-----------------+-----------+ 1 row in set (0.01 sec)

Još jedna korisna stvar koju možemo odraditi komandom select je sortiranje. Sintaksa je sledeća:
select * from imetabele order by imepolja, imepolja, …, imepolja;

Sortiranje će biti izvršeno redom po poljima navedenim posle order by. Ako iza imena polja dodate još razmak i desc, sortiranje po tom polju će biti odrađeno po opadajućem redu.
Informacija ::Idea Filtriranje i sortiranje možete koristiti zajedno tim redom.

Ako želimo da vidimo redove sortirane po imenu, treba da napišemo sledeće:
select * from persons order by name;

Rezultat te komande izgleda ovako:
+-----------------+-----------+ | name            | phone     | +-----------------+-----------+ | Jovan Jovanovic | 063987654 | | Nikola Nikolic  | NULL      | | Petar Petrovic  | 064123456 | +-----------------+-----------+ 3 rows in set (0.00 sec)

Vrlo često se dešava da određene podatke moramo da popravimo. Komanda za to je update. Ona se skoro uvek koristi zajedno s filtriranjem i sintaksa izgleda ovako:
update imetabele set imepolja = vrednost, imepolja = vrednost, …, imepolja = vrednost where imepolja komparacija vrednost;
Upozorenje ::Exclamation Ako ne koristite filtriranje, SVIM redovima u tabeli će biti promenjene vrednosti!

Recimo da svim redovima koji nemaju definisanu vrednost u polju phone hoćemo da upišemo vrednost Bez broja… komanda za to je:
update persons set phone = 'Bez broja' where phone is null;
Informacija ::Idea Obratite pažnju da kod filtriranja polja koja nemaju vrednost koristite IS NULL i IS NOT NULL jer će sva ostala poređenja vratiti negativan rezultat. Ako bi ovako filtrirali PHONE = NULL ne bi promenuli ni jedan zapis jer ništa NIJE JEDNAKO null i ništa NIJE RAZLIČITO od nullnešto JE null ili nešto NIJE null.

Rezultat te komande će vratiti broj promenjenih redova:
Query OK, 1 row affected (0.15 sec) Rows matched: 1  Changed: 1  Warnings: 0

Ako sada izlistamo redove, videćemo da je jedan red promenjen:
+-----------------+-----------+ | name            | phone     | +-----------------+-----------+ | Petar Petrovic  | 064123456 | | Jovan Jovanovic | 063987654 | | Nikola Nikolic  | Bez broja | +-----------------+-----------+ 3 rows in set (0.00 sec)

Kod brisanja se koristi komanda delete, i ona se takođe skoro uvek koristi sa filtriranjem:
delete from imetabele where imepolja komparacija vrednost;
Upozorenje ::Exclamation Ako ne koristite filtriranje, SVI redovi će biti izbrisani!

Hajde da izbrišemo zapis bez broja:
delete from persons where phone = 'Bez broja';

Rezultat je broj izbrisanih redova:
Query OK, 1 row affected (0.04 sec)

Ako sada izlistamo redove, videćemo da je jedan red izbrisan:
+-----------------+-----------+ | name            | phone     | +-----------------+-----------+ | Petar Petrovic  | 064123456 | | Jovan Jovanovic | 063987654 | +-----------------+-----------+ 2 rows in set (0.00 sec)

Za kraj, pogledajmo i komande za brisanje tabele i baze. Ove komande retko koriste, ali pošto ćemo mnogo eksperimentisati, lepo je znati kako počistiti za sobom.

Brisanje tabele se vrši komandom:
drop table imetabele;

Brisanje baze se vrši komandom:
drop database imebaze;

Ako želite, sada možete izbrisati testnu bazu pošto je više nećemo koristiti Smile



[4] PHP aplikacija za rad sa bazom


U prethodnim koracima smo već pripremili PHP za rad sa MySQL bazom. U nastavku teksta ćemo samo površinski obraditi dva načina za rad sa MySQL bazom. Koristićemo MySQL Improved Extension, što je preporučen način za povezivanje na MySQL baze, i PHP Data Objects koji omogućavaju isti način rada bez obzira na server na koji se povezujemo (PDO imaju podršku za Microsoft SQL Server, Firebird/Interbase, MySQL, Oracle, DB2, PostgreSQL, SQLite i još par drugih servera). Imajte na umu da PDO omogućavaju samo standardizovan način za komunikaciju sa serverom, komande za rad sa podacima se moraju pisati u SQL dijalektu koji server poznaje. Na sreću, standardne komande (insert, select, update i delete) su uglavnom iste na svim serverima. Pošto ćemo se fokusirati samo na rad sa MySQL serverom, sa PDO ćemo raditi samo u ovom uvodnom delu, dok ćemo MySQL Improved Extension usput detaljnije obraditi.



[4.1] Pripremanje baze


U prethodnom primeru smo napravili bazu za čuvanje imena i brojeva telefona. Oni koji do sada nikad nisu radili sa bazama podataka bi mislili da smo imali sva potrebna polja za normalan rad, ali zamislite da imate ove podatke u bazi:
+-----------------+-----------+ | name            | phone     | +-----------------+-----------+ | Petar Petrovic  | 064123456 | | Petar Petrovic  | 064123456 | +-----------------+-----------+

Imate dva druga koja se zovu Petar Petrovic, ali ste greškom upisali u oba reda isti broj. Rećićete da nema problema, samo ćemo napisati update komandu koja će zameniti broj telefona u jednom redu:
update phone = '063987654' where name = 'Petar Petrovic' and phone = '064123456';

Ta komanda će, nažalost, promeniti oba reda, zato što su oba reda jednaka i filtriranjem po poljima ne možemo nikako da izdvojimo samo jedan red. Rešenje za taj problem je jednostavno: dodamo još jedno polje koje će biti jedinstveno za svaki red. To polje se vrlo često zove id (identifier) i ima tip podatka int (ceo broj). Ovakvo polje se najčešće označava i kao primarni ključ (primary key) što, između ostalog, označava da polje mora da se razlikuje za svaki red, da nikad ne može da bude prazno i da može da se koristi za povezivanje podataka iz drugih tabela.

Za ovu vežbu ćemo napraviti jednostavnu bazu, koja će imati primarni ključ (polje id), datum unosa (polje date) i tekstualnu vrednost (polje value):
create database test; use test; create table data ( id int not null auto_increment, primary key(id), date datetime, value varchar(200) );

Primetićete da za polje id imamo malo još par dodatnih podataka osim tipa. Pošto polje uvek mora imati definisanu vrednost, dodali smo not null što će onemogućiti upis reda koji nema definisanu vrednost. Da ne bismo svaki put morali ručno da upisujemo vrednost polja, dodali smo i auto_increment što znači da će MySQL sam odrediti vrednost koja će biti upisana u polju, i svaki sledeći put će upisati sledeću veću vrednost. Na taj način dobijamo jedinstven broj za svaki red bez potrebe da ga sami generišemo. Posle definicije polja, imamo i komandu primary key(id) koja označava da je polje id primarni ključ.

Hajde da upišemo jednu vrednost:
insert into data (date, value) values (now(), 'test');

Kao što vidite, vrednost polja id nismo definisali, pošto će MySQL da se pobrine za to. Umesto da datum upišemo sami, iskoristili smo funkciju now() koja vraća trenutno vreme i datum. Ako pogledamo šta imamo zapisano u bazi, dobićemo nešto ovakvo:
select * from data; +----+---------------------+-------+ | id | date                | value | +----+---------------------+-------+ |  1 | 2013-03-17 17:55:18 | test  | +----+---------------------+-------+ 1 row in set (0.00 sec)

Pošto je id polje jedinstveno za svaki red, filtriranjem redova po njemu možemo pronaći tačno onaj red koji nas zanima.

Ovu bazu nemojte brisati, pošto ćemo je iskoristiti i u narednom koraku.



[4.2] MySQL Improved Extension


Napravićemo malu aplikaciju koja će obaviti sve standardne akcije na bazi… sve od povezivanja, preko uređivanja i prikaza podataka, do prekida konekcije. Pošto je aplikacija prilično jednostavna, počnimo pregledom celog koda, a zatim ćemo preći deo po deo:
<!DOCTYPE html> <html>     <head>         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">         <title>MySQL Test</title>     </head>     <body>         <?php         $driver = new mysqli_driver();         $driver->report_mode = MYSQLI_REPORT_STRICT;         try         {             echo 'Otvaranje baze</br></br>';             $db = new mysqli('localhost', 'root', 'toor', 'test');             echo 'Pražnjenje tabele</br></br>';             $db->query('truncate table data');             echo 'Upis podataka</br></br>';             $values = array('vrednost1', 'vrednost2', 'vrednost3');             foreach($values as $value)                 $db->query("insert into data (date, value) values (now(), '$value')");             echo 'Prikaz podataka</br>';             foreach($db->query('select * from data') as $row)                 echo $row['id'] . ' ' . $row['date'] . ' ' . $row['value'] . '</br>';             echo '</br>';             echo 'Brisanje reda sa ID = 2</br></br>';             $db->query('delete from data where id = 2');             echo 'Promena reda sa ID = 3</br></br>';             $db->query('update data set value = \'nova vrednost\' where id = 3');             echo 'Prikaz podataka</br>';             foreach($db->query('select * from data') as $row)                 echo $row['id'] . ' ' . $row['date'] . ' ' . $row['value'] . '</br>';             echo '</br>';             echo 'Zatvaranje baze</br></br>';             $db->close();         }         catch (mysqli_sql_exception $e)         {             echo 'Greška: ' . $e->getMessage();         }         ?>     </body> </html>

MySQLI ima mogućnost da uključi ili isključi bacanje izuzetaka (exception) u slučaju greške. Prednost izuzetaka je da ne moramo da proveravamo svaku funkciju posebno da li je uspela. Dovoljno je da deo koda koji može izazvati grešku stavimo u try blok, a deo koda koji obrađuje grešku u catch blok. Time se količina koda znatno smanjuje, a time dobijamo kod koji se lakše čita i održava. Da bismo uključili bacanje izuzetaka, potrebno je postaviti drajver-ov report_mode na MYSQLI_REPORT_STRICT:
$driver = new mysqli_driver(); $driver->report_mode = MYSQLI_REPORT_STRICT;

Otvaranje baze se vrši kreiranjem objekta mysqli i prosleđivanjem podataka o konekciji (ime servera, korisničko ime i šifra, i ime baze):
$db = new mysqli('localhost', 'root', 'toor', 'test');

Prva komanda koju u našem primeru pozivamo će izbrisati sve podatke iz tabele data. Verovatno ste opazili da ne koristimo akciju delete nego truncate. Postoje dve bitne razlike između ove dve akcije. Prva je da truncate uvek briše sve podatke iz tabele (filtriranje nije moguće), a druga je da truncate resetuje AUTO_INCREMENT polja. To znači da će id polje posle truncate akcije ponovo početi od 1. Kod akcija koje ne vraćaju podatke dovoljno je samo pozvati query komandu:
$db->query('truncate table data');

Kod akcija koje vraćaju podatke (select) kao rezultat dobijamo objekat preko kojeg možemo pristupiti svim redovima. Korišćenje foreach komande je jedan od načina za čitanje svih redova:
foreach($db->query('select * from data') as $row)     echo $row['id'] . ' ' . $row['date'] . ' ' . $row['value'] . '</br>';
Kao što vidite, do polja pristupamo preko njihovih imena.

Za kraj ostaje zatvaranje baze, a ta akcija se vrši komandom:
$db->close();

Informacija ::Idea Svima koji se još nisu sreli s izuzecima u PHP-u predlažem da pogledaju dokumentaciju.



[4.3] PHP Data Objects


Korišćenje PDO je skoro potpuno isto kao i korišćenje MySQLI. Pogledajmo kod koji radi sve isto kao i prethodni, ali uz upotrebu PDO:
<!DOCTYPE html> <html>     <head>         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">         <title>MySQL Test</title>     </head>     <body>         <?php         try         {             echo 'Otvaranje baze</br></br>';             $db = new PDO('mysql:host=localhost;dbname=test', 'root', 'toor');             echo 'Pražnjenje tabele</br></br>';             $db->query('truncate table data');             echo 'Upis podataka</br></br>';             $values = array('vrednost1', 'vrednost2', 'vrednost3');             foreach($values as $value)                 $db->query("insert into data (date, value) values (now(), '$value')");             echo 'Prikaz podataka</br>';             foreach($db->query('select * from data') as $row)                 echo $row['id'] . ' ' . $row['date'] . ' ' . $row['value'] . '</br>';             echo '</br>';             echo 'Brisanje reda sa ID = 2</br></br>';             $db->query('delete from data where id = 2');             echo 'Promena reda sa ID = 3</br></br>';             $db->query('update data set value = \'nova vrednost\' where id = 3');             echo 'Prikaz podataka</br>';             foreach($db->query('select * from data') as $row)                 echo $row['id'] . ' ' . $row['date'] . ' ' . $row['value'] . '</br>';             echo '</br>';             echo 'Zatvaranje baze</br></br>';             $db = null;         }         catch (PDOException $e)         {             echo 'Greška: ' . $e->getMessage();         }         ?>     </body> </html>

PDO objekti su napisani tako da uvek bacaju izuzetke i nema potrebe da ih uključujemo posebnom komandom. Konekcija se kreira na sličan, ali malo drugačiji način:
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'toor');
Prvi parametar označava da želimo da se povežemo na MySQL bazu i daje podatke o imenu servera i baze, dok su drugi i treći podatak korisnički podaci za povezivanje (ime i šifra).

Pozivanje osnovnih SQL komandi je isto kao i sa MySQLI. Kao što možete videti, taj deo koda je identičan prethodnom primeru.

Za kraj, komanda za zatvaranje baze ne postoji, potrebno je samo osloboditi referencu na PDO objekat:
$db = null;

Ovim smo zaključili postavljanje internet servera, instaliranje baze i upoznavanje sa osnovnim akcijama nad podacima iz PHP-a.



Internet serveri
Uvod u REST i URL rewrite



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Skri imam problem pri instalaciji MySQL. Ukucam ono što si napisao u Command Prompt i izađe mi ovo:

Install/Remove of the Service Denied

Ne znam što mi sada to izlazi kad sam ja administrator Bebee Dol



offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14809
  • Gde živiš: Niš

Napisano: 08 Apr 2013 13:08

Pa jesi li cmd pokrenuo kao administrator?

Dopuna: 08 Apr 2013 13:10

Citat:just go to control panel & turn off the UAC control

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ako koristiš Windows Vista ili noviji i imaš uključen UAC, moraš eksplicitno da pokreneš program kao administrator (desni klik, pa Run as administrator).

Ko je trenutno na forumu
 

Ukupno su 1257 korisnika na forumu :: 54 registrovanih, 9 sakrivenih i 1194 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 8u47, airsuba, Alibaba1981, amonsrb, Apok, aramis s, bagor10, Bobrock1, bokisha253, Boris Bosiljčić, celik, cemix, cifra, dankisha, Darko001, darkstar101, dejina811, DonRumataEstorski, flash12, Georgius, GORDI, goxin, HrcAk47, ILGromovnik, ivicasimo, JOntra, kikisp, kjkszpj, Koridor, KOV, krkalon, Krvava Devetka, kybonacci, Litostroton, LUDI, MB120mm, mercedesamg, Mercury, mikrimaus, moldway, nextyamb, Parker, raso7, Reinhardt, Shinobi, slonic_tonic, Stoilkovic, vathra, wizzardone, wolverined4, YugoSlav, Zaledjeni, zixmix, 1107