05. Dodatak na predavanje

Osnove PHP programiranja

Kako zaprimiti argumente s web-strenica ?

U trećem smo dodatku vidjeli kako se preko web-stranicama mogu prenositi argumenti dinamičkim web-stranicama. Bazično postoje 2 načina, i to potem POST i putem GET metode. Za detalje pogledati treći dodatak.

Argumenti poslani dinamičkoj web stranici dostupni su u php skriptu preko globalnih varijabli $HTTP_POST_VARS[...] i $HTTP_GET_VARS[...] koje su u stvari nizovi varijabli (ili array).

Naprimjer ako je link na dinamičku web stranicu:

    <a href="http://web.server.com/putanja/web_stranica.php?ime=nesto">
Primjer 1. Html link na dinamičku web stranicu web_stranica.php

onda unutar dinamičke web-stranice web_stranica.php iznos varijable ime s može dobiti iz $HTTP_GET_VARS['ime'], i taj iznos bit će jednak nesto, odnosno onome što je navedeno u html linku iza znaka jednakosti: ime=nesto. Metodu GET moguće je koristiti i unutar obrasca, s tim da se ta metoda navede u definiciji html obrasca: <form method="GET" action=...>, tj u html FORM-tagu.

Dakako ako je u definiciji obrasca navedeno da se koristi POST metoda, onda je potrebno koristiti $HTTP_POST_VARS globalni array.

    .... html tagovi ....
    <!-- ovaj dio stranice je html obrazac -->

    <form method="POST" action="http://web.server.com/putanja/web_stranica.php">

    <!-- ovdje je kućica gdje se treba upisati ime -->

    Upiši ime: <input type="text" name="ime" value="">
    
    <!-- i na kraju svega treba imati gumb kojim se šalju podaci
    web stranici navedenoj u FORM-tagu na samom počeku obrasca -->

    <input type="submit" value=" Pošalji podatke ">

    </form>

    <!-- kraj obrasca -->
    .... html tagovi ....
Primjer 2. Primjer obrasca koji šalje podatke dinamičkoj web stranici web_stranica.php

Da ponovimo argumenti, su dostupni preko globalnih array varijabli $HTTP_POST_VARS i $HTTP_GET_VARS. To je ono što treba zapamtiti.

Komunikacija php skripta s PostgreSQL bazom podataka

Da bismo ilustrirali komunikaciju primjerima, potrebno je prethodno stvoriti bazu podataka koju ćemo u primjerima koristiti. Ovdje će biti navedena kratka procedura bez detaljnih objašnjenja. Detaljnija procedura bit će obrađena na drugim predavanjima.

Priprema baze podataka

Dakle baza podataka je kolekcija međusobno povezanih relacija u koje spremamo podatke. Baza podataka ima svoje ime koje je potrebno navoditi u komunikaciji s bazom podataka, jer PostgreSQL (i druge DBMS) mogu podržavati više raznih baza podataka istovremeno.

Na računalu na kojem je instaliran PostgreSQL ne može svaki korisnik stvarati baze podataka. To mogu samo oni autorizirani za to. Autorizaciju daje administrator koji treba stvoriti PostrgeSQL korisnika te mu definirati prava korišenja. U tom procesu stvaranja korisnika se definira i je li ta osoba ima pravo stvaranja svojih baza podataka.

Na primjeru

	prompt> createuser --no-adduser --createdb pero
Primjer 3. Autorizacija korisnika za korištenje PostgreSQL.

se autoriziralo korisnika pero da može stvarati podataka, ali me može raditi autorizaciju drugih korisnika u uporabi baze (opcija: --no-adduser).

Evo kako će korisnik pero napraviti svoju bazu podataka koja ima ime perodb:

	perin_prompt> createdb -E LATIN2 perodb
Primjer 4. Komanda za stvaranje baze podataka.

Opcija "-E LATIN2" znači da će podaci u bazi podataka perodb biti spremani u isolatin2 standardu. isolatin2 je jedan od standarda zapisivanja slova i ostalih znakova.

Baza podataka koju je pero stvorio ne sadrži u sebi nikakve podatke. Nju tek treba popuniti s relacija/tablicama. Svaka relacija/tablica ima svoje ime i strukturu u kojoj su naznačeni atributi i tip atributa. Da bi se stvorila relacija s određenim atributima potrebno je koristiti SQL naredbu CREATE TABLE. SQL je jezik kojim se komunicira s bazom podataka radi upisivanje, manipuliranja, brisanja podataka. Više o tim naredbama može se naći u priručniku za PostgreSQL (sql komande) ali i drugdje.

Neka je korisnik pero zapisao sql komande za stvaranje tablice i za upisivanje podataka u posebnu datoteku: pfi.psql.

Pogledajmo početak te datoteke:


CREATE TABLE student (
	prezime VARCHAR(50),
	ime     VARCHAR(50),
	indeks  VARCHAR(10),
	godina  INT,
	smjer   VARCHAR(10),
	PRIMARY KEY (indeks)
	);
GRANT SELECT ON student TO PUBLIC;

INSERT INTO student VALUES ('ANTOLIĆ','ANITA','F-1961',2,'pfi');
INSERT INTO student VALUES ('ANTOLKOVIĆ','VLATKA','F-1761',2,'pfi');
INSERT INTO student VALUES ('BABIĆ','GORDAN','F-2523',1,'pfi');
....... itd .....
Primjer 5. Datoteka s SQL naredbama.

To su u stvari podaci o stentima koji su upisali smer Profesor fizike i informatike na PMF (Zagreb). Prvi dio sadrži naredbu za definiciju relacije s imenom student koja ima nekoliko atributa: prezime, ime, indeks, godina i smjer. Druga SQL naredba GRANT SELECT definira pravo pretraživanja na relaciji student, tj. ona daje to pravo svakome. Međutim, nitko osim vlasnika baze podataka neće moći mjenjati te podatke. Nakon toga slijedi niz INSERT naredbi s kojima se upisuju podaci u relaciju.

Dakle što učiniti s tom datotekom? Iskoristit ćemo naredbu psql (odnosno program), koja će izvrštiti te SQL naredbe jednu za drugom:

	perin_prompt> psql perodb < pfi.psql
Primjer 6. Korištenje psql naredbe.

Kako mi znamo da su podaci upisani u bazu podataka ? Za to nam služi opet psql komanda. U slijedećem primjeru, programu/komandi psql se naredbe daju interaktivno. Prva je "\dt" koja izlista sve relacije u bazi podataka perodb. Druga naredba je "\d student" koja ispisuje strukturu relacije student. Treća komanda je SQL naredba SELECT koja traži studenta s zadanim brojem indeksa. Konačno iz samo programa psql se izlazi s naredbom "\q"


perin_prompt> psql perodb

Welcome to psql, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

perodb=# \dt

    List of relations
  Name   | Type  | Owner
---------+-------+-------
 student | table | pero
       (1 row)

perodb=# \d student

               Table "student"
 Column  |         Type          | Modifiers
---------+-----------------------+-----------
 prezime | character varying(50) |
 ime     | character varying(50) |
 indeks  | character varying(10) | not null
 godina  | integer               |
 smjer   | character varying(10) |
Primary key: student_pkey

perodb=# SELECT ime,prezime FROM student WHERE indeks='F-1761';

  ime   |  prezime
--------+------------
 VLATKA | ANTOLKOVIĆ
   (1 row)

perodb=# \q

perin_prompt>

Primjer 7. Korištenje psql naredbe.

Korisnik pero odlučio je napraviti još jednu relaciju u koju će spremati adrese studenata. Te će posao pupunjavanja podacima, tj. adresama prepustiti samim studentima kroz web-obrazac. Datoteka s naredbom za definiranje relacije s adresama je u datoteci addr.psql. U toj datoteci postoje dvije SQL naredbe za dozvolu pristupanja podacima. Jedna daje dozvolu pregledavanja podataka svim korisnicima, dok druga daje dozvolu samo korisniku "www-data" da upisuje, mijenja i ispravlja podatke.


CREATE TABLE adresa (
	indeks	VARCHAR(10),
	email	VARCHAR(50),
	ulica	VARCHAR(50),
	grad	VARCHAR(30),
	PRIMARY KEY(indeks)
	);

GRANT SELECT, INSERT, UPDATE ON adresa TO "www-data";
GRANT SELECT ON adresa TO PUBLIC;

Primjer 8. Struktura relacije adresa.

Zašto?
Zato jer će se upis i ažuriranje raditi preko web-servera koji radi pod korisničkim imenom "www-data" (specifično za Debian linux, na drugim platformama web-server korisnik ima neko drugo ime!). Kao i obično, SQL naredbe iz addr.psql mogu se izvršiti preko psql komande: psql perodb < addr.psql.

Ima još jedna sitnica ali važna. Administrator baze podataka more dati dozvolu www-data korisniku za pristupanje podacima. Ako to nije, web-server neće moći dobivati podatke od baze podataka. Procedura je standardna:

	prompt> createuser --no-adduser --no-createdb www-data
Primjer 9. Autorizacija www-data korisnika.

Korisnik www-data neće moći stvarati nove baze podataka, a niti će moći autozirati druge korisnike. (Ali možda je administrator baze podataka bio dalekovidan pa je ovaj korak već prije napravio:-)

Dakle, sada imamo izgrađenu bazu podataka kojoj možemo pristupati kroz dinamičke web stranice.

Priprema php skripti

Općenito, u PHP skripti se koristi par specijaliziranih komandi za PostgreSQL bazu podataka. Detaljnije o tim komandama može se naći u priručniku za PHP. Ovdje ćemo navesti par važnijih za postizavanje našeg cilja.

1. korak
je spajanje sa serverom baze podataka. Za to se koristi php naredba pg_connect:
	$veza = pg_connect ("dbname=perodb");
Primjer 10. Spajanje s bazom podataka.

Kao argument toj komandi je string koji sadrži ime stroja na kojem se nalazi baza podataka (u ovom slučaju, localhost znači za isti stroj na kojem se nalazi i web-server) i ime baze podataka, kao npr. perodb. Rezultat te funkcije je veličina $veza koja se koristi u ostalim PHP komandama kao referenca za bazu podataka.

2. korak
je pretraživanje podataka ili upit. Npr. ako se želi dobiti lista studenata s prve godine studija:
	$rez = pg_query($veza,"SELECT ime,prezime FROM student WHERE godina=1");
Primjer 11. Komanda za pretraživanje.

Pretraživanje može dovesti do greške, pa je pogodno komandu za pretraživanje kombinirati s komandom za ispis greške, ako do nje dođe.

	$rez = pg_query($veza,"SELECT ime,prezime FROM student WHERE godina=1")
		or die ("Greška u upitu. " . pg_errormessage($veza));
Primjer 12. Komanda za pretraživanje i ispis greške.
U 3. se koraku
može odrediti je li je SQL komanda uopće dala neke rezultate u pretraživanju. Ako jest, onda se ti rezultati mogu pregledati u narednom koraku.
4. korak
je pregledavanje rezultata za što se koristi jedna od PHP petlji:
   // $broj je broj nađenih n-torki u relaciji

   $broj = pg_numrows($rez);

   if ($broj > 0)
   {
	for ($i=0; $i<$broj; $i++)
	{
		$redak = pg_fetch_array($rez, $i, PGSQL_ASSOC);

		// podaci su u $redak['ime'] i $redak['prezime']

		$ispis = "ime: $redak['ime'] $redak['prezime']<br>";

		echo ($ispis);
	}
   }
Primjer 13. Komanda za pregledavanje svih dobivenih rezultata.
5. (konačni) korak
je zatvaranje veze prema serveru baze podataka:
   $rez = pg_close($veza);
Primjer 14. Komanda za zatvaranje veze prema serveru baze podataka.

Pogledajmo dva detaljna primjera koja odgovaraju problemu koji je postavio korisnik pero, s tom razlikom da se podaci nalaze u bazi podataka nazvanoj faklutet.

  1. U prvom se ispisuje lista studenata s određene godine studija, smjer profesor fizike i informatike. Na početnoj je stranici potrebno odabrati godinu studija, što je učinjeno preko html-obrasca sa html SELECT-tagom. Izabrana godina studija proslijeđuje se PHP skriptu (izvorni kod skripta) koji u bazi podataka pronađe listu i ispisuje je.
  2. Drugi je primjer sličan prvom, ali u njemu se dopušta da se podaci o adresama studenata upisuju, odnosno mijenjaju. Toje postignuto s nizom php skripti: 02_pr.php, 02_addr.php, 02_upis.php, koje pozivaju jedna drugu.