Jedno od glavnih područja u kojima se primjenjuje PHP je korištenje baze podataka. Najčešće korištena vrsta baza podataka su SQL ( skraćeno od Structured Query Language ) - baze podataka koje a se obrađuju uz pomoć jezika SQL.
PHP se koristi (povezuje) sa više vrsta baza podataka, posebno popularna je svakako MySQL. Prednosti MySQL baze podataka su da je relativno brza i besplatna. Instalacija je prilično jednostavna tako da je neću opisivati u ovom tutorijalu. S instalacijom MySQL-a dolazi i nekoliko aplikacija za rad s bazom u kojima se mogu upisivati SQL upiti prema bazi.
Radi jednostavnosti tutorijala ograničit ćemo se samo na jednu tabelu.
Tabela 'uo' (ugostiteljski objekti):
ID |
Ime |
Vrsta |
Ocjena |
Komentar |
1 |
Složna braca |
restoran |
10 |
Glazba uživo |
2 |
Zelena dolina |
kavana |
8 |
Domaći specijaliteti |
SQL naredba za kreiranje ove tabele bi bila:
CREATE TABLE `uo` (
`ID` INT AUTO_INCREMENT,
`Ime` CHAR (50,
`Vrsta` CHAR (10),
`Ocjena` INT,
`Komentar` CHAR(100));
Iz koda je vidljivo što ovom naredbom radimo: kreiramo tabelu 'uo'; jedinstvenu vrijednost 'ID' koja se automatski povećava svakim upisom u bazi; polje 'Ime' duljine 50 znakova; polje 'Vrsta' od 10 znakova; polje 'Ocjena' je tipa integer; i konačno polje 'Komentar' je znakovno duljine 100 znakova.
Sad bi mogli napraviti više tabela, tabele povezati itd. U biti koristimo se najčešće sa četiri vrste upita:
Ako želimo pogledati sva imena ugostiteljskih objekata iz baze to postižemo sa SQL-naredbom:
SELECT Ime FROM uo;
Odgovor bi bio :
Ako želimo vidjeti ime i vrstu onda bi SQL-naredba bila:
SELECT Ime, Vrsta FROM uo;
Odgovor bi bio :
Cijeli "element" tj. cijeli red dobili bi sa:
SELECT *
FROM uo;
Odgovor bi bio
Podatke koje želimo da vidimo možemo specificirati po volji.
Npr. sa:
SELECT * FROM uo
WHERE Ocjena=10;
dobijamo samo objekte koje u koloni Ocjena u BP imaju upisanu vrijednost 10.
Odgovor bi bio
Sa:
SELECT * FROM uo
WHERE Ocjena=10 ORDER BY Ime ASC;
Odgovor bi bio:
dobijamo objekte sa ocjenom 10, poredane po imenu (ASC označava uzlazno sortiranje, dok DESC označava silazno sortiranje)..
Nove "redove" možemo dodati sa:
INSERT INTO uo
(Ime, Vrsta, Ocjena, Komentar)
VALUES
('Saša', 'bistro', '9', 'Pivo');
Znači, ovim bi dodali bistro Saša u konkurenciju sa ocjenom 9 koja ima pivo.
Postojeće zapise možemo promijeniti sa:
UPDATE uo
SET Ocjena=6, Komentar='Jela su jeftina'
WHERE ID=2;
Ovoliko za početak i u osnovnim crtama o SQL-u.
SQL je vrlo mocan jezik, pogotovo kad se radi o kombiniranju upita za i iz više tabela istovremeno ( join, outer join,.. ), transakcijama, procedurama ili sličnim naprednijim svojstvima baza ppodataka.
Prije pristupa MySQL-u iz PHP-a trebamo uspostaviti vezu izmedju PHP-a i servera baze podataka:
<?php
$veza =
@mysql_connect('localhost', 'a', 'b');
?>
Varijabla $veza sada sadrži identifikator veze na bazu.
'localhost' označava ime servera. Na isti način s jednog servera na kojem se pokreće PHP može se spojiti na bilo koji server s MySQL bazom podataka - samo u funkciji mysql_connect 'localhost' zamijenimo s imenom servera.
'a' i 'b' je važeće korisničko ime i lozinka za ovu bazu podataka (određeno od strane administratora baze) koje je potrebno za spajanje
Da li je veza uspostavljena možemo provjeriti sa:
<?php
if (!$veza) {
echo "Greška!";
exit;
}
?>
Ako već imamo uspostavljenu vezu, možemo početi sa upitima:
<?php
$upit="SELECT Ime, Vrsta FROM uo";
$rez=mysql_query($upit, $veza);
?>
Ovaj upit se šalje na server bazi podataka. Rezultat koji on vrati pamti se u varijabli $rez. Sad trebamo pročitati "redove" koji su upisani u varijabli $rez.
Iz rezultata sadržanih u tabeli 'uo' mi smo tražili atribute Ime i Vrsta. Sada ćemo ih čitati i to red po red:
<?php
while ($red=mysql_fetch_array($rez)) {
echo 'Ime: ', $red['Ime'];
echo 'Vrsta: ', $red['Vrsta'];
echo '<br>';
}
?>
Pomoću PHP funkcije 'mysql_fetch_array' vadimo jedan redak po redak, i prebacujemo u asocijativno polje '$red' koje se kreira automatski prema nazivima atributa u bazi. Prvo pozivanje 'mysql_fetch_array' pomiče varijablu $rez na sljedeći podatak tako da se unutar while petlje ispišu svi podaci.
Na kraju je još preporučljivo zatvoriti vezu sa MySQL, makar se PHP automatski o tome pobrine:
<?php
mysql_close($veza);
?>
Pisanju u MySQL bazu slično je čitanju, samo što upitu moramo predati neke varijable. Primjerice:
<?php
$upit="DELETE FROM uo WHERE ID=".$neki_id;
$rez=mysql_query($rez, $veza);
?>
će iz tablice uo obrisati sve zapise koje kao svoj ID imaju vrijednost koja se nalazi u varijabli $neki_id.
Ako se podaci preuzimaju s nekog obrasca koji popunjava korisnik, obavezno je dobro provjeriti kakve po datke nam korisnik šalje jer bi se lako moglo dogoditi da nam posjetitelj obriše sve podatke iz tablice ili baze. Primjerice, ako od korisnika očekujemo neki integer broj provjeriti da li je taj zaista integer pomoću ugrađenih PHP funkcija is_int(string) ili pomoću pretvorbi tipova $a=(int)$a;.
Ako od korisnika očekujemo string, obavezno taj string prije upisivanja u bazu "očistiti" pomoću funkcije mysql_real_escape_string() koja stavlja backslash prije znakova \x00, \n, \r, \, ', " i \x1a. Ako to ne učinimo na taj način ili neki drugi, lako nam se može dogoditi da korisnik u polje za unos, recimo imena, unese sljedeći string "Pero'; DELETE FROM uo WHERE 1=1;". Ako nakon ovakvog unosa izvršimo kod:
<?php
$upit="SELECT *
FROM uo
WHERE ime='".$str."'";
$rez=mysql_query($rupit, $veza);
?>
zapravno ćemo izvršiti sljedeći upit:
<?php
SELECT * FROM uo WHERE ime= 'Pero';
DELETE FROM uo WHERE 1=1"
?>
što će obrisati cijelu tablicu 'uo'.
Dakle, prilikom rada s podacima koje nam šalju posjetiteljiweb stranica, nikakvim podacima ne smijemo vjerovati i uvijek prilikom izrade PHP skripti treba razmišljati kako bi nas "zli" korisnik mogao oštetiti!