Lekcije:
Na ovoj stranici:
- Kreiranje baze
- Koje podatke trebam?
- Kreiranje baze
- Kreiranje tablica
- Objašnjenja koda
- Design aplikacije
- PHP kod aplikacije
- Čitanje dosadašnjih poruka
- Zapisivanje poruke
- Ponavljanje...
PHP.net
PHP.net je centralno mjesto za novosti u vezi razvoja PHPa te za download instalacija i dokumentacije..
php.com.hr
Hrvatska PHP zajednica ima svoje stranice s mnogo korisnog sadržaja.
www.php.hr
Stranice udruge PHP programera Hrvatske s podosta PHP sadržaja
Wikipedia o PHPu
Napravili ste stranicu i zanima vas da li ste poštovali postojeće standarde i preporuke? Provjerite ovdje.
PHP primjer: knjiga gostiju
U ovoj lekciji trebali bismo vidjeti tipičnu uporabu PHPa i MySql baze podataka. Knjiga gostiju je tipična mala aplikacija koju možete ugraditi na različite stranice. Izradom te aplikacije pokazat ćemo osnovne korake pri izradi takvih i sličnih aplikacija i demonstrirati tipične mehanizme zapisivanja korisničkih podataka u bazu na poslužitelju te ispis podataka iz baze na HTML stranici.
Sve datoteke potrebne za rad skinite odavde.
Kreiranje baze
Obično je prvi korak pri izradi ovakve aplikacije izrada baze podataka. U ovom slučaju baza će biti prilično jednostavna, kod složenijih primjena treba dobro razmisliti o organizaciji i optimizaciji baze jer nam to može uštedjeti dosta truda kasnije i ubrzati i pojednostavniti aplikaciju. O organizaciji i optimiziranju baza možda u nekoj budućoj lekciji.
Koje podatke trebam?
Podaci koje će korisnik poslati, a mi zapisati u bazi su slijedeći:
- poruka
- ime korisnika
- datum slanja poruke
Za to nam je dovoljna jedna tablica u bazi. Trebali bismo i odrediti tipove podataka za svaki stupac tablice kao i nazive tih stupaca. Dakle, u bazi podataka trebat ću samo jednu tablicu, a nazivi stupaca i tipovi podataka u toj tablici bit će:
- poruka - TEXT
- ime - VARCHAR(20)
- datum - TIMESTAMP
- porukaID - INTEGER
Stupac porukaID dodali smo jer svaka tablica u bazi treba imati stupac koji služi kao ključ te tablice. Taj stupac ne mora sadržavati nikakve smislene podatke, bitno je samo da se podaci u njemu ne ponavljaju, odnosno da svaki zapis u tom stupcu jednoznačno određuje pojedini zapis u tablici.
Ukoliko nismo upoznati s različitim tipovima podataka u MySql-u, više o njima možete pročitati ovdje. Ovdje koristimo tipove:
- TEXT - tekstualni podatak s maksimalno 65535 znakova,
- VARCHAR(20) - tekst kojeg smo ograničili na maksialno 20 znakova. Maksimalni broj kojeg možemo upisati u zagradu i tako odrediti najveću dužinu zapisa je 255 znakova
- TIMESTAMP - vrijeme u formatu YYYYDDMMHHMMSS. Zgodno je to da ako ne zadamo vrijeme pri unosu, automatski se zapisuje vrijeme kad je pojedini redak u tablici zapisan što pojednostavljuje kod
- INTEGER cijeli brojevi opsega od -2147483648 do 2147483647
Aplikacija neće imati nikakav sustav prijave korisnika, dakle bilo tko moći će napisati bilo što.
Kreiranje baze u phpMyAdmin-u
U većini slučajeva kod pravih stranica na web poslužiteljima, bazu podataka ćemo već imati napravljenu, a od hosting tvrtke dobit ćemo podatke za rad s bazom (korisničko ime, zaporku i ime baze). Ukoliko izrađujemo bazu na svom računalu, potrebno je da sami napravimo bazu i korisnika za rad s njom. Da bismo to napravili poslužimo se phpMyAdmin sučeljem za rad s bazom. U adresnu traku web preglednika upišemo http://localhost. Zavisno od toga koji paket smo instalirali (XAMPP ili AppServ) imat ćemo malo drugačiji izbornik, ali tu bi trebao biti link za phpMyAdmin.
U početnom prozoru phpMyAdmina imamo obrazac za stvaranje nove baze podataka (u engleskoj verziji zove se Create new database). U prazno polje upišemo naziv nove baze, a padajućim izbornikom odaberemo encoding baze. Mi ćemo novoj bazi dati ime gbbaza, a za encoding (collation) zadati latin2_general_ci (to odgovara ISO 8859-2 encodingu kojeg obično zadajemo za stranice pa očekujemo najmanje problema).
Nakon klika na create pojavit će se izvješće tipa "Database gbbaza has been created".
Osim baze potrebno je napraviti korisnika koji će se služiti tom bazom. Kliknemo na ikonu kućice s lijeve strane koja nas dovodi na početnu stranicu phpMyAdmina. Odaberemo Privileges, a zatim Add a new User.
Potrebno je popuniti slijedeća polja obrasca:
- User name: (upišemo gbkorisnik)
- Host: ( upišemo localhost)
- Password: (upišemo aabbcc123)
- Re-type: (ponovno upišemo aabbcc123)
Korisniku ne treba dati nikakva globalna prava (Global privileges) pa samo kliknemo na Go na dnu obrasca. Pojavit će se izvješće tipa You have added a new user.
Puno niže na istoj stranici nalazi se dio obrasca za dodavanje prava na pojedine baze (Database-specific privileges). U tom izborniku odaberemo bazu gbbaza, na slijedećoj stranici odaberemo sva prava - stavimo svuda kvačice i ponovno kliknemo na Go.
To bi bilo sve što treba napraviti u phpMyAdminu.
Napravili smo novu bazu te korisnika koji ima sva prava za rad s tom bazom. Samu tablicu u bazi izradit ćemo drugačije.
Kreiranje tablica
U bazi treba napraviti samo jednu tablicu, detalje smo već odredili. Nju nećemo napraviti kroz phpMyAdmin sučelje, već ćemo napraviti malu php skriptu koja kreira tablicu.
Zašto takav pristup?
To smatramo praktičnijim jer će nam ta skripta poslužiti i pri izradi lokalne baze, a možemo je kasnije upotrebiti i više puta kad god "instaliramo" našu aplikaciju na neki poslužitelj.
Dakle napravimo novu php datoteku i unutar <body> tagova ubacimo slijedeći php dio:
<?php
$link=@mysql_connect("localhost","gbkorisnik","aabbcc123");
if(!$link){
echo"<p>Greška pri spajanju na database server!</p>";
exit();
}else{
if (!@mysql_select_db("gbbaza")){
echo"<p>Greška pri odabiranju baze podataka!</p>";
exit();
}
}
$query="CREATE TABLE gbtablica (
poruka TEXT,
ime VARCHAR(20),
datum TIMESTAMP,
porukaID INTEGER AUTO_INCREMENT PRIMARY KEY)";
if (mysql_query($query)){
echo "<p>tablica za knjigu gostiju je uspješno kreirana!</p>";
} else {
echo "<p>greška pri kreiranju tablice za knjigu gostiju!</p>";
}
?>
Datoteku spremimo pod imenom gb_instalacija.php u novu mapu gb u _rootu našeg poslužitelja (htdocs ili www). Kad je pokrenemo (tako da u adresnu traku preglednika upišemo http://localhost/gb/gb_instalacija.php), trebali bismo dobiti poruku "tablica za knjigu gostiju je uspješno kreirana!".
Objašnjenja koda
Prije bilo kakvog rada s bazom u PHPu, moramo obaviti dvije stvari: spojiti se na poslužitelj baze podataka i odabrati bazu za rad.
Naredba mysql_connect("localhost","gbkorisnik","aabbcc123");spaja se na poslužitelj baze podataka. Tri parametra koja su joj potrebna su redom: host (ime računala s bazom, u 99.9% slučajeva to je localhost), ime korisnika, lozinka korisnika.
Ispred ove (i drugih) mysql naredbi često stavljamo znak @. On nije obvezan, a ako ga stavimo, spriječit ćemo ispisivanje poruka o MySql greškama na našoj stranici. Dakle dok razvijamo aplikaciju to nam ne treba, ali pametno je to staviti na stranice koje objavljujemo.
Rezultat mysql_connect naredbe je pokazivač prema bazi ukoliko je veza ostvarena, odnosno FALSE ukoliko veza nije ostvarena. To nam omogućuje da u slijedećoj if naredbi napravimo izvješće o greški ako veza nije ostvarena te izađemo iz aplikacije ( naredbom exit(); ), ili da nastavimo s odabiranjem baze ako je veza ostvarena.
Odabiranje baze vršimo naredbom mysql_select_db("gbbaza"), parametar je ovdje ime baze koju odabiremo za rad.
Ukoliko je skripta došla do reda koji započinje sa $query= tad je uspjelo spajanje i odabiranje baze.
Upit za kreiranje tablice je definiran slijedećim redovima:
$query="CREATE TABLE gbtablica (
poruka TEXT,
ime VARCHAR(20),
datum TIMESTAMP,
porukaID INTEGER AUTO_INCREMENT PRIMARY KEY)";
Sve je jasno, iza CREATE TABLE ide ime tablice, a zatim u zagradi imena stupaca (polja) i tipovi podataka. Za polje porukaID dodali smo još neke argumente:
- AUTO_INCREMENT znači da se vrijednosti za to polje ukoliko ih ne zadamo eksplicitno biti automatski zadane tako da se upiše prva slijedeća veća vrijednost
- KEY znači da je to polje tablice ključ
- PRIMARY znači da je to polje osnovni ključ tablice.
Zadavanje ključa je naročito bitno kod baza sa više tablica, no zadali smo to i ovdje više zbog pokaza nego zbog stvarne potrebe. Sam upit zapravo ne radi ništa. To je niz MySql (a ne PHP) naredbi spremljen u varijablu $query kao najobičniji string.
Da bismo pokrenuli MySql upit služimo se php naredbom mysql_query($query), koja izvršava zadani MySql upit te vraća TRUE (u ovom slučaju, u nekim drugim slučajevima vraća podatke) ako je upit uspješno izvršen, a FALSE ako nije. To nam omogućava provjeru zadnjom if naredbom.
Design aplikacije
Ovaj ćemo korak ovdje preskočiti da lekcija ne bi bila predugačka. Zgodno je sučelje aplikacije dizajnirati u Dreamweaveru radeći s običnim HTMLom (ne PHPom), a rezultat toga je datoteka gb.html koju ste skinuli s datotekama i dalje ćemo krenuti od nje. U njoj smo napravili tablicu koja će prikazivati poruke, jednu poruku o greški i obrazac za dodavanje nove poruke. Na sve smo primijenili odgovarajuće CSS stilove.
Ipak, imate li vremena, pokušajte takvu datoteku napraviti sami.
PHP kod aplikacije
Krenut ćemo od datoteke gb.html, napravimo njenu kopiju i izmjenimo joj ime u "gb.php". Prebacimo se u pogled koda i odbah nakon početnog <body> taga ubacimo php blok ( oznake <?php i ?>).
Već smo rekli da je kod aplikacija koje rade s bazom potrebno prvo spojiti se s poslužiteljem baze podataka i odabrati bazu, zato ubacujemo slijedeći php kod:
$link=@mysql_connect("localhost","gbkorisnik","aabbcc123");
if(!$link){
echo"<p class=\"greska\">Greška pri spajanju na database server!</p>";
exit();
}else{
if (!@mysql_select_db("gbbaza")){
echo"<p class=\"greska\">Greška pri odabiranju baze podataka!</p>";
exit();
}
}
Kod nam je poznat iz instalacije baze, a ovdje smo samo dodali CSS. Primjetite znak \ u dijelu koda echo"<p class=\"greska\">Greška pri...
On nam treba da echo naredba može ispisati navodnike koji su potrebni prilikom zadavanja CSS klase. Bez tog znaka navodnici prije riječi greska bili bi shvaćeni kao kraj argumenta echo naredbe što bi dovelo do greške.
Čitanje dosadašnjih poruka
Do sada nismo izbacili tablicu s porukama iz naše php datoteke, a sad je red da i nju prikažemo dinamički. Prethodno podatke za popunjavanje tablice treba pročitati iz baze, a za to nam treba upit SELECT čiji opći oblik je slijedeći:
SELECT stupci FROM ime_tablice
[WHERE uvijet]
[ORDER BY ime_stupca [ASC | DESC]]
[LIMIT n];
Malo objašnjenja: uglate zagrade ne pišete, one su znak da je njihov sadržaj neobavezan.
- WHERE dio omogućava da pročitamo samo one redove koji odgovaraju određenom uvijetu.
- ORDER BY omogućava sortiranje prema određenom stupcu i to uzlazno ACS ili silazno DESC.
- LIMIT omogućava da pročitamo samo određeni broj redova, a ne sve.
Evo kako će to izgledati kod nas (ne zaboravite sad obrisati ostatak HTML koda probne tablice!):
$query="SELECT * FROM gbtablica ORDER BY datum DESC";
$podaci=@mysql_query($query);
if(!$podaci){
echo"<p class=\"greska\">Greška pri radu s bazom podataka!</p>";
exit();
}
$brredova=@mysql_num_rows($podaci);
?>
<table width="600" border="0" cellpadding="0" cellspacing="1" class="tablica">
<tr>
<td width="150" class="naslovni">poslao</td>
<td width="100" class="naslovni">datum</td>
<td class="naslovni">poruka</td>
</tr>
<?php
if($brredova>0){
for($i=1;$i<=$brredova;$i++){
$red=mysql_fetch_array($podaci);
$poruka=$red['poruka'];
$ime=$red['ime'];
$datum=$red['datum'];
echo"<tr>
<td class=\"ostali\">$ime</td>
<td class=\"ostali\">$datum</td>
<td class=\"ostali\">$poruka</td>
</tr>";
}
}else{
echo"<tr><td colspan=\"3\" class=\"ostali\">još nema poruka u knjizi gostiju</td></tr>";
}
echo"</table>";
Naravno, ovo treba malo i objasniti.
Upit smo napisali u jednom redu jer je prilično jednostavan. Znak * u upitu označava sve stupce. Drugim redom izvršavamo upit i spremamo rezultat upita u varijablu $podaci. Ukoliko upit nije uspio, vrijabla $podaci ima vrijednost FALSE pa to iskoristimo za provjeru (redovi 3 do 6).
Ukoliko je upit uspio, u varijabli $podaci pohranjeno je čitavo dvodimenzionalno polje podataka. To možemo poistovijetiti s tablicom, a broj redova u tablici dobit ćemo naredbom mysql_num_rows te ga spremamo uvarijablu $brredova.
Sad možemo prikazati naslovni red tablice. Umjesto da ga ispisujemo echo naredbom, ovaj puta ćemo zatvoriti php blok (red 8), običnim HTMLom ispisati naslovni red tablice (kopiramo ga), i nakon njega ponovno započeti PHP blok (red 15).
U novom bloku provjeravamo imamo li zapisa u tablici: if($brredova>0)...
Ako postoje podaci, čitat ćemo ih i ispisivati red po red. For petlja od 1 do $brredova osigurava ponavljanje onoliko puta koliko ima i redova. U svakom koraku petlje koristimo naredbu $red=mysql_fetch_array($podaci); kako bismo iz dvodimenzionalnog polja $podaci pročitali jedan red kao asocijativni niz. Asocijativni niz znači da pojedinim njegovim članovima možemo pristupiti preko indeksa u uglatim zagradama koji nije broj već string. Drugim riječima, uz pomoć slijedećih triju naredbi iz tog niza čitamo podatke.
Kad za pojedini red imamo poruku ime i datum prikažemo ih u tablici. Ukoliko nije bilo zapisa u bazi, proširimo polje preko sva tri stupca tablice i ispišemo prikladnu poruku:
echo"<tr><td colspan=\"3\" class=\"ostali\">još nema poruka u knjizi gostiju</td></tr>";
Zapisivanje podataka u bazu
Da bismo zapisali poslanu poruku u bazu podataka, potrebno ju je prvo primiti. Na samom početku stranice napravimo PHP blok i umetnemo slijedeći kod:
$ime=$_POST['ime'];
$poruka=$_POST['poruka'];
Tim naredbama primamo poslane podatke koje ćemo zapisati u bazu.
U dijelu neposredno iza spajanja s poslužiteljem baze i odabiranja baze ubacimo slijedeći kod koji će provjeriti da li su poslani kakvi podaci, da li su zadani svi potrebni podaci i zapisati ih u bazu. Evo koda:
if (isset($_POST['bio'])) {
$greska="";
if($poruka!="" && $ime!=""){
$query="INSERT INTO gbtablica (poruka, ime) VALUES ('$poruka', '$ime')";
$podaci=@mysql_query($query);
if(!$podaci){
$greska="Greška pri zapisivanju podataka u tablicu!";
}
}else{
$greska="Niste zadali sve potrebne podatke!";
}
}
Vidljivo je da radimo dvije provjere: da li je poslan podatak bio (skriveno polje obrasca), te da li je neki od podataka prazan string. U bilo kojem od tih slučajeva nećemo u bazu zapisati ništa.
Ako je sve u redu pravimo upit za zapisivanje podataka u tablicu. Pokretanje i provjera upita su riješeni slično kao i u prethodnim sličnim situacijama.
Možda bi trebalo objasniti i funkciju isset(ime_varijable). Ona provjerava da li je varijabla zadana, odnosno ima li ona ikakvu vrijednost. U ovom slučaju provjeravamo to za izraz $_POST['bio'] koji ima vrijednost jedino ako je korisnik poslao podatke obrasca (bio je skriveno polje).
Vezano za sam upit možda bi se netko mogao zapitati zašto na zadajemo datum i polje porukaID. Već kad smo pravili instalaciju rekli smo da porukaID nećemo unositi jer ima svojstvo AUTO_INCREMENT te će se automatski zapisati prva slijedeća veća vrijednost. U polja tipa TIMESTAMP isto tako se automatski zapisuje vrijeme zapisa. Ukoliko je došlo do problema, varijabla $greska sadrži odgovarajuću poruku, no ispisat ćemo je tek iza tablice (a prije obrasca):
if($greska!=""){
echo"<p class=\"greska\">$greska</p>";
}
To je sve. Naravno, ova mala aplikacija mogla bi biti i puno bolja i imati više dodatnih funkcionalnosti, no tada je ne bismo mogli napraviti u jednoj lekciji. I ovo je velik zalogaj...
Ponavljanje
- Veliki broj aplikacija za internet možemo napraviti koristeći php i MySql bazu podataka.
- Bazu je praktično napraviti pomoću phpMyAdmin sučelja, a tablice u bazi kreirati "instalacijskom" php datotekom
- upit za kreiranje tablice je CREATE TABLE
- upit za čitanje podataka iz tablice je SELECT...FROM...
Rezultat upita je polje s podacima koji odgovaraju postavljenom upitu. Podatke izdvajamo petljom i naredbom mysql_fetch_array - zapisivanje podataka u tablicu vršimo upitom INSERT INTO .... VALUES.
- polja tipa INTEGER AUTO_INCREMENT i TIMESTAMP se ne zadaju u INSERT upitu jer se zapisuju automatski