PHP & MySQL Skripta

22
PHP - MYSQL

Transcript of PHP & MySQL Skripta

Page 1: PHP & MySQL Skripta

PHP - MYSQL

Page 2: PHP & MySQL Skripta

SADRŽAJ

1 UVOD...............................................................................................................................3

2 PHP MySQL.....................................................................................................................4

2.1 Konekcija na MySql server........................................................................................4

2.2 Kreiranje baze i tabela (naredba CREATE DATABASE i CREATE TABLE).............6

2.3 Ubacivanje podataka u bazu (naredba INSERT INTO).............................................7

2.4 Čitanje podataka iz baze (naredba SELECT)............................................................9

2.5 Brisanje podataka (naredba DELETE)....................................................................12

2.6 Izmena postojećih podataka (naredba UPDATE)....................................................14

3 PHP I POVEZIVANJE SA DRUGIM BAZAMA PODATAKA..........................................18

2

Page 3: PHP & MySQL Skripta

1 UVOD

Troslojna arhitektura predstavlja tip klijent-server arhitekture u kojoj su korisnički interfejs, procesi poslovne logike i pristup podacima, projektovani i upravljani kao nezavisni moduli. Osnovne komponente (slojevi) ove arhitekture su:

Klijentski (prezentacioni) sloj

Sloj poslovne (aplikativne) logike

Sloj podataka

Slika 1 Troslojna arhitektura web aplikacija

Preko PHP-a kao skriptnog jezika na serverskoj strani, realizuje se najveći deo poslovne logike aplikacije. Podaci vezani za aplikaciju se mogu skladištiti u običnom tekstualnom fajlu, iz kojeg se pomoću PHP mogu čitati i upisivati. Međutim, ako je u pitanju ozbiljnija aplikacija, neophodno je koristiti relacione baze podataka. Najčešće, ovo znači da će se korsititi server baze podataka koji podražava SQL (Structured Query Language) specifikaciju. SQL je standardni programski jezik za pristup i manipulaciju podacima iz relacionih baza podataka i podržan je od strane svih servera relacionih baza podataka. U relacionim bazama podaci su skladišteni preko niza tabela. Svaka tabela sadrži kolone koje opsiuju atribute podataka, a svaki red je instanca podataka.

3

Page 4: PHP & MySQL Skripta

Relational Data Base Management Systems (RDBMS), odnosno sistemi za upravljanje relacionim bazama podataka su se u praksi pokazali kao najbolji način upravljanja podacima.

2 PHP MySQL

PHP podržava API-je za pristup svim poznatim bazama podataka. U ovoj skripti se obrađuje povezivanje PHP sa MySQL bazama podataka. MySQL je efikasan server za upravljanje bazama podataka. Predstavlja opensource rešenje sa odličnim performansama.

2.1 Konekcija na MySql server

Da bi se moglo upravljati podacima iz baze, neophodno je uspostaviti konekciju sa serverom na kojem se ta baza nalazi. Serveri se nalaze na mreži i njima se pristupa pomoću IP-a ili domene (hosta). Uz podatak o hostu servera, potrebni su korisničko ime i lozinka da bi se uspešno povezalo na server i komuniciralo sa njim. U PHP postoji ugrađena funkcija za povezivanje sa serverom mysql_connect. Funkcija vraća broj koji je referenca ka uspostavljenoj konekciji, ili false ukoliko konekcija nije uspela. Konekcija ostaje otovrena sve dok se ne pozove funkcija mysql_close ili dok se ne izvrši PHP skript.

U sledećoj tabeli su date neke od osnovnih funkcija za spajanje na MySQL server.

Naziv funkcije Sintaksa Opismysql_connect mysql_connect(ime servera:port,

korisničko ime, šifra – ukoliko postoji).

Povezuje PHP skriptu sa MySQL bazom. Ako je baza zaštićena šifrom, šifra se mora uneti kao parameter.

mysql_close mysql_close (naziv promenljive kojoj je dodeljna vrednost mysql_connect funkcije)

Zatvara PHP konekciju sa bazom.

mysql_query mysql_query(“ upit koji se izvršava nad MySQL bazom“, naziv promenljive kojoj je dodeljena vrednost mysql_connection())

U okviru ove naredbe se može koristiti bilo koji upit: za kreiranje tabele, za kreiranje baze, za popunjavanje baze, ažuriranje baze, čitanje iz baze...

mysql_error mysql_error() Izveštava o mysql grešcimysql_select_db mysql_select_db(“ime_baze”) Bira MySQL bazu nad

kojom će vršiti upite

4

Page 5: PHP & MySQL Skripta

Primer 1 : Spajanje na MySql server

Pomoću fajla „konekcija.php“ se vrši povezivanje sa serverom na kojem je smeštena baza

<?phpif (!$db=mysql_connect("localhost", "root", "")){die ("<b>Spajanje na mysql server je bilo neuspešno</b>");}if (!mysql_select_db("bazanovosti", $db)){die ("<b>Greška pri odabiru baze</b>");}?>

Ukoliko su MySql funkcijama dati tačne podaci rezultat skripte bi trebalo da bude prazna stranica.

Samo spajanje sa serverom se obavlja pomoću mysql_connect funkcije. Funkciji se prosleđuju tri argumenta. Prvi je host na kom se nalazi server. Ovde se može uneti IP ili hostname servera, ali skoro uvek se radi o alliasu localhost na IP 127.0.0.1 (barem kod većine komercijalnih hosting providera). Drugi argument je korisničko ime pomoću koje se spaja, a treći lozinka za tog korisnika. Ukoliko su svi dati podaci tačni, pa je mysql pristupačan i operacionalan funkcija će vratiti „spoj“ sa serverom. Ako je neka od informacija netačna ili se nešto desilo sa samim MySql serverom funkcija vraća false.

Još jedna vrlo bitna stvar je proveravati uspeh operacije spajanja. Naime, skoro uvek čitava poslovna logika aplikacije zahteva uspešnu konekciju na server. Sledeći korak pri spajanju sa MySql serveom je odabir baze. Mysql_select_db funkcija kao prvi argument dobija ime baze koja se koristi, a kao drugi vezu tj spoj na MySql server gde se ta baza nalazi. Pošto je spoj (rezultat mysql_connect funkcije) ubačen u varijablu $db ona je prosleđena na drugo mesto. Ovo nije obavezni argument, tj. mogao je biti izostavljen pa mysql_select_db funkciju pozvati u mysql_select_db("baza") obliku i sve bi i dalje radilo. Radi se o tome da PHP automatski pamti poslednju otvorenu vezu na MySql server pa je uvek po defaultu koristi u svim mysql funkcijama gdje je taj argument izostavljen (recimo u funkciji koja izvršava neki SQL upit na serveru). No, ukoliko se u skripti spaja na dva različita servera, ili ostvaruju dve zasebne veze na isti server i ne koristi taj argument u MySql funkcijama PHP će uvek koristiti onu vezu koja je poslednja otvorena. Tako da se u toj situaciiji mora prosleđivati ona varijabla koja u sebi sadrži onaj spoj na kom treba izvršiti neka operaciju.

U sledećoj tabeli dat je kratak prikaz SQL upita (SQL query) o kojima će biti reči u nastavku teksta:

Sintaksa upita Funkcija CREATE DATABASE ime_baze Kreira novu bazu u MySQL RDBMS – uCREATE TABLE ime_tabele (Ime_kolone1 tip podataka (velicina),Ime_kolone2 tip podataka (velicina),Ime_kolone3 tip podataka (velicina)………….)

Kreira tabelu u okviru selektovane baze podataka. Navode se imena svih kolona i

tipovi podataka koje će podržavati ove kolone. Za tipove podataka u MySQL – u,

pogledati reference za MySQL.

INSERT INTO ime_tabele (ime_kolone1, ime_kolone2, ime_kolone3) VALUES (“vrednost_za_kolonu1”, “vrednost_za

Ubacuje konkretne vrednosti u kreiranu tabelu u MySQL bazi podataka.

5

Page 6: PHP & MySQL Skripta

kolonu2”, vrednost_za_kolonu3)SELECT ime_kolone1,ime_kolone2, ime_kolone3, ime_koloneN FROM ime_tabele. (umesto naziva kolona može se staviti „ * “, što je džkorer znak da je sve selektovano).

Selektuje odabrane, ili sve kolone iz tabele

SELECT ime_kolone1,ime_kolone2, ime_kolone3, ime_koloneN FROM ime_tabele WHERE ime_kolone=”vrednost”

Selektuje odabrane kolone na osnovu zadatog kriterijuma.

SELECT ime_kolone1,ime_kolone2, ime_kolone3, ime_koloneN FROM ime_tabele ORDER BY ime_kolone (desc).

Selektuje odabrane kolone iz tabele i razvrstava ih u opadajućem ili rastućem

redosledu na osnovu neke kolone. Ako se ne navede Desc, po default – u se

podrazumeva rastući redosled.UPDATE ime_tabeleSET ime_kolone=nova_vrednostWHERE ime_kolone=stara_vrednost

Menja konkretne vrednosti iz određene tabelu na osnovu zadatih kriterijuma.

DELETE FROM ime_tabeleWHERE ime_kolone=neka_vrednost

2.2 Kreiranje baze i tabela (naredba CREATE DATABASE i CREATE TABLE)1

Da bi se omogućilo čuvanje podataka, kao i manipulacija njima, neophodno je pre svega postaviti bazu na server. Za kreiranje baze se koristi komanda CREATE DATABASE. Kada je u pitanju WAMP server instaliran na lokalnom računaru, delu za upravljanje bazama podataka se pristupa pomoću opcije phpMyAdmin ili jednostavnim unošenjem adrese u adressbar browser-a http://localhost/phpmyadmin/. Bazu je najlakše kreirati unošenjem imena baze i biranjem opcije create (dugme smešteno u središnjem delu prozora). Ova akcija je ekvivalentna upitu:

CREATE DATABASE `bazanovosti` ;

Nakon kreiranja baze, potrebno je redom unositi tabele u bazu. Tabele se preko komandnog panela ubacuju jednostavnim unosom imena tabele i definisanjem broja polja. Ekvivalentan rezultat se dobija ako se izvrši upit nad bazom :

CREATE TABLE `novosti` ( `idnovost` INT( 20 ) NOT NULL AUTO_INCREMENT ,`naslov` VARCHAR( 20 ) NOT NULL ,`tekst` VARCHAR( 45) NOT NULL ,PRIMARY KEY ( `idnovost` ) );

Konačno, baza ima strukturu kao na slici

1 Svi primeri obrađeni u ovoj skripti podrazumevaju rad preko WAMP servera. Ukoliko postoji kompatibilnost verzija, svi primeri bi trebalo da budu validni i za druge slične solucije Apache servera i MySQL baze podataka.

6

Page 7: PHP & MySQL Skripta

2.3 Ubacivanje podataka u bazu (naredba INSERT INTO)

Baza i njoj pripadajuće tabele su u početku prazne – nemaju podataka. Osnovna operacija za unos podataka je INSERT INTO. Podaci se preko komandnog panela ubacuju izborom opcije INSERT. Upit kojim se ubacuju podaci u tabelu novosti :

INSERT INTO `novosti` ( `idnovost` , `naslov` , `tekst` ) VALUES ( '', 'Naslov1', 'Ovo je prva vest'), ( '', 'Naslov2', 'Ovo je druga vest')

Kod naziva tabele je vrlo bitno napisati njeno ime u pravilom „caseu“ jer su imena baza, tabela i polja case sensitive. Kao što se vidi, u zagradama su navedena polja tabele, ali jedno nedostaje. Polje idnovost nije navedeno i ne radi se o grešci u pisanju. Naime, ukoliko se neko polje izostavi u listi njemu se automatski upisuje defaultna vrednost (koja se može postaviti pri stvaranju tabele). U ovom slučaju je pri stvaranju tabele polju idnovost data auto_increment osobina koja pri svakom insertu tom polju pridružuje po defaultu vrednost veću za 1 od poslednje upisane.

Nakon liste polja dolazi VALUES čime se naznačava da sledi lista vrednosti koja se ubacuje u tablicu. Vrednost koja se ubacuje u jedno od polja mora biti na istoj poziciji u listi vrednosti kao i ime polja u koje će se sačuvati u listi polja.

Kod stvaranja liste polja nije bitan redosled. Bitno je jedino da se ime polja u svojoj listi pozicijom poklapa sa vrednosti u listi vrednosti

Jedna od osnovnih funkcionalnosti PHP skriptova je ubacivanje podataka u bazu. Najčešće se podaci prikupljaju od korisnika. U tekstu sledi primer ubacivanja podataka prikupljenih preko forme.

Primer: Unos podataka u bazu preko forme

<html><head><title>Unos vesti</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"></head><body><h1>Unos novosti</h1><hr><form method="post" action="">Naslov : <input type="text" name="naslov"><br>Tekst :&nbsp;&nbsp; <textarea name="tekst"></textarea><br><input type="submit" name="unos" value="Ubaci"></form><?phpif (!isset($_POST["unos"])){}

7

Page 8: PHP & MySQL Skripta

else {include "konekcija.php";$sql="INSERT INTO novosti (naslov, tekst)VALUES ('$_POST[naslov]', '$_POST[tekst]')";if (mysql_query($sql)){echo "Novost je uspesno ubacena";} else {echo "Nastala je greška pri ubacivanju novosti<br>" . mysql_error();}}?></body></html>

Struktura, tj. logika ove skripte sledi logiku same operacije. Prvi korak je unos podataka u formu, a drugi je ubacivanje tih podataka u bazu. Kao uslov obavljanja prvog ili drugog koraka je postojanje vrednosti u varijabli $_POST["unos"], tj. varijable koju stvara pritisnuti submit taster forme imena unos

U form tagu action atribut nema vrednost. Kada je action atribut definisan na ovaj način podaci se šalju ka stranici na kojoj se nalazi forma. Forma se prikazuje na unosvesti.php pa će se i nakon submit - ovanja forme opet otvarati ista stranica.

Drugi korak ubacuje podatke iz forme u bazu. Da bi se moglo nešto ubaciti u bazu prvo se mora spojiti na MySql server i odabrati je, što je urađeno u prvom primeru koji je ubačen u dbsproj.php pa je ovde samo uključujen.

include "konekcija.php";

Nakon uspešnog spajanja na bazu generiše se SQL upit:

$sql="INSERT INTO novosti (naslov, tekst)VALUES ('$_POST[naslov]', '$_POST[tekst]')";

Sledeći korak je stvaranje stringa u kojem se nalazi sam SQL upit za unos podataka u tablicu.

if (mysql_query($sql)){echo "Novost je uspesno ubačena";} else {echo "Nastala je greška pri ubacivanju novosti<br>" . mysql_error();}

Ovo je glavni deo skripte koji obavlja samu komunikaciju sa MySQL serverom, tj. izvršava SQL upit na njemu. Obavlja se pomoću mysql_query() funkcije. mysql_query() funkcija prima dva argumenta. Prvi je string podatak koji sadrži valjani upit (SQL ili neku MySQL naredbu) koji je obavezan, dok je drugi neobavezan, a radi se o otvorenom i validnom spoju na MySQL server koji je u dbsproj.php skripti ubačen u $db varijablu.

U slučaju INSERT upita mysql_query() vraća true ukoliko je upit uspešno obavljen ili false u suprotom. Iz tog razloga je moguće pomoću if-a proveriti da li je novost ubačena u bazu i u zavisnosti od toga ispusati odgovarajuću poruku korisniku.

8

Page 9: PHP & MySQL Skripta

2.4 Čitanje podataka iz baze (naredba SELECT)

Najjednostavniji primer je upit koji pribavlja sve redove iz jedne tabele.

SELECT * FROM novosti

Upit počinje nazivom vrste upita. Ovo je pravilo koje dele svi upiti za manipulaciju podacima u osnovnim oblicima. Nakon imena operacije sledi lista polja koja će se pojaviti u tablici rezultata upita. Zvezdica je skraćenica koja govori da će se pribaviti sva polja iz navedenih tabela. Nakon liste polja sledi FROM koji govori da sledi lista tabela iz kojih se podaci pribavljaju.

Ovo su ujedno i svi obavezni delovi jednog valjanog SQL SELECT upita pa, ukoliko jedan od njih bude izostavljen MySql će javiti grešku i neće obaviti upit.

Rezultat upita nije sortiran ni po jednom polju, ali redovi su vraćeni po redosledu upisa u bazu, po idnovost polju pošto se radi o auto_increment polju koje svakom novom redu daje vrednost veću za 1 od onog prošlog.

SELECT * FROM novosti ORDER BY idnovost DESC

Da bi rezultati upita bili sortirani dodata je ORDER BY klazula u ovom slučaju na njegov kraj.

ORDER BY mora biti propraćen imenima polja po kojima se želi sortirati rezultat pa način sortiranja. U ovom slučaju se radi o polju datum i DESC (descending) načinom, tj. silazno. Suprtotno, tj. uzlazno se može sortirati tako da se izostavi DESC ili umesto njega upiše ASC (ascending). Ukoliko se izostavi smer sortiranja rezultata defaultni smer je uzlazan.

Primer 3 : Pregled novosti

<html><head><title>Pregled novosti</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"></head><body><?phpinclude "konekcija.php";$sql="SELECT naslov, tekst FROM novosti";if (!$q=mysql_query($sql)){echo "Nastala je greska pri izvodenju upita<br>" . mysql_query();die();}if (mysql_num_rows($q)==0){echo "Nema novosti";} else {?><table width="760" border="1" cellpadding="1" cellspacing="1"><tr><td><b>Naslov</b></td><td><b>Tekst</b></td></tr>

9

Page 10: PHP & MySQL Skripta

<?phpwhile ($red=mysql_fetch_array($q)){?><tr><td><?php echo $red["naslov"]?></td><td><?php echo $red["tekst"]?></td></tr><?php}?></table><?php}?></body></html>

Objašnjenje :

SELECT upiti su najopširniji. Razlog tome je prilično očigledan, jer uz obavljanje upita moraju se podaci i pribaviti tj. u ovom slučaju ispisati u obliku tabele.

Prva stvar koja se mora uraditi je kreiranje upita.

$sql="SELECT naslov, datum FROM novosti";

Nije obavezno upite upisivati u varijablu pa onda tu varijablu prosleđivati mysql_query() funkciji. Može se sam upit napisati pravo u mysql_query() funkciju. Npr. ovako:

mysql_query("SELECT naslov, datum FROM novosti")

if (!$q=mysql_query($sql)){echo "Nastala je greška pri izvodenju upita<br>" . mysql_query();die();}

Ovog puta je ubačen rezultat mysql_query funkcije u varijablu. Ovo je obavezno jedino kod izvršavanja SELECT upita dok kod izvršavanja ostalih to može biti izostavljeno.

U cilju izrade skripte koja neće ispisivati neke PHP / MySQL error - e mora se pre ispisa samog rezultata upita proveriti da li ima rezultata za prikaz pa ukoliko nema preduzeti odgovarajuće korake da se korisnik obavesti o tome pa mu po potrebi ponuditi opcije što može učiniti u toj situaciji.

Ta provera se obavlja pomoću :

if (mysql_num_rows($q)==0){echo "Nema novosti";

Funkcija koja obavlja samu proveru je mysql_num_rows() koja kao argument prima result identifier pa vraća integer broj koji je jednak ili veći od nule. Normalno, result identifier mora biti veći od nule, tj. ova funkcija će javiti error ukoliko je pri obavljanju upita nastala greška tj. mysql_query() je vratio false vrednost umesto result identifiera. Mora se voditi računa da se ova funkcija ne poziva ukoliko skripta nije prošla upit. To je u ovoj skripti osigurano die() funkcijom ukoliko je nastala greška pri izvršavanju upita. Rezultati se ispisuju u tablici radi

10

Page 11: PHP & MySQL Skripta

bolje preglednosti i razumljivosti, što je vrlo bitno kod izrade dinamičkih siteova sa bazama podataka

<table width="760" border="0" cellpadding="1" cellspacing="1"><tr><td><b>Naslov</b></td><td><b>Tekst</b></td></tr>

Pre samog ispisa u HTML - u su ispisani prvi red tabele sa nazivima redova. Prvi red je rezervisan za naslov novosti, drugi za datum njenog upisa a treći za opcije. Opcije su ništa drugo nego linkovi koji pokreću nove operacije nad vesti koja se nalazi u istom retku tabele kao i opcije.

Nakon što su ispisani „headeri“ tabele vraća se u PHP mode i kreće se sa ispisom podataka.

<?phpwhile ($red=mysql_fetch_array($q)){?><tr><td><?php echo $red["naslov"]?></td><td><?php echo $red ["tekst"]?></td></tr><?php}?>

Mysql_fetch_array() vraća red, t.j. niz koji se sastojih od svih polja rezultata s tim da je svako polje indeksirano brojem i svojim imenom.

Mysql_fetch_row() takođe vraća niz, sa tom razlikom da u njemu postoje samo numerički indeksi.

Mysql_fetch_assoc() isto vraća niz, ali u njemu se nalaze samo tekstualno indeksirana polja.

Četvrta navedena funkcija, mysql_fethc_object() umesto niza vraća objekat stvoren od polja reda.

Sve gore navedene funkcije imaju zajedničko to da će vratiti false na kraju ovog skupa rezultata. Ovo čini while petlju idealnim alatom za pribavljanje svih rezultata jer će se obaviti onoliko puta koliko ima rezultata u skupu. Još jedna zajednička stvar svim pomenutim funkcijama je da kao svoj argument dobijaju result identifier koji vraća mysql_query() funkcija.

while ($red=mysql_fetch_array($q))

U bloku naredbi while petlje ispisuje se jedan red tabele pa u pojedinu kolonu tog retka ispisuje pribavljenje vrednosti poput =<?php echo $red["idnovost"]?> čime se ispisuje naslov novosti.

2.5 Brisanje podataka (naredba DELETE)

DELETE FROM tabela

11

Page 12: PHP & MySQL Skripta

U prevodu gornja naredba znači „Obriši sve iz tabele imena tabela“. ali ovo je očigledno situacija koja će se retko događati u nekim realnim skriptama, već se obično radi o brisaju jednog ili manje grupe podataka.

Dalje se vidi kako bi izgledao upit koji obavlja brisanje jedne novosti na osnovu njenog ID-a.

DELETE FROM novosti WHERE idnovost=1

Gornji upit će obrisati samo onu novost koja ima idnovost jednak 1. WHERE služi za naznačavanje da nakon njega slede uslovi pomoću kojih se ograničava skup podataka nad kojima će se obaviti neka operacija.

DELETE FROM novosti WHERE naslov = ‘Naslov1’

U prevodu, zadato je MySql-u da obriše sve naslove koji imaju vrednost naslov1. Unutar WHERE klazule je moguće kombinovati više uslova koji ograničavaju skup podataka nad kojima se obavlja operacija kombinovanjem logičkim operatorima. WHERE može shvatiti kao if u PHP-u koji se obavlja nad svakim redom tabele.

Takođe, pomoću DELETE naredbe nije moguće obrisati pojedinu vrednost unutar nekog polja tabele. Nije moguće obrisati naslov novosti čiji je idnovst jednak 1. Za to se koristi UPDATE naredba koja će biti objašnjena u sledećem poglavlju

Primer 4 : Brisanje novosti (uredjivanjenovosti.php)

Brisanje novosti će biti izvedeno u istom dokumentu / skripti iz prošlog primera. Sada kod iz Primer 3 izgleda ovako:

<html><head><title>Pregled novosti</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"></head><body><?phpinclude "konekcija.php";// brisanje novosti

if (isset($_GET["brisanje"])){$sql="DELETE FROM novosti WHERE idnovost=" . $_GET["idnovost"];if (mysql_query($sql)){echo "Novost je uspesno obrisana";} else {echo "Nastala je greška pri brisanju novosti<br>" . mysql_error();}}$sql="SELECT idnovost, naslov, tekst FROM novosti";if (!$q=mysql_query($sql)){echo "Nastala je greška pri izvodenju upita<br>" . mysql_query();die();}if (mysql_num_rows($q)==0){echo "Nema novosti";

12

Page 13: PHP & MySQL Skripta

} else {?><table width="760" border="1" cellpadding="1" cellspacing="1"><tr><td><b>Naslov</b></td><td><b>Tekst</b></td><td><b>Akcija</b></td></tr><?phpwhile ($red=mysql_fetch_array($q)){?><tr><td><?php echo $red["naslov"]?></td><td><?php echo $red["tekst"]?></td><td><a href="uredjivanjenovosti.php?akcija=brisanje&idnovost=<?php echo $red["idnovost"]?>"> Obrisi</a></td></tr><?php}?></table><?php}?></body></html>

Nakon provera ispunjenja svih uslova brisanja kreće se sa brisanjem.

$sql="DELETE FROM novosti WHERE idnovost=" . $_GET["idnovost"];if (mysql_query($sql)){echo "Novost je uspesno obrisana";} else {echo "Nastala je greška pri brisanju novosti<br>" . mysql_error();}}

Izvršavanje upita je vrlo slično kao kod INSERT upita. Dovoljno je obaviti upit pomoću mysql_query() funkcije. Čak nije obavezno ubaciti njen rezultat u neku varijablu pošto ne postoji potreba za njenim korišćenjem kasnije u skripti.

Očigledno, ukoliko mysql_query() vrati true može se pretpostaviti da je novost obrisana a ukoliko vrati false znači da je nastala neka greška koju će mysql_error() opisati.

Da bi proverili da li je novost stvarno obrisana, može se koristiti još jedna mysql funkcija koja se nalazi u PHP-u. Radi se o mysql_affected_rows() funkciji. Funkcija vraća broj redova koji su bili zahvaćeni poslednjom operacijom. Može se koristiti samo nakon DELETE, UPDATE i INSERT upita, tj. upita koji vrše izmene nad podacima tabela.

$sql="DELETE FROM novosti WHERE idnovost=" . $_GET["idnovost"];if (mysql_query($sql)){if (mysql_affected_rows() > 0 ){echo "Novost je uspešno obrisana";

13

Page 14: PHP & MySQL Skripta

} else {echo "Nije obrisana ni jedna novost!";}} else {echo "Nastala je greška pri brisanju novosti<br>" . mysql_error();}

Deo koda:

<a href="uredjivanjenovosti.php?akcija=brisanje&idnovost=<?php echo $red["idnovost"]?>"> Obrisi</a>

se ispisuje u svakom prolazu petlje kroz red u tabeli. Odabirom opcije obrisi fajl se ide na link upisan u href atributu. U ovom slučaju to je isti onaj fajl koji se izvršava. Dodatni parameter je idnovost, koji dobija vrednost u zavisnosti od toga koji red je izabran. Npr:

uredjivanjenovosti.php?akcija=brisanjeidnovost=2.

Ova vrednost se koristi u upitu preko $_GET["idnovost"];

2.6 Izmena postojećih podataka (naredba UPDATE)

Za izmenu podataka se koristi UPDATE naredba.

UPDATE novosti SET naslov="Novi naslov"

Kao i svi ostali upiti do sada i ovaj počinje navođenjem imena operacije koja se izvodi. Ovog puta je odmah nakon naziva naredbe navedena tabela u kojoj se žele napraviti izmene. Nakon imena tabele slede SET koji govori da slede parovi imena polja tabele sa pridruženim novim vrednostima. Nakon izvršavanja gornjeg primera bi u svim redovima tabele naslov bio promenjen u „Novi naslov“.

Ukoliko je potrebno izmeniti više polja istovremeno, to bi bilo učinjeno ovakvim upitom:

UPDATE novosti SET naslov="Novi naslov", datum="2006-04-21"

Znači, za izvođenje izmena vrednosti u više polja potrebno je dva naziva polja sa pridruženim vrednostima odvojiti zarezom. Normalno, izmena vrednosti svim redovima neke tabele je vrlo retka pojava u realnim skriptama. Iz tog razloga je moguće pomoću WHERE klazule ograničiti skup podataka nad kojima se vršiizmena. U konkretnom primeru bi to izgledalo od prilike ovako :

UPDATE novosti SET naslov="Novi naslov", datum="2006-04-21" WHERE idnovost=1

Ovim upitom je izmenjen naslov i datum upisa novosti koja ima ID jednak jedan.

Sledeći primer se nastavlja na prethodna dva. Potrebno je ubaciti jednu liniju koda u fajl uredjivanjenovosti.php:

Nakon:<a href="uredjivanjenovosti.php?idnovost=<?php echo $red["idnovost"]?>"> Obrisi</a>

ubaciti:

14

Page 15: PHP & MySQL Skripta

<a href="izmenanovosti.php?idnovost=<?php echo $red["idnovost"]?>"> Uredi</a>

Na taj način se u ovom fajlu omogućva vršenje izmena nad svakim redom. Nakon izbora opcije uredi, poziva se fajl izmenanovosti.php sa odgovarajućim parametrom

Primer 5 : Izmena novosti

<html><head><title>Uredivanje novosti</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"></head><body><h1>Uredivanje novosti</h1><hr><?phpinclude "konekcija.php";if (!isset($_POST["dugmeuredi"])){if (!isset($_GET["idnovost"])){echo "Nepotpuni ulazni podaci";

} else {pribavlja se novost za prikaz u formi$sql="SELECT * FROM novosti WHERE idnovost=" . $_GET["idnovost"];if (!$q=mysql_query($sql)){echo "Nastala je greška pri izvodenju upita<br>" . mysql_query();} elseif (mysql_num_rows($q)==0) {echo "Nepostojeca novost";} else {$novost=mysql_fetch_array($q);}}?><form method="post" action=""><input type="hidden" name="idnovost" value="<?php echo $_GET["idnovost"]?>">Naslov : <input type="text" name="naslov" value="<?php echo $novost["naslov"]?>"><br>Tekst : <textarea name="tekst"><?php echo $novost["tekst"]?></textarea><br><input type="submit" name="dugmeuredi" value="Ubaci"></form><?php} //ovaj deo se izvršava kada je korisnik kliknuo “dugmeuredi”, odnosno submit-ovao formu else{ubacivanje izmena novosti$sql="UPDATE novosti SET naslov='". $_POST["naslov"] ."', tekst='".$_POST["tekst"]."' WHERE idnovost=". $_POST["idnovost"];if (mysql_query($sql))

15

Page 16: PHP & MySQL Skripta

{if (mysql_affected_rows() > 0 ){echo "Novost je uspešno uredena.";} else {echo "Novost nije izmenjena.";}} else {echo "Nastala je greška pri izmeni novosti<br>" . mysql_error();}}?></body></html>

Objašnjenje :

Kao i u dosadašnjim primerima, na samom početku skripte je uključen konekcija.php.

Pre pribavljanja podataka iz baze moraju se obaviti odgovarajuće provere.

if (!isset($_GET["idnovost"])){echo "Nepotpuni ulazni podaci";

Ovim se proverava da li je skripti prosleđena informacija ID-a novosti koja će biti uređena kroz formu. Očigledno je da je ovo ključna informacija jer na osnovu nje se prihvata novost kojom će biti popunjena forma, pa je u sledećem koraku korišćena za određivanje koja vest se uređuje unutar UPDATE upita.

$sql="SELECT * FROM novosti WHERE idnovost=" . $_GET["idnovost"];if (!$q=mysql_query($sql)){echo "Nastala je greška pri izvodenju upita<br>" . mysql_query();} elseif (mysql_num_rows($q)==0) {echo "Nepostojeca novost";} else {$novost=mysql_fetch_array($q);}}

$novost=mysql_fetch_array($q);

Ovaj upit može vratiti samo jedan rezultat koji se prihvata pozivanjem mysql_fetch_array() funkcije tako da bi se isti rezultati postigli i korišćenjem while petlje.

U samoj formi bi trebalo izdvojiti jedan detalj :

<input type="hidden" name="idnovost" value="<?=$_GET["idnovost"]?>">

Za razliku od forme za unos novosti, ovog puta je dodato novo polje za skladištenje id novosti koja se uređuje. Za takve informacije koje su ključne za funkcionisanje skripte, ne treba ostaviti mogućnost da ih korisnik izmeni u procesu korišćenja skripte pa se tada obično koriste hidden polja.

16

Page 17: PHP & MySQL Skripta

Kada je korisnik kliknuo “dugmeuredi”, odnosno submit-ovao formu, izvršava se sledeći deo koda

$sql="UPDATE novosti SET naslov='". $_POST["naslov"] ."', tekst='".$_POST["tekst"]."' WHERE idnovost=". $_POST["idnovost"];if (mysql_query($sql)){if (mysql_affected_rows() > 0 ){echo "Novost je uspešno uredena.";} else {echo "Novost nije izmenjena.";}} else {echo "Nastala je greška pri izmeni novosti<br>" . mysql_error();}

17

Page 18: PHP & MySQL Skripta

3 PHP I POVEZIVANJE SA DRUGIM BAZAMA PODATAKA

U PHP – u može da se napravi i ODBC (Open DataBase Connectivity) konekcija, tj. PHP skripte mogu da se povežu sa nekom drugom bazom podataka , npr. Microsoft Access preko ODBC drajvera.

Pre svega, pod Windows operativnim sistemom, treba da se kreira ODBC konekcija. U Control Panel – u, u jezičku Administrative Tools, dva puta se klikne na Data Sources (ODBC). U okviru jezička (tab) System DNS, klikne se na ADD i izabere se odgovarajući ODBC drajver. Kada se izabere ODBC drajver, klikne se na dugme Finish. Nakon toga ostaje da se izabere lokacija baze podataka na koju će se PHP skripta povezati preko ODBC drajvera klikom na Select tab. Izabere se Data Source Name (DSN) željene baze podataka. Klikom na dugme Ok, ODBC konekcija je kreirana.

U narednoj tabeli dat je kratak pregled ODBC funkcija u PHP – u:

Naziv Funkcije Sintaksa Opisodbc_connect odbc_connect(ime baze,

korisnicko ime, sifra)Ova funkcija služi za povezivanje na bazu preko ODBC drajvera.

odbc_result odbc_result(broj polja, ime) Ova funkcija služi za čitanje podataka iz polja baze

odbc_exec odbc_exec(promenljiva u koju je zapisan upit, promenljiva za odbc konekciju)

Služi za čitanje upita preko odbc drajvera

Odbc_fetch_row Odbc_fetch_row(promenljiva) Čita podatke iz redova baze

Odbc_close Odbc_close() Služi za zatvaranje odbc konekcije

18