Provjera koja je uvijek istinita
O sadržaju i njegovoj provjeri
U ovom članku
Ova usluga ima 23 UPDATE naredbe. Točno jedna provjerava je li išta promijenila. Ta je provjera:
'success' => $n->rowCount() >= 0
rowCount() vraća 0 kada nijedan redak ne odgovara. Nula je veća od ili jednaka nuli. Provjera prolazi što god se dogodi.
Čemu služi naredba
Sprema potvrdni okvir: želi li vlasnik brojača tjedno izvješće e-poštom. Adresa je u zasebnoj tablici i redak se ondje pojavljuje tek nakon što netko klikne poveznicu za potvrdu u poruci koju je zatražio. Četiri brojača imaju takav redak. Aktivnih je 2.218.
Zato za 99,8 % brojača naredba UPDATE ne pronalazi ništa. Krajnja točka odgovara success: true i postavka nije spremljena jer je nema u što spremiti.
Komentar iznad je točan
Tri retka više, u istoj funkciji:
„Samo ondje gdje postoji potvrđen povratni put. Bez njega nema adrese na koju bi izvješće moglo otići — a potvrdni bi okvir obećavao nešto što se ne događa.“
To je upravo točno. Netko je razmislio o ovom slučaju, razumio ga i zapisao obrazloženje. Zatim je redak ispod koristio >= ondje gdje je obrazloženje tražilo >.
Ovo vrijedi izravno pogledati jer je uobičajeno objašnjenje — nitko o tome nije razmislio — dostupno i pogrešno. Razmišljanje je u datoteci. Zakazao je jedan znak, na mjestu gdje pogrešna i ispravna verzija na prvi pogled izgledaju isto i ponašaju se isto u svakom testu koji ima redak za ažuriranje.
Nikoga se ne obmanjuje
Evo dijela koji bi bilo lako izostaviti, a izostavljanje bi ovu objavu učinilo dramatičnijom i manje istinitom.
Stranica ne iscrtava taj potvrdni okvir ako redak ne postoji. Jedan zaslon dalje, u kodu koji iscrtava okvir postavki vlasnika, najprije se šalje upit istoj tablici i cijeli se blok preskače kada upit vrati prazan rezultat. Zato vlasnik brojača bez potvrđene adrese nikad ne vidi kontrolu, ne klikne je i ne dobije lažnu potvrdu.
Neispravnoj provjeri može se pristupiti samo izravnim pozivanjem krajnje točke s valjanim tokenom. Netko tko to učini dobiva success: true i nijednu spremljenu postavku. To je stvaran i uzak nedostatak.
Zašto to ipak vrijedi zapisati
Funkcija je sigurna zbog zaštite koju nitko nije zapisao kao zaštitu. Redak koji postoji da bi je učinio sigurnom ne čini je sigurnom. To čini uvjet iscrtavanja u drugoj funkciji, čiji komentar objašnjava zašto je potvrdni okvir skriven — a ne da išta ovisi o tome da ostane skriven.
Uklonite ili preuredite taj uvjet iscrtavanja — razumno pri preoblikovanju ploče postavki — i nedostatak odmah postaje vidljiv, a nigdje ništa ne povezuje te dvije promjene. Sigurnost je stvarna i slučajna, a slučajna sigurnost ona je koja nestaje tijekom nepovezanog rada.
Isti kod to radi ispravno jednu datoteku dalje. Odgovarajuća funkcija web-prstena pita postoji li redak, vraća false kada ne postoji i uopće ne šalje ažuriranje. Ta tablica trenutačno ima nula redaka, pa funkcija vraća false pri svakom pozivu, što je točan odgovor.
Opći oblik
Naredba UPDATE koja ne pronađe nijedan redak nije pogreška ni u jednoj bazi podataka. To je uspješna naredba koja ništa nije učinila i svaki će sloj iznad prijaviti uspjeh ako nešto ne postavi pitanje. Dvadeset dvije ovdašnje naredbe ne pitaju i za većinu je to u redu: ažuriraju redak za koji je zahtjev već dokazao da postoji.
Ona koja je trebala pitati pitala je tako da ne može pasti. rowCount() >= 0 nije slaba provjera, nego izostanak provjere prerušen u provjeru — i gore je od nepostojanja provjere jer sljedeća osoba koja čita funkciju vidi pregledavanje rezultata i prestaje tražiti.
Izraz rowCount() > 0 pojavljuje se nula puta u ovom kodu. Ta je brojka pretvorila tipografsku pogrešku jednog znaka u nešto vrijedno objave: nije stvar u tome što je jednom pogrešno napisano, nego nigdje nije postojao ispravan primjer za usporedbu.
Popravljeno 28. kolovoza 2026. Krajnja točka sada prije ažuriranja pita postoji li redak, kao što je već radila funkcija web-prstena jednu datoteku dalje, i odgovara false kada ne postoji. Očit popravak jednog znaka — usporedba s većim od nule — najprije je izmjeren i odbačen: upravljački program prijavljuje promijenjene retke, a ne pronađene retke, pa postavljanje potvrdnog okvira na postojeću vrijednost ništa ne mijenja i ta bi verzija prijavila neuspjeh za ispravnu operaciju. Obje su verzije pogrešne, u suprotnim smjerovima.