Neželjeni SQL insert kod POST/GET.
Kod programiranja ulaza u databazu i dodavanja podataka u tabelu svaki će se programer susresti
sa pojavom nepoželjnog dodavanja podataka u tabelu databaze. Kod toga dolazi obavezno prilikom
osvježenja (refresh) sadržaja stranice, sadržeće formularske entite. Kada su podaci umetnuti u
entite formulara poslani na web server uz pomoć metode POST, biti ćemo obavješteni ka ponovnom
slanju podataka, ili poništenju tog slanja, no kod korištenja metode GET biti će ti sami podaci
automatski ponovljeni, pošto svi predani parametri se nalaze na komandnom retku pretraživaća,
priključeni ka odgovarajučem URL.
Slijedeća tablica sadrži četiri zadnji puta umetnuta podatka. Podaci trebaju biti stavljeni u
tablicu samo nakon pritiskanja tipke 'Spremiti'. Kada ovu tipku jedan puta pritisnete, dođe do
pripajanja podatka iz tekstualnog polja kao zadnjeg podatka u tablici, što lako provjerimo
promatranjem broja u stupcu ID, koji je automatski generiran SQL databazom i jeste zajamčeno i
jedinstven. Slijedeći puta se nećemo više koristiti tipkom 'Spremiti', no osvježimo sadržaj
stranice, naprimjer prekoko menija dobivenog uz pritisak na desnu tipku miša. Sigurno zapazimo,
da sadržaj tekstualnog polja je ponovo nadodan kao zadnji redak tablice. No to je sada sigurno
nepoželjno nadodavanje.
| ID | Text |
| 311 | Podatak će biti pohranjen u tablici nakon pritisnuća tipke 'Spremiti'. |
| 312 | Podatak će biti pohranjen u tablici nakon pritisnuća tipke 'Spremiti'. |
| 313 | Podatak će biti pohranjen u tablici nakon pritisnuća tipke 'Spremiti'. |
| 314 | Podatak će biti pohranjen u tablici nakon pritisnuća tipke 'Spremiti'. |
Kao što možete sami provjeriti, kada za pohranjenje podatka u tablicu primjenite slijedeću tipku
'Spremiti', biti će podtak u tablicu pohranjen tek nakon njegovog pritisnuća i ne kod izazvanog
osvježenja sadržaja ove stranice.
Dalje ću navesti rješenje, koje sprečava nepoželjno ponovljeno umetanje podataka u tablicu.
Popisano će biti uz korištenje skript jezika PHP4, no naravno da slično možemo rješit ovaj
problem i sa korištenjem Jave, ili drugih programskih sredstava.
Kako je bio ovaj cilj postignut? Najprije je bila ispitana prisutnost neke varijable,
nalazeće se u tijelu formulara, najbolje same tipke 'Spremiti'. Pošto sve varijable su u biti
prisutne i kod nasljednog osvježenja sadržaja stranice kao parametri u URL, potrebno je njih
iz URL odkloniti, ovdje tako, da neposredno nakon pohranjenja podataka u tablicu databaze
pošaljemo web serveru ponovni zahtjev za istom stranicom, no sada bez naziva i vrijednosti
varijable, kojoj prisutnost smo bili ispitivali. Ovdje slijede fragmenti izvornog koda u PHP4:
<?php // provjera prisutnosti varijable iz tijela formulara if (isset($save2)) { $podatak2 = addslashes(trim($podatak2)); $db->query("INSERT INTO manuals1 (txt) VALUES('$podatak2')"); // ponovljeni zahtjev za iscrtanjem stranice bez parametara header("Location: ../hr/hr_dbInsert.php"); } . . . <center> <table border="0" cellspacing="1" cellpadding="0"> <tr> <td class="tabid">ID</td> <td class="tabtxt">Text</td> </tr> <? $db->query("SELECT * FROM manuals1 ORDER BY Id"); while ($db->next_record()) { ?> <tr> <td class="tabid"><? echo $db->f("Id"); ?></td> <td class="tabtxt"><? echo stripslashes($db->f("txt")); ?></td> </tr> <? } ?> </table> <form method="GET" action="../hr/hr_dbInsert.php" target="body"> <!-- varijabla $save2 u tijelu formulara --> <input type="submit" name="save2" value="Spremiti" id="submit"> <input type="text" name="podatak2" value="Ovaj podatak .... tipke 'Spremiti'."> </form> </center> ?>
Kao što se vidi, spremanje podataka u tablicu predhodi njihovom iscrtavanju na stranici.
Preporučlivo je smjestiti testiranje na prisutnost varijable iz tijela formulara na početak
skripta, još prije početka isrtavanja stranice. Tako sigurno smanjimo potrebna vremena
i cijela pojava će se nama pričinjavati trenutačnom. No pozor na činjenicu, da kod ponovnog
slanja zahtjeva na web server stvarno ne šaljemo sa ostalim prametrima naziv varijable, koju smo
bili prije testirali na prisutnost. U primjeru nema u URL parametara slanih na server!
U suprotnom postignemo samo nekontrolirani broj ponovljenih poziva servera i s time nezavršenje
rada ovog skripta, negledajući preopterečenje web servera, pretraživaća i mreže!
© 2005 Djordje Zurovac, sva prava pridržana.