This document was uploaded by user and they confirmed that they have the permission to share
it. If you are author or own the copyright of this book, please report to us by using this DMCA
report form. Report DMCA
Baze podataka i PHP. Primer aplikacije u PHP-u Lekcija 15
IT350 - BAZE PODATAKA Lekcija 15
BAZE PODATAKA I PHP. PRIMER APLIKACIJE U PHP-U Baze podataka i PHP. Primer aplikacije u PHP-u Poglavlje 1: PHP i baze podataka Poglavlje 2: Konekcija na bazu podataka putem PHP-a Poglavlje 3: Rad sa bazama podataka u PHP-u Poglavlje 4: Primer PHP/MySQL aplikacije Zaključak
Uvod UVOD Šta ćemo naučiti u ovoj lekciji? U ovom predavanju obrađivaćemo različite interfejse (API) kojima moćemo povezati našu PHP aplikaciju sa bazom podataka. PHP podržava rad sa različitim sistemima za upravljanje bazama podataka, kako sa relacionim tako i sa ostalim tipovima sistema. Primeri koji ći biti obrađivani u ovom predavanju radiće sa MySQl bazom podataka i uključuju: • • • •
Uspostavljenje konekcije sa bazom podataka. Kreiranje SQL ili MySQL naredbi. Izvršenje SQL ili MySQL upita u bazi podataka. Pregledavanje i modifikacija rezultujućih slogova.
U drugom delu predavanja dat je primer jedne PHP aplikacije koja komunicira sa bazom podataka. Aplikacija za testiranje studenata je izrađena korišćenjem PHP-a (pored ostalih front-end tehnologija) i za čuvanje podataka koristit MySQL sistem upravaljanja bazama podataka.
3
Poglavlje 1 PHP i baze podataka PHP DATA OBJECTS PHP Data Objects ekstrenzija definiše interfejse za pristup bazama podatka PHP Data Objects (PDO) ekstenzije definišu lake i konzistentne interfejse za pristup bazama podataka u PHP-u. Svaki drajver baze podataka koji implementuje PDO interfejs može izložiti karakteristike specifične za datu bazu podataka kao funkcije regularnih izraza. Ono na šta morate obratiti pažnju je da ne možete obavljati nikakve funkcije nad bazom podataka samo sa PDO ekstenzijom. Pored toga morate konfigurisati i koristiti i PDO drajvere za pristup bazi podataka na serveru. PDO drajveri su specifični za svaki sistem upravljanja bazama podataka. PDO obezbeđuje pristup podacima na apstraktnom nivou, što znači da, bez obzira na to koji sistem upravljanja bazama podataka koristite, uvek će te koristiti iste funkcije da izvršite neki upit nad bazom podataka ili da prikupite podatke na osnovu tih upita. PDO ne obezbeđuje apstrakciju baza podataka, ne prerađuje SQL niti imitira karakteristike koji nedostaju. Za to morate korisiti potpuni abstraktni nivo ako su vam potrebne ovakve karakteristike. PDO se prvi put javlja sa verzijom 5,1 PHP-a, ali je moguće koristuti ga i u verziji 5,0 pomoću PECL ekstenzije. Kako PDO zahteva objektno orijentisane mogućnosti PHP-a (uvedene od verzije PHP-a 5,0), ne može se koristii u ranijim vrezijama PHP-a (pre 5,0). Osim PDO-a, PHP ima implemetirane i druge interfesje za pristup različitim bazama podataka na aplstraktnom nivou. • • • •
DBA - pristupa Barkley stilu baza podataka dbx module Unified ODBC - pristupa Adabas D, IBM DB2, iODBC, Solid i Sybase SQL Anywhere. i klasnični ODBC
PDO DRAJVERI Drajveri potrebni za rad Kao što smo napomenuli, PDO interfejs ima implentirane različite drajvere za različite sisteme upravljanja bazama podataka. Nazivi drajvera koji su trenutno implementirani u PDO interfejsu i baze podataka koje su podržane i sa kojima rade navedeni drajveri, dati su na slici 1. 4
Poglavlje 1 PHP i baze podataka
Za sve ostale informacije o ovoj temi posetite oficijalni sajt PHP-a http://php.net/manual/en/refs.database.abstract.php
Slika 1.1 Nazivi PDO drajvera i odgovarajućih baza podataka
MYSQL API-IJI U zavisnosti koju verziju PHP-a koristimo, postoje dva ili tri PHP API-ja za pristup MySQL bazam podataka. U zavisnosti koju verziju PHP-a koristimo, postoje dva ili tri PHP API-ja za pristup MySQL bazam podataka. Ukoliko radimo sa PHP 5 verzijom moćemo odbrati neki od sledećih ekstenzija 1. mysql (zastarela verzija) 2. mysqli 3. PDO_MySQL Počev od verzije PHP 7, ekstenizija mysql nije više podržana i ovakav pristup više nije moguć, već se koriste sledeći 1. mysqli 2. PDO_MySQL 1. mysql - Ova ekstenzija je zastarela sa verzijom 5.5 PHP-a (i dalje ima podršku) i ukljonjena je u verziji 7 PHP-a. Umesto nje, u nadogradnjama postojećih aplikacija, potrebno je preći na mysqli ili PDO_MySQL ekstenzije. Sve nove aplikacije ne bi smele da koriste ovu ekstenziju za pristup bazama podataka. Koristi samo proceduralni interfejs
5
Poglavlje 1 PHP i baze podataka
2. mysqli - je skraćenica za MySQL Improved ekstenziju i može se koristi sa verzijama MySQL-a počev od verzije 4.1. Ovaj ekstenzija pruža dva pristupa (intefesja) u radu sa bazama podataka a. Objektno-orijentisani b. Proceduralni 3. PDO_MySQL - implementira PHP Data Objects (PDO) interfejs kako bi sa aplikaiji omogućio pristup MySQL bazi iz PHP-a. Podržane verzije MySQL-a su 3.x, 4.x, 5.x . Kao i predhodna ekstenzija, koristi OO i proceduralni interfejs. Zvaničan preporuka PHP komjunitija je da se za rad koriste ekstenizije msqli ili PDO_MySQL. Naravno, u cilju vežbanja i dalje je moguće raditi sa mysql ekstenzijom
MYSQL API-IJI - POREĐENJE Uporedni prikaz karakteristika različitih ekstezija - slika 2
Slika 1.2 Uporedni prikaz karakteristika različitih ekstezija
MYSQL API-IJI - KOJI IZABRATI? Kratak video zapis koji upoređuje PDO i mysqli Ova lekcija sadrži video materijal. Ukoliko želite da pogledate ovaj video morate da otvorite LAMS lekciju.
6
Poglavlje 2 Konekcija na bazu podataka putem PHP-a MYSQLI ILI PDO - PITANJE JE SAD? Da li koristiti MySQLi ili PDO pristup otvaranja konekcije Ako vam treba kratak odgovor, on bi glasio "Koji god vam se više sviđa". I MySQLi i PDO imaju svoje prednosti: • PDO radi sa 12 različitih sistema upravljanja bazama podataka - dok MySQLi radi samo sa MySQL bazama podataka • Oba su objektno-orijentisana, dok MySQLi nudii proceduralni pristup. • Oba podržavaju Prepared Statements, što je veoma bitno za bezbednost web aplikacija i štite od SQL Injection-a napada. • Ako morate ili mislite da će u budućnosti morati da promenite SUBP, PDO će vam olakšati ovaj proces. Jedino što trebate da promenite je string konekcije i par upita. Sa MySQLi morali bii ste da prepravite ceo kod - ukljčujući i upite. • Sa druge strane, MySQL je optimizovaniji za rad sa MySQL bazama od PDO-a, pa trba i to uzeti u obzir. U primerima koje slede pokazaćemo tri načina na koji moćete raditi sa PHP-om i MySQL-om • • • •
MySQLi (objektno-orijentisan) MySQLi (proceduralni) PDO (ne navodi se, ali isto OO pristup) + MySQL (zastareli pristup - kao primer)
OTVARANJE KONEKCIJE KA MYSQL-U - I DEO Tri+ načina za uspostvaljanje konekcije na bazu podataka Otvaranje konkecije ka MySQL bazi podataka pomoću objekto-orijetisanog pristupa MySQLi API-u
7
Poglavlje 2 Konekcija na bazu podataka putem PHP-a
Otvaranje konkecije ka MySQL bazi podataka pomoću procduralnog pristupa MySQLi API-u
OTVARANJE KONEKCIJE KA MYSQL-U - II DEO Tri+ načina za uspostvaljanje konekcije na bazu podataka - nastavak Otvaranje konkecije ka MySQL bazi podataka pomoću objekto-orijetisanog pristupa PDO_MySQL API-u setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully";
8
Poglavlje 2 Konekcija na bazu podataka putem PHP-a
I, za kraj, otvaranje konekcije na stari način, proceduralni pristup MySQL API-u
ZATVARANJE KONEKCIJE KA MYSQL-U Zatvaranje konekcije pre kraja rada Konekcija ka bazi podataka će se automatski zatvoriti nakon završetka rada skripte. Ukoliko želimo da to učinimo ranije, možemo to učiniti na sledeće načine. MySQLi - Objektno-orijentisani pristup $conn->close();
MySQLi - Proceduralni pristup mysqli_close($conn);
PDO pristup $conn = null;
MySQL - pristup mysql_close($conn);
Na kraju ove sekcije možete pogledati i kratak video tutorijal koji osuje kako preći sa MySQL na MySQLi
9
Poglavlje 2 Konekcija na bazu podataka putem PHP-a
Ova lekcija sadrži video materijal. Ukoliko želite da pogledate ovaj video morate da otvorite LAMS lekciju.
KAKO SE KONEKTOVATI NA MYSQL BAZU PODATAKA - VIDEO Video zapis koji objašnjava oba pristupa (PDO i MySQLi) otvaranje konekcije ka bazi podataka Ova lekcija sadrži video materijal. Ukoliko želite da pogledate ovaj video morate da otvorite LAMS lekciju.
10
Poglavlje 3 Rad sa bazama podataka u PHP-u KREIRANJE BAZE PODATAKA KROZ PHP - OBJEKTNOORIJENTISANI MYSQLI Primer kreiranja test baze podataka - OO MySQLi Dati primer prikazuje kreiranja baze podataka sa nazivom "MyDB" koristeći objektnoorijentisani pristup MySQli API-ja. connect_error) { die("Connection failed: " . $conn->connect_error); } // Create database $sql = "CREATE DATABASE myDB"; if ($conn->query($sql) === TRUE) { echo "Database created successfully"; } else { echo "Error creating database: " . $conn->error; } $conn->close(); ?>
KREIRANJE TABELE KROZ PHP - OBJEKTNOORIJENTISANI MYSQLI Primer kreiranja test tabele Dat je primer kreiranja tabele MyGuests (SQL kod ove tabele je dat ispod) koristeći objektnoorijentisani pristup MySQli API-ja.
11
Poglavlje 3 Rad sa bazama podataka u PHP-u
CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) connect_error) { die("Connection failed: " . $conn->connect_error); } // sql to create table $sql = "CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; if ($conn->query($sql) === TRUE) { echo "Table MyGuests created successfully"; } else { echo "Error creating table: " . $conn->error; } $conn->close(); ?>
UNOS PODATAKA U TABELE KROZ PHP - OBJEKTNOORIJENTISANI MYSQLI Primer unosa podataka utabelu MyGuest Dat je primer unosa podata u tabelu MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći objektno-orijentisani pristup MySQLi API-ja.
12
Poglavlje 3 Rad sa bazama podataka u PHP-u
CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . " " . $conn->error; } $conn->close(); ?>
NAREDBA SELECT U PHP-U - OBJEKTNOORIJENTISANI MYSQLI Primer SELECT naredbe na tabelom MyGuest Dat je primer naredbe SELECT nad tabelom MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći objektno-orijentisani pristup MySQLi API-ja. CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30)
PREPARED STATEMENT U PHP-U - MYSQLI Primer Prepared Statement-a na tabelom MyGuest Dat je primer Prepared Statement-a - naredbe INSERT u tabelu MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći MySQLi API. Prepared Statement se istovetno koriste i kod OO pristupa i kod proceduralnog pristupa MySQLi API-ju CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50),
SELECT I INSERT NAREDBE - VIDEO Video tutorijal koji demonstrira kao se unose podaci i izvršavaju upiti nad bazom podataka
15
Poglavlje 3 Rad sa bazama podataka u PHP-u
Ova lekcija sadrži video materijal. Ukoliko želite da pogledate ovaj video morate da otvorite LAMS lekciju. Ova lekcija sadrži video materijal. Ukoliko želite da pogledate ovaj video morate da otvorite LAMS lekciju.
3.1 MySQLi proceduralni pristup bazama podataka KREIRANJE BAZE PODATAKA KROZ PHP - PROCEDURALNI MYSQLI Primer kreiranja test baze podataka - Proceduralni MySQLi Dati primer prikazuje kreiranja baze podataka sa nazivom "MyDB" koristeći proceduralni pristup MySQli API-ja.
KREIRANJE TABELE KROZ PHP - PRECEDURALNI MYSQLI Primer kreiranja test tabele Dat je primer kreiranja tabele MyGuests (SQL kod ove tabele je dat ispod) koristeći proceduralni pristup MySQli API-ja.
16
Poglavlje 3 Rad sa bazama podataka u PHP-u
CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )
UNOS PODATAKA U TABELE KROZ PHP - PRECEDURALNI MYSQLI Primer unosa test podataka u tabelu Dat je primer unosa podataka u tabelu MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći preceduralni pristup MySQLi API-ja.
17
Poglavlje 3 Rad sa bazama podataka u PHP-u
CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) " . mysqli_error($conn); } mysqli_close($conn); ?>
NAREDBA SELECT U PHP-U - PRECEDURALNI MYSQLI Primer SELECT naredbe na tabelom MyGuest Dat je primer naredbe SELECT nad tabelom MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći preceduralnii pristup MySQLi API-ja. CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30)
3.2 PDO pristup bazama podataka KREIRANJE BAZE PODATAKA KROZ PHP - PDO Primer kreiranja test baze podataka - PDO Dati primer prikazuje kreiranja baze podataka sa nazivom "MyDB" koristeći OO pristup PDO_MySQL
19
Poglavlje 3 Rad sa bazama podataka u PHP-u
$password = "password"; try { $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "CREATE DATABASE myDBPDO"; // use exec() because no results are returned $conn->exec($sql); echo "Database created successfully "; } catch(PDOException $e) { echo $sql . " " . $e->getMessage(); } $conn = null; ?>
KREIRANJE TABELE KROZ PHP - PDO Primer kreiranja test tabele Dat je primer kreiranja tabele MyGuests (SQL kod ove tabele je dat ispod) koristeći objektnoorijentisani pristupPDO_MySQL API-ja. CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // sql to create table $sql = "CREATE TABLE MyGuests (
20
Poglavlje 3 Rad sa bazama podataka u PHP-u
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; // use exec() because no results are returned $conn->exec($sql); echo "Table MyGuests created successfully"; } catch(PDOException $e) { echo $sql . " " . $e->getMessage(); } $conn = null; ?>
UNOS PODATAKA U TABELE KROZ PHP - PDO Primer unosa test podataka u tabelu Dat je primer unosa podataka u tabelu MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći objektno-orijentisani pristup PDO API-ja. CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) connect_error) { die("Connection failed: " . $conn->connect_error); }
21
Poglavlje 3 Rad sa bazama podataka u PHP-u
$sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . " " . $conn->error; } $conn->close(); ?>
NAREDBA SELECT U PHP-U - PDO Primer SELECT naredbe na tabelom MyGuest Dat je primer naredbe SELECT nad tabelom MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći PDO API. CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql); if ($result->num_rows > 0) { echo "
ID
Name
"; // output data of each row while($row = $result->fetch_assoc()) {
PREPARED STATEMENT U PHP-U - PDO Primer Prepared Statement-a na tabelom MyGuest - PDO Dat je primer Prepared Statement-a - naredbe INSERT u tabelu MyGuests naše baze myDB (SQL kod ove tabele je dat ispod) koristeći PDO API. CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // prepare sql and bind parameters $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)"); $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':lastname', $lastname); $stmt->bindParam(':email', $email); // insert a row
KAKO IZVRŠITI UPITE SA PREPARED STATEMENT-OM - VIDEO Video tutorijal koji demonstrira kao se izvršavaju upiti nad bazom podataka pomoću Preperd Statement-a Ova lekcija sadrži video materijal. Ukoliko želite da pogledate ovaj video morate da otvorite LAMS lekciju.
24
Poglavlje 4 Primer PHP/MySQL aplikacije APLIKACIJA ZA TESTIRANJE STUDENATA Kratak opis aplikacije Aplikacija za testiranje studenata je osmišljena tako da se štampanje ispitnih blanketa i obavljanje pismenog i usmeno dela ispita na klasičan način zameni ovom aplikacijom. Pitanja profesor generiše na serveru i ona se po slučajnom ili tačno generisanom redosledu prosleđuju u odgovarajuću web formu. Aplikacija automatski obrađuje rezultate i student po završetku ispita odmah ima uvid u broj osvojenih poena. Pristup aplikaciji - Aplikacija je osmišljena tako da bude dostupan svim registrovanim korisnicima. Registracija nije otvoreni proces već je zamišljena da se obavlja kreiranjem korisničkih naloga za studente i profesore. Zarad lakšeg testiranja verzija 1.1 Aplikacije na početnoj strani sadrži i linkove ka forma za registraciju, koje bi trebalo da budu dostupne samo administratorima u finalnoj verziji • Korisnici su smešteni u 3 grupe: - grupa administratora - grupa profesora - grupa studenata • Administratori aplikacije kreiraju korisničke naloge. Za registraciju je neophodno uneti: • Profil Profesor: - korisničko ime - lozinka - ime - prezime - email - tajni kod • Profil Student: - korisničko ime - lozinka - ime - prezime - email - broj indeksa - departman
25
Poglavlje 4 Primer PHP/MySQL aplikacije
APLIKACIJA ZA TESTIRANJE STUDENATA-NASTAVAK Šta se još čuva u bazi podataka? Da bi se postigla željena funkcionalnost aplikacije pored korisnika u bazi podataka treba čuvati i druge podatke na sledeći način: • Relacija KORISNIK sadrži username i password korisnika aplikacije koji može biti administrator, profesor ili student. Podaci o svakoj vrsti korisnika se pamte u odgovarajućim tabelama: ADMIN, PROFESOR, STUDENT. • U sistemu se pamti banka pitanja (tabela PITANJE) i odgovarajućih odgovora na svako od njih (tabela ODGOVOR). Na svako pitanje se može dati više odgovora. • Za svaki predmet (PREDMET) koji student sluša se može formirati jedan ili više testova (TEST) i svakom testu se dodaje jedno ili više pitanja iz bake pitanja (TESTPITANJE). Student za svaki predmet koji sluša u ispitnom roku polaže test (STUDENTTEST), pa se tako za svakog pojedinačnog studenta kreira test u koji se upisuju njegovi odgovori na pitanja iz testa (STUDENTPITANJE) U primerima u sledećim sekcijama dati su isečci iz bitnih delova koda, kao i konceptulani (fizički) model baze podataka sa kojom radi ova PHP aplikacija.
MODEL BAZE PODATAKA Aplikacija je povezana sa bazom koja ima sledeći model Konceptualni (fizički) model baze podataka koja se koristi u Aplikacija za testiranje studenta. Model je izrađen korišćenjem programa MySQL Wotkbench
Slika 4.1 Fizički model baze podataka aplikacije za testiranje studenata
26
Poglavlje 4 Primer PHP/MySQL aplikacije
KONEKCIJA NA BAZU - PHP I SQL KODOVI PHP klasa connectToDB koja uspostavlja konekciju sa bazom podataka 'aplikacija' Aplikacija koristi MySQL ekstenziju drajvera, taoa je za današnje standarde prevaziđena. Sldeđi isečci kodova su dati kao primeri i kao vežba.
= = = =
'localhost'; 'root'; ''; 'aplikacija';
mysql_connect($dbhost, $dbuser, $dbpass) or die ("neuspesna konekcija na server."); mysql_select_db($dbname) or die ("neuspesna konekcija na bazu.");
?>
Dati kod povezuje našu aplikaciju sa bazom, a bazu kreiramo na sledeći način DROP SCHEMA IF EXISTS `Aplikacija` ; CREATE SCHEMA IF NOT EXISTS `Aplikacija` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; USE `Aplikacija` ;
PRISTU APLIKACIJI - PHP PHP klase login i logout kojm se korisnici loguju na sistem i dobijaju pristp ostalim delovima aplikacije PHP klasa kojom se prvera da podaci uneti prilikom logovanja postoje u bazi i na osnovu rezultata dozvoljava prijavu na sistem i korisnika prosleđuje na odgovarajuću stranicu (na osnovu tipa korisnika)
27
Poglavlje 4 Primer PHP/MySQL aplikacije
$upit = "SELECT * FROM korisnik WHERE username = '".$username."'"; $result = mysql_query($upit) or die(mysql_error()); $kolona = mysql_fetch_array($result); if($md5pass==$kolona[1]){ $_SESSION['logovan'] = true; switch ($kolona[2]){ case 1: $_SESSION['isStudent']=true; break; case 2: $_SESSION['isProfesor']=true; break; case 3: $_SESSION['isAdmin']=true; break; } header('Location: ../index.php'); }else{ $_SESSION['logovan'] = false; $errors["usernamePassword"] = "Pogresan username ili password!"; $_SESSION["errors"] = $errors; header('Location: ../login.php'); } ?>
Klasa kojom se, nakon završetka rada, prekida konekcija sa bazom i uništavaju sesije.
DELOVI KODA - USER KLASA I TABELA U ovoj sekciji dati su delovi SQL (DDL) koda baze podataka date aplikacije i odgovarajuće PHP klase SQL kod table User DROP TABLE IF EXISTS `Aplikacija`.`korisnik`; CREATE TABLE IF NOT EXISTS `Aplikacija`.`korisnik` ( `username` VARCHAR(50) NULL , `password` VARCHAR(45) NULL , `tip` INT NULL , PRIMARY KEY (`username`) ) ENGINE = InnoDB;
28
Poglavlje 4 Primer PHP/MySQL aplikacije
PHP klasa User username = $username; } function get_username(){ return $this->username; } //password function set_password($password){ $this->password = $password; } function get_password(){ return $this->password; } //tip function set_tip($tip){ $this->tip=$tip; } function get_tip(){ return $this->tip; } } ?>
DELOVI KODA - STUDENT KLASA I TABELA U ovoj sekciji dati su delovi SQL (DDL) koda baze podataka date aplikacije i odgovarajuće PHP klase 2 SQL kod table Student DROP TABLE IF EXISTS `Aplikacija`.`student`; CREATE TABLE IF NOT EXISTS `student` ( `username` VARCHAR(50) NOT NULL , `ime` VARCHAR(45) NULL , `prezime` VARCHAR(45) NULL , `email` VARCHAR(45) NULL , `brindeksa` VARCHAR(10) NULL , `smer` VARCHAR(45) NULL , CONSTRAINT `fk_student_Korisnik1` FOREIGN KEY (`username` ) REFERENCES `korisnik` (`username` ) ON DELETE NO ACTION
29
Poglavlje 4 Primer PHP/MySQL aplikacije
ON UPDATE NO ACTION) ENGINE = InnoDB;
PHP klasa Student
$username; $email; $ime; $prezime; $smer; $indeks;
//username function set_username($username){ $this->username = $username; } function get_username(){ return $this->username; } //email function set_email($email){ $this->email = $email; } function get_email(){ return $this->email; } //ime function set_ime($ime){ $this->ime = $ime; } function get_ime(){ return $this->ime; } //prezime function set_prezime($prezime){ $this->prezime = $prezime; } function get_prezime(){ return $this->prezime; } //indeks function set_indeks($indeks){ $this->indeks = $indeks; } function get_indeks(){ return $this->indeks; } //smer function set_smer($smer){ $this->smer = $smer; }
30
Poglavlje 4 Primer PHP/MySQL aplikacije
function get_smer(){ return $this->smer; } } ?>
DELOVI KODA - REGISTRACIJASTUDENT KLASA 1 Klasa registracijaStudenta I
// USERNAME ne moze biti null if (empty($username)) $errors["username"] = "Morate uneti username.";
DELOVI KODA - REGISTRACIJASTUDENT KLASA 2 Klasa registracijaStudenta II elseif (!eregi("^[a-z'-]*$", $username)) $errors["username"] = "Kod polja username mozete koristiti samo slova, a od specijalnih znakova \" - \" ili \" ' \".";
31
Poglavlje 4 Primer PHP/MySQL aplikacije
elseif (strlen($username) > 50) $errors["username"] = "Username ne moze biti preko 50 karaktera. "; // PASSWORD ne moze biti null if (empty($password)) $errors["password"] = "Morate uneti password."; elseif (!eregi("^[0-9a-z'-]*$", $password)) $errors["password"] = "Kod polja password mozete koristiti slova i brojeve, a od specijalnih znakova \" - \"."; elseif (strlen($password) > 50) $errors["password"] = "password ne moze biti preko 50 karaktera. "; //EMAIL //Sintaksa za proveru mail-a $validEmailExpr = "^[0-9a-z~!#$%&_-]([.]?[0-9a-z~!#$%&_-])*" ."@[0-9a-z~!#$%&_-]([.]?[0-9a-z~!#$%&_-])*$"; //Domen email adrese $maildomain = substr(strstr($email, '@'), 1); if (empty($email)) // eMail ne moze biti prazan string $errors["email"] = "Morate uneti email adresu."; elseif (!eregi($validEmailExpr, $email)) $errors["email"] = "Vasa email adresa mora biti uneta po formatu name@domain.";
DELOVI KODA - REGISTRACIJASTUDENT KLASA 3 Klasa registracijaStudenta III elseif (!eregi("^[a-z'-]*$", $username)) $errors["username"] = "Kod polja username mozete koristiti samo slova, a od specijalnih znakova \" - \" ili \" ' \"."; elseif (strlen($username) > 50) $errors["username"] = "Username ne moze biti preko 50 karaktera. "; // PASSWORD ne moze biti null if (empty($password)) $errors["password"] = "Morate uneti password."; elseif (!eregi("^[0-9a-z'-]*$", $password)) $errors["password"] = "Kod polja password mozete koristiti slova i brojeve, a od specijalnih znakova \" - \"."; elseif (strlen($password) > 50)
32
Poglavlje 4 Primer PHP/MySQL aplikacije
$errors["password"] = "password ne moze biti preko 50 karaktera. "; //EMAIL //Sintaksa za proveru mail-a $validEmailExpr = "^[0-9a-z~!#$%&_-]([.]?[0-9a-z~!#$%&_-])*" ."@[0-9a-z~!#$%&_-]([.]?[0-9a-z~!#$%&_-])*$"; //Domen email adrese $maildomain = substr(strstr($email, '@'), 1); if (empty($email)) // eMail ne moze biti prazan string $errors["email"] = "Morate uneti email adresu."; elseif (!eregi($validEmailExpr, $email)) $errors["email"] = "Vasa email adresa mora biti uneta po formatu name@domain.";
DELOVI KODA - REGISTRACIJASTUDENT KLASA 4 Klasa registracijaStudenta IV elseif (strlen($formVars["email"]) > 50) //Duzina email adrese ne moze biti preko 50 karaktera $errors["email"] = "Email adresa ne moze biti preko 50 karaktera."; // IME ne moze biti null if (empty($ime)) $errors["ime"] = "Morate uneti ime."; elseif (!eregi("^[a-z'-]*$", $ime)) $errors["ime"] = "Kod polja ime mozete koristiti samo slova, a od specijalnih znakova \" - \" ili \" ' \"."; elseif (strlen($ime) > 50) $errors["ime"] = "Ime ne moze biti preko 50 karaktera. "; // PREZIME ne moze biti null if (empty($prezime)) $errors["prezime"] = "Morate uneti prezime."; elseif (!eregi("^[a-z'-]*$", $prezime)) $errors["prezime"] = "Kod polja prezime mozete koristiti samo slova, a od specijalnih znakova \" - \" ili \" ' \"."; elseif (strlen($prezime) > 50) $errors["prezime"] = "Prezime ne moze biti preko 50 karaktera. "; // indeks ne moze biti null if (empty($indeks))
33
Poglavlje 4 Primer PHP/MySQL aplikacije
$errors["indeks"] = "Morate uneti indeks."; elseif (strlen($indeks) > 10) $errors["indeks"] = "Broj indeksa ne moze biti preko 10 karaktera. ";
DELOVI KODA - REGISTRACIJASTUDENT KLASA 5 Klasa registracijaStudenta V // smer ne moze biti null if (empty($smer)) $errors["smer"] = "Morate uneti smer."; elseif (strlen($smer) > 50) $errors["smer"] = "Smer ne moze biti preko 50 karaktera. "; if($errors == null){ $kontroler = new Kontroler(); if($kontroler->is_existUser($username, "korisnik") != 0 ){ $errors["username"] = "Username: ".$username." postoji u bazi..."; $_SESSION['errors'] = $errors; header('Location: ../registracijaStud.php'); } else { $korisnik->set_username($username); $korisnik->set_password(md5($password)); $korisnik->set_tip(1); $student->set_username($username); $student->set_email($email); $student->set_ime($ime); $student->set_prezime($prezime); $student->set_indeks($indeks); $student->set_smer($smer); session_destroy(); $kontroler->set_stud($korisnik,$student); } } else{ $_SESSION['errors'] = $errors; header('Location: ../registracijaStud.php'); } ?>
DELOVI KODA - KONTROLNA KLASA 1 Kontrolna klasa - I deo
34
Poglavlje 4 Primer PHP/MySQL aplikacije
class Kontroler{ function set_stud(Korisnik $korisnik, stud $student){ include_once("../scripts/connectionDB.php"); $upit = "INSERT INTO korisnik (username, password, tip)". "VALUES ('".$korisnik->get_username()."', '".$korisnik->get_password()."', '".$korisnik->get_tip()."')"; $upit1 = "INSERT INTO
smer)". "VALUES ('".$student->get_username()."','".$student->get_ime()."', '".$student->get_prezime()."','".$student->get_email()."', '".$student->get_indeks()."','".$student->get_smer()."')"; $results = mysql_query($upit) or die(mysql_error()); $results1 = mysql_query($upit1) or die (mysql_error());
DELOVI KODA - KONTROLNA KLASA 2 Kontrolna klasa - II deo if($results && $results1){ //echo "<script type='text/javascript'> window.alert(' Uspesno ste se registrovali! '); "; $_SESSION['logovan']=true; $_SESSION['isStudent']=true; } else{ $errors["registracija"] = "Registracija je neuspesna"; $_SESSION["errors"] = $errors; header('Location: ../registracijaStud.php'); } } function set_prof(Korisnik $korisnik, prof $profesor){ include ('../scripts/connectionDB.php');
35
Poglavlje 4 Primer PHP/MySQL aplikacije
$upit = "INSERT INTO korisnik (username, password, tip)". "VALUES ('".$korisnik->get_username()."', '".$korisnik->get_password()."', '".$korisnik->get_tip()."')"; $upit1 = "INSERT INTO profesor (username, ime, prezime, email)". "VALUES ('".$profesor->get_username()."','".$profesor->get_ime()."','".$profesor->get_prezim e()."','".$profesor->get_email()."')"; $results = mysql_query($upit) or die(mysql_error()); $results1 = mysql_query($upit1) or die (mysql_error()); if($results && $results1){ //echo "<script type='text/javascript'> window.alert(' Uspesno ste se registrovali! '); "; $_SESSION['logovan']=true; $_SESSION['isProfesor']=true; } else{ $errors["registracija"] = "Registracija je neuspesna"; $_SESSION["errors"] = $errors; header('Location: ../registracijaProf.php'); } }
DELOVI KODA - KONTROLNA KLASA 3 Kontrolna klasa - III deo function set_admin(Korisnik $korisnik, admin $admin){ include ('../scripts/connectionDB.php'); $upit = "INSERT INTO korisnik (username, password, tip)". "VALUES ('".$korisnik->get_username()."', '".$korisnik->get_password()."', '".$korisnik->get_tip()."')"; $upit1 = "INSERT INTO admin (username) VALUES ('".$admin->get_username()."')"; $results = mysql_query($upit) or die(mysql_error()); $results1 = mysql_query($upit1) or die (mysql_error()); if($results && $results1){ //echo "<script type='text/javascript'> window.alert(' Uspesno ste se registrovali! '); "; $_SESSION['logovan']=true; $_SESSION['isAdmin']=true; } else{
36
Poglavlje 4 Primer PHP/MySQL aplikacije
$errors["registracija"] = "Registracija je neuspesna"; $_SESSION["errors"] = $errors; header('Location: ../registracijaAdmin.php'); } } function is_existUser($username, $tabela){ include ('../scripts/connectionDB.php'); $upit = "SELECT count(username) FROM ".$tabela." WHERE username = '".$username . "'"; $result = mysql_query($upit) or die(mysql_error()); $results = mysql_result($result, 0); return $results; }
DELOVI KODA - KONTROLNA KLASA 4 Kontrolna klasa - IV deo function vratiPassword($username, $tabela){ include ('../scripts/connectionDB.php'); $upit = "SELECT password FROM $tabela WHERE username = '".$username."'"; $result = mysql_query($upit) or die(mysql_error()); while($row = mysql_fetch_array($result)){ $results = $row[0]; } return $results; }
DELOVI KODA - BRISANJE KORISNIKA 2 Primer brisanja korisnika iz baze podataka - frontend II deo
39
Poglavlje 5 Zaključak ZAKLJUČAK Šta smo naučili u ovoj lekciji? U okviru ove lekcije obradili smo načine na koje možemo povezati našu PHP aplikaciju sa bazom podataka. Takođe, opisani su i osnovni DDL i DML SQL upiti i njihovo korišćenje u PHP-u. Kroz primer aplikacije za testiranje studenata videli smo jedan od načina povezivanja PHP-a i kreiranje konekcija na MySQL bazu podataka, kao i izvršavanje SQL upita kroz PHP kod.