traži:  
 php.com.hr > Uređivanje podataka

Uređivanje podataka
 


Sada moram priznati da sam malo lagao sa gornjim naslovom. Naime, nećemo se odmah poigrati sa samim upitima za uređivanje podataka u tablicama. Zašto? Razlog tome je zapravo poprilično jednostavan. U realnim web aplikacijama, kojima se mi trenutnu bavimo, da bi mogli urediti neki podatak morate ga prvo pribaviti podataka iz baze, prikazati ga u formi te tek nakon izmjena pohranjujeme izmjene na njemu.

Možda primjećujete da smo već prošli kroz osnove pribavljanja podataka. No, isto tako se sigurno sjećate da nismo prošli kroz sve klazule SELECT naredbe već smo rekli da će o njima biti govora kasnije. Pogađate, kasnije nas je sustiglo.

Kada smo pričali o SELECT naredbi upoznali smo se kako prihvatiti sve retke jedne tablice te kako ih sortirati. Sada ćemo vidjeti kako izabrati točno određene retke ili redak tablice. U našem konkretnom slučaju moramo pribaviti jednu novost da bi ju mogli obraditi. Pa idemo vidjeti kako to učiniti.
Izdvajanje skupa podataka tablice

Znaći, cilj nam je izdvojiti samo dio redaka (podataka) tablice. Možda već pogađate kako ćemo to učiniti jer smo to već radili pri brisanju podataka u tablici. Tamo smo koristili WHERE klazulu da bi odabrali novost koju smo htjeli obrisati. Tako ćemo ju i sada koristiti, i to na identičan način pošto se opet radi o izabiranju samo jedne novosti.

SELECT * FROM novosti WHERE idnovost=1

Gornji primjer pribavlja sva polja novosti čiji je ID jednak jedan, ukoliko takva postoji u tablici. Idemo se malo zadržati na WHERE-u pošto se radi možda o najbitnijoj tj. najkorištenijoj klazuli. Kao što smo već vidjeli pri upoznavanju sa DELETE upitom unutar uvijeta WHERE klezule se može kombinirati veći broj uvijeta spojenih logičkim funckijama I, ILI, ISKLJUČIVO ILI (XOR) te NOT. Sam uvijet je moguće zakomlicirati koliko nam mašta dopušta, no pri takvim upitima morate imati na umu da će s ekompleksnost uvijeta odraziti na brzinu obavljanja upita, što bi moglo značajno usporiti pribavljanje podataka iz vrlo velikih tablica (u tablicama sa X00 000 + redaka, gdje je X = 1 do 9). Taj efekt se može donekle ublažiti korištenjem indeksa, no sa njima ćemo se upoznati kasnije tako da ćemo ovo za sada ostaviti. Umjesto toga idemo vidjeti primjer jednog kompleksnijeg upita nad našom tablicom.

SELECT * FROM novosti WHERE (idnovost<10 AND !datum < "2004-01-01") OR datum = "2004-04-19"

Ili u prijevodu, izaberi sva polja redaka iz tablice novosti čiji je idnovost manji od 10 a da im datum nije manji od 1.1.2004. ili one retke čiji je datum jednak 19.4.2004.

Normalno, ovakav upit nema previše smisla, no poslužio je ilustraciji kompleksnosti koja se može naći u uvijetu WHERE klazule.

Još jedna napomena. U gornjem primjeru su zagrade mogle komotno biti izostavljene. To ima veze sa prednosti pri izvršavanju logičkih operacija. Slično kao i u klasičnoj aritmetici, u logičkoj se prvo obavlja AND, tek zatim OR (množenje i zbrajanje), no ovo je tema u koju ne bih ulazio pošto bi vam trebala biti poznata iz osnova programiranja. Zagradama sam se poslužio samo da vas upoznam sa činjenicom da ih se može koristiti.

Ne znam jeste li primjetili da do sada nisma koristio niti jedno od dva tekstualna polja iz naše tablice u primjerima. To sam učinio namjerno jer taj slatkiš čuvam za sam kraj. Sada ćemo nastaviti sa pravim naslovom ovog dijela vodiča, a to je uređivanje podataka u tablici.
Izmjena postojećih podataka

Za izmjenu podataka se koristi UPDATE naredba. Sa njom smo se upoznali sa svim vrstama upita. Idemo se bez puno priće prebaciti na konkretan primjer.

UPDATE novosti SET naslov="Novi naslov"

Idemo malo ovo razložiti. Kao i svi ostali upiti do sada i ovaj počinje navođenjem imena operacije koju želimo izvesti. No, ovog puta smo odmah nakon naziva naredbe naveli tablicu u kojoj želimo napraviti izmjene. Nakon imena tablice slijede SET koji govori da slijede parovi imena polja tablice sa pridruženim novim vrijednostima. Nakon izvršavanja gornjeg primjera bi izmjenili svim retcima tablice naslov u „Novi naslov“.

Ukoliko je potrebno izmjeniti više polja istovremeno, to bi učinili ovakvim upitom:

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

Znaći, za izvođenej izmejna vrijednosti u više polja potrebno je dva naziva polja sa pridruženim vrijednostima odvojiti zarezom.

Normalno, izmejna vrijednsoti svim retcima neke tablice je vrlo rijetka pojava u realnim skriptama. Iz tog razloga je moguće pomoću WHERE klazule ograničiti skup podataka nad kojima se vrši izmjena. U našem konkretnom primjeru bi to izgledalo odprilike ovako :

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

Ovim upitom smo izmjenili naslov i datum upisa novosti koja ima ID jednak jedan.

Kao što vidite, ne radi se o nečemu previše problematičnom. Zato neću više teoretizirati već se bacam na konkretan primjer.

Primjer 5 : Izmjena novosti

Evo nas na najkompleksnijem primjeru do sada jer se u njemu koriste dva različita tipa upita. Prvi koji pribavlja podatke koji se mogu izmjeniti te drugi koji ih mijenja u bazi. Zato nećemo gubiti vrijeme već otvorite svoj omiljeni code editor i upišite slijedeći kod.

<html>

<head>

<title>Uređivanje novosti</title>

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

</head>

<body>

<h1>Uređivanje novosti</h1>

<hr>

<?

include "dbspoj.php";

if (!$_POST["SBuredi"])

{

// provjera ulaznih podataka

$err=false;

if (!$_GET["idnovost"])

{

echo "Nepotpuni ulazni podaci";

$err=true;

} else {

// pribavi novost za prikaz u formi

$sql="SELECT * FROM novosti WHERE idnovost=" . $_GET["idnovost"];

if (!$q=mysql_query($sql))

{

echo "Nastala je greška pri izvođenju upita<br>" . mysql_query();

$err=true;

} elseif (mysql_num_rows($q)==0) {

echo "Nepostojeća novost";

$err=true;

} else {

$novost=mysql_fetch_array($q);

}

}

// prikaz forme ukoliko je prihvaćena

if (!$err)

{

?>

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

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

Naslov : <input type="text" name="naslov" value="<?=$novost["naslov"]?>"><br>

Tekst : <textarea name="tekst"><?=$novost["tekst"]?></textarea><br>

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

</form>

<?

}

} else {

// pohrana izmjena novosti

$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 uspješno uređena.";

} else {

echo "Novost nije izmjenjena.";

}

} else {

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

}

}

?>

</body>

</html>

 



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