traži:  
 php.com.hr > Unos podataka

Unos podataka
 


Ovo će biti prvi kompliciraniji primjer koji ćemo napraviti pošto se proces unosa podataka u bazi sastoji od dva osnovna koraka. Prvi je prikupljanje podataka kroz formu, a drugi pohrana tih podataka u bazi. Kasnije ćemo proširiti ovaj model sa dodatnim koracima validacije upisanih podataka te će sam proces postati cikličan a ne ravan kao sada. Naime, u slijedećem primejru će jednostavnosti izrade radi korisnik morati kliknuti Back gumb na svom browseru ukoliko se želi vratiti na formu, dok ćemo kasnije napraviti kod koji će mu omogućiti ispunjavanje forme sve dok uspješno ne pohrani podatke u bazu. No o „filozofskoj“ strani ovoga u svoje vrijeme.

Prije nego krenemo na sam primjer idemo pogledati kako pomoću SQL-a upisujemo podatke u bazu. Za unos podataka u SQL-u postoji INSERT naredba. MySql ima dvije sintakse za nju, no mi ćemo koristiti onu verziju koja je kompaltibilna i sa ostalim bazama poput Postgresql-a, Microsoft Jet-a (Access) i MsSql Servera. Na taj način ćemo kasnije uvijek moći prebaciti (portati) naše skripte i na druge baze ukoliko se za to pojavi potreba bez većih izmjena kodova.

Ukoliko vas zanima i druga sintaksa te detalji obje pogledajte http://dev.mysql.com/doc/mysql/en/INSERT.html.

Idemo pogledati INSERT naredbu za naš konkretan primjer pa ćemo proći kroz njene detalje.

INSERT INTO novosti (naslov, tekst, datum) VALUES ("Prva novost", "Ovo je tekst prve novosti koji moze biti puno veci od ovoga", "2004-04-12");

Objašnjenje :

Sve SQL naredbe počinju nazivom tipa naredbe. Pošto trenutačno obavljamo insert naredbu navodimo njeno ime. Prije navođenja imena tablice u koju želimo pohraniti podatke dolazi INTO. Kod naziva tablice je vrlo bitno napisati njeno ime u pravilom „caseu“ jer su imena baza, tablica i polja case sensitive. Sada dolazimo do kompliciranog dijela. Kao što vidite, u zagradama su navedena polja naše tablice, no jedno fali. Polje idnovost nije navedeno i ne radi se o pogrešci u pisanju. Naime, ukoliko se neko polje izostavi u listi njemu se automatski upisuje defaulta vrijednost (koja se može postaviti pri stvaranju tablice). Mi smo pri stvaranju tablice polju idnovost dali auto_increment osobinu koja pri svakom insertu tom polju pridružuje po defaultu vrijednost veću za 1 od zadnje upisane, stoga da bi se ta defaultna vrijednost sama upisala, polje sa auto_increment osobinom moramo izostaviti iz ove liste.

Nakon liste polja dolazi VALUES čime naznačujemo da slijedi lsita vrijednosti koja se pohranjuje u tablicu. Ovdje dolazi jedna jako bitna stvar na koju treba paziti pri pisanju upita. Vrijednost koju želimo pohraniti u jedno od polja mora biti na istoj poziciji u listi vrijednosti kao i ime polja u koje ju želimo spremiti u listi polja. Znači u našem primjeru se vrijednost „Prva novost“ pohranjuje u polje naslov itd.

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

Siguran sam da ste primjetili čudan način pisanja datuma. 2004-04-12 nije uobičajen način pisanja datuma i na prvi pogled nije jasno što je mjesec a što je dan u njemu. Format slovima bi bio GGGG-MM-DD. MySql pohranjuje datume u ovom formatu radi jednostavnost sortiranja datuma pošto su sve vrijednosti složene po svom utjecaju na poziciju u sortiranoj listi tako da se mogu soritirati jednostavnim i brzim algoritmima kao i tekstualni podaci. Kod unosa datuma u bazu morate uvijek paziti da je datum pravilnog oblika, što će reći da 2004-1-10 neće proći jer mu fali druga znamenka za mjesec. Isto vrijedi i za dan u mjesecu. Znaći prepravljeno bi izgledalo 2004-01-10. No, ovo nije veći problem iz dva razloga. Prvi je taj što MySql ima ugrađene funckije koje vraćaju trenutno vrijeme na serveru, tako da se može nju koristiti za upis trenutnog datuma, a druga je što sam PHP ima date() funckiju koja ima mogućnost fleksibilnog generiranja datuma, tako da možemo bez muke generirati datum i ovog oblika.

Idemo se sada prebaciti na konkretan primjer koji će upotrijebiti gornji SQL upit da pohrani podatke forme u bazu. Za sada ćemo se držati osnovnih stvari, tako da će validacije forme i sve napredne mogućnosti biti preskočene radi bolje razumljivosti primjera.

Primjer 2 : Forma za unos podataka

Ovaj primjer je nastavak izrade sitea iz prvog primjera te ćemo u njemu koristiti dbspoj.php koji smo napravili u prvom primjeru. Otvorite svoj omiljeni code editor i u njemu stvorite unosvijesti.php te ga pohranite u isti direktorij gdje se nalazi i dbspoj.php.

<html>

<head>

<title>Unos vijesti</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

</head>

<body>

<h1>Unos novosti</h1>

<hr>

<?

if (!$_POST["SBunos"])

{

?>

<form method="post" action="">

Naslov : <input type="text" name="naslov"><br>

Tekst :&nbsp;&nbsp; <textarea name="tekst"></textarea><br>

<input type="submit" name="SBunos" value="Pohrani">

</form>

<?

} else {

include "dbspoj.php";

$datum=date("Y-m-d");

$sql="INSERT INTO novosti (naslov, tekst, datum)

VALUES ('$_POST[naslov]', '$_POST[tekst]', '$datum')";

if (mysql_query($sql))

{

echo "Novost je uspješno pohranjena";

} else {

echo "Nastala je greška pri pohrani novosti<br>" . mysql_error();

}

}

?>

</body>

</html>

Objašnjenje :

Na ovom primjeru ćemo naučiti par vrlo bitnih stvari. Prva nije direktno vezana uz PHP ili MySql, no može biti vrlo bitna i problematična. Radi se o kodnoj stranici (encodingu) našeg dokumenta.

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

Da ne bi nailazili na probleme pri radu sa hrvtaskim znakovima nije toliko bitno koji ćete encoding odabrati, već da koristite uvijek isti kroz sve dokumente projketa. Pravilo bi bilo da će hrvatski znak koji je u bazu pohranjen pod jednom kodnom stranicom pravilno biti prikazan samo pod tom istom kodnom stranicom.

Struktura, tj. logika ove skripte slijedi logiku same operacije. U njoj je prvi korak unos podataka u formu, a drugi korak je pohrana tih podataka u bazu. Kao uvijet obavljanja prvog ili drugog koraka je postojanje vrijednosti u varijabli $_POST["SBunos"], tj. varijable koju stvara pritisnuti submit gumb forme imena SBunos.

Idemo malo pogledati samu formu.

<form method="post" action="">

Naslov : <input type="text" name="naslov"><br>

Tekst :&nbsp;&nbsp; <textarea name="tekst"></textarea><br>

<input type="submit" name="SBunos" value="Pohrani">

</form>

Kao što vidite, u form tagu action atribut nema vrijednost. Ovo će uzrokovati slanje podataka istoj stranici na kojoj se nalazi forma. Znaći, u našem primjeru se forma prikazuje na unosvijesti.php te će se i nakon submitanja forme opet otvarati ista stranica. Također, ukoliko je pri otvaranju stranice postojao neki query string iza imena stranice i on će se također koristiti pri otvaranju nove stranice nakon submitanja forme. Ovo je vrlo korisno jer kasnije uvijek možemo promijeniti ime stranice / dokumenta iz unosvijesti.php u nešto drugo,a skripta će i dalej raditi bez ikakvih izmejna u njoj ili dati dodatan uvijet prikaza forme na osnovi neke vrijednosti u nekoj query string varijabli.

Prije nego uđem u detalje drugog koraka želim napomenuti da ovaj primjer nije primjeren za neki relani projekt jer mu fale validacije podataka forme, no taj dio je trenuto izostavljen radi jednostavnosti primjera te bolje razumljivosti ključnih stvari koje on ilustrira.

Drugi korak pohranjuje podatke iz forme u bazu. Da bi se moglo nešto pohraniti u bazu prvo se moramo spojiti na MySql server i odabrati ju, što smo napravili u prvom primjeru koji je pohranjen u dbspoj.php te ga ovdje samo includamo.

include "dbspoj.php";

Nakon uspješnog spajanja na bazu se možemo zabaviti sa samim generiranjem SQL upita.

$datum=date("Y-m-d");

U našem primjeru moramo u bazu upisati datum kada je novost stvorena, tj. trenutačni datum. Ovo je moguće napraviti na više načina. Prvi je ovaj koji je korišten u primjeru pomoću PHP date() funckije, adrugi bi bio pomoću ekvivalentne MySql ugrađene funkcije. Koju ćete koristiti je amnje bitno, no moj prijedlog je da se koristi PHP funkcije pošto se pomoću nje može stvoriti bilo koji prošli ili budući datum dodavanjem drugog opcisjkog argumenta (za detalje pogledati opis date() funkcije u PHP manualu) što je vrlo korisno kada nam se server nalazi u drugoj vremenskoj zoni te ga moramo uskladiti sa našim lokalnim vremenom. Kao što je već bilo govora, datum se u MySql upisuje u točno predodređenom GGGG-MM-DD formatu, što je zadano date funckiji njenim argumentom kojim određujemo format datuma. Siguran sam da pogađate da se Y zamijenjuje sa 4 znamenke trenutne godine, m sa trenutnim mjesecom u dvije znamenke te d sa danom u trenutnom mjesecu u dvije znamenke. Za popis svih mogućih znakova koje će date funckije obraditi tj. izmjeniti sa nekim segmentom datuma pogledajte ops date() funckije u PHP manulau. Mi ćemo krenuti dalje.

$sql="INSERT INTO novosti (naslov, tekst, datum)

VALUES ('$_POST[naslov]', '$_POST[tekst]', '$datum')";

Slijedeći korak je stvaranje stringa u kojem se nalazi sam SQl upit za unos podataka u tablicu. Pošto smo njegove detalje već upoznali prije ovog primjera samo ću napomenuti par stvari. Prva stvar je da pri ovakvom generiranju upita trebate jako paziti na navodnike, tj da se ne dogodi situacija da neki otvorite a ne zatvorite ili da neke od njih potpuno izostavite, poput onih ' u gornjem retku koji služe za navođenje tekstualnih (string) podataka unutar samog upita. Oko ovoga će vam djelomično pomoći kvalitetan code editor koji boja stringove posebnom bojom te time naglašava gdje koji string poćinje a gdje završava ili ima neku drugu metodu naglašavanja istoga. Druga bitna stvar je da pri radu sa formama uvijek koristiti ime globalne vrijable ($_POST, $_GET itd.) iz koje podaci dolaze radi sigurnosti da netko ne pokuša kroz query string na neki način prevariti našu skriptu. No ovo je izvan domene ovog vodića tako da se na pojašnjivanju ovoga trenutno neću zadržavati.

if (mysql_query($sql))

{

echo "Novost je uspješno pohranjena";

} else {

echo "Nastala je greška pri pohrani novosti<br>" . mysql_error();

}

Ovo je glavni dio naše skripte koji obavlja samu komunikaciju sa MySql serverom, tj. izvrašav SQL upit na njemu. To se obavlja pomoću mysql_query() funckije. Idemo se malo na njoj zadržati.

mysql_query() funckija 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 valjanom spoju na MySql server koji smo mi u našj dbspoj.php skripti pohranili u $db varijablu. Pošto mi u našim primjerima baratamo samo sa jednim spojem on je izostavljen i PHP će ga automatski koristiti kao što je već objašnjeno u prvom primjeru.

U slučaju INSERT upita mysql_query() vraća true ukoliko je upit uspješno obavljen ili false u suprotom. Iz tog razloga je moguće pomoću if-a provjeriti da li je naša novost pohranjena u bazu te ovisno o tome ispusujemo odgovarajuću poruku korisniku. Moguće greške koje se tu obično znaju javljati su ili sintaktičke priprode, tj. nešto je krivo napisano u samom SQL upitu ili tehničke prirode kao recimo da se nešto dogodilo sa MySql serverom ili vezom na njega iza našeg uspješnog spajanja. Također je moguće da je korisnik u formu upisao neki nedozvoljen znak poput ' a mi ga našim validacijskim procesima nismo uhvatili i obradili što na kraju rezultira opet sintaktičkom pogreškom u samom SQL upitu.

U slučaju da je nastala neka od ovih čestih ili neka druga rijeđa greška možemo ispisati njen opis pomoću mysql_error() funckije. Ona može primiti jedan argument sa nekim otvorenim i valjanim spojem na MySql server. Bitno je da bude isti onaj nad kojim je i obavljen upit. Pošto se mi spajamo samo na jedan serevr, ovaj argument je opet izostavljen.

Prije nego nastavmo, unesite par vijesti u bazu pomoću naše forme tako da stvorimo kup podataka sa kojim ćemo moći baratati u kasnijim primjerima.

I to bi bila pohrana podatak u bazu. Slijedeći korak u izradi naše aplikacije je izrada alata pomoću kojeg ćemo moći prolistati sve novosti koje se nalaze u našoj tablici. Ovo ćemo kroz par slijedećih primjera proširivati da bi na kraju dobili kompleksan alat koji će biti centar administracije cijelog sisteam novosti iz kojeg će se moći brisati postojeće novosti, te prebacivati na formu za uređivanje pojedine novosti. No ići ćemo redom. Prvo ćemo izabrati sve novosti iz baze te ih ispisati u tablici.  



PHP i MySQL
 © 2004 - 2008 php.com.hr