Kontrola, ktorá je vždy pravdivá
V tomto článku
V tejto službe je 23 príkazov UPDATE v kóde. Presne jeden z nich kontroluje, či niečo zmenil. Kontrola znie:
'success' => $n->rowCount() >= 0
rowCount() vracia 0, keď sa nezhoduje žiadny riadok. Nula je väčšia alebo rovná nule. Kontrola prejde bez ohľadu na výsledok.
Na čo je príkaz
Ukladá zaškrtávacie políčko: či vlastník počítadla chce týždenný prehľad e-mailom. Adresa je v samostatnej tabuľke a riadok sa v nej objaví iba po kliknutí na potvrdzovací odkaz v e-maile, ktorý si človek vyžiadal. Taký riadok majú štyri počítadlá. Aktívnych je 2 218.
Pri 99,8 % počítadiel sa teda príkaz UPDATE nezhoduje s ničím. Koncový bod odpovie success: true a nastavenie sa neuloží, pretože ho nie je do čoho uložiť.
Komentár nad ním je správny
O tri riadky vyššie v tej istej funkcii:
„Iba tam, kde existuje potvrdená cesta späť. Bez nej nie je adresa, na ktorú by sa prehľad mohol poslať — a zaškrtávacie políčko by sľubovalo niečo, čo sa nestane.“
To je presne správne. Niekto o tomto prípade premýšľal, pochopil ho a zapísal dôvody. Potom riadok pod ním použil >= tam, kde odôvodnenie vyžadovalo >.
Oplatí sa na to pozrieť priamo, pretože bežné vysvetlenie — nikto na to nemyslel — je dostupné a nesprávne. Premýšľanie je v súbore. Zlyhal jediný znak na mieste, kde nesprávna a správna verzia na prvý pohľad vyzerajú rovnako a rovnako sa správajú v každom teste, ktorý má riadok na aktualizáciu.
Nikomu sa neklame
Táto časť by sa ľahko vynechala a jej vynechanie by tento príspevok urobilo dramatickejším a menej pravdivým.
Stránka toto zaškrtávacie políčko nevykreslí, pokiaľ riadok neexistuje. O obrazovku vedľa, v kóde vykresľujúcom pole nastavení vlastníka, sa najprv preverí tá istá tabuľka a celý blok sa vynechá, keď dopyt vráti prázdny výsledok. Vlastník počítadla bez potvrdenej adresy teda ovládací prvok nikdy nevidí, nikdy naň neklikne a nikdy nedostane falošné potvrdenie.
Pokazená kontrola je dostupná iba priamym zavolaním koncového bodu s platným tokenom. Kto to urobí, dostane success: true a žiadne uložené nastavenie. Je to skutočná a úzka chyba.
Prečo to stále stojí za zápis
Funkcia je bezpečná vďaka ochrane, ktorú nikto ako ochranu nezapísal. Riadok, ktorý má zaisťovať bezpečnosť, ju nezaisťuje. Robí to podmienka vykreslenia v inej funkcii, ktorej komentár vysvetľuje, prečo je políčko skryté — nie to, že od jeho skrytia niečo závisí.
Odstráňte alebo prestavajte túto podmienku vykreslenia — rozumná vec pri zmene dizajnu panela nastavení — a chyba sa okamžite zviditeľní bez čohokoľvek, čo by obe zmeny spájalo. Bezpečnosť je skutočná a náhodná a náhodná bezpečnosť je druh, ktorý pri nesúvisiacej práci zmizne.
Ten istý kód to o súbor vedľa robí správne. Zodpovedajúca funkcia webringu sa pýta, či riadok existuje, vracia false, keď neexistuje, a aktualizáciu vôbec nevykoná. Tá tabuľka má teraz nula riadkov, takže funkcia vracia false pri každom zavolaní, čo je správna odpoveď.
Všeobecný tvar
Príkaz UPDATE bez zhody so žiadnymi riadkami nie je chybou v žiadnej databáze. Je to úspešný príkaz, ktorý nič neurobil, a každá vrstva nad ním ohlási úspech, pokiaľ sa niečo neopýta. Dvadsaťdva tunajších príkazov sa nepýta a pre väčšinu je to v poriadku: aktualizujú riadok, ktorého existenciu požiadavka už dokázala.
Jediný, ktorý sa potreboval opýtať, sa opýtal spôsobom, ktorý nemôže zlyhať. rowCount() >= 0 nie je slabá kontrola, ale neprítomnosť kontroly prezlečená za kontrolu — a je horšia než žiadna kontrola, pretože ďalší čitateľ funkcie vidí skúmanie výsledku a prestane hľadať.
Výraz rowCount() > 0 sa v tomto kóde objavuje nulakrát. To je číslo, ktoré z jednoznakového preklepu urobilo niečo hodné príspevku: nie že bol raz napísaný nesprávne, ale že nikde nebol správny príklad na porovnanie.
Opravené 28. augusta 2026. Koncový bod sa teraz pred aktualizáciou pýta, či riadok existuje, tak ako to už robila funkcia webringu o súbor vedľa, a pri neexistencii odpovedá false. Zjavná jednoznaková oprava — overovanie, či je počet väčší než nula — sa najprv zmerala a zamietla: ovládač vykazuje zmenené, nie zodpovedajúce riadky, takže nastavenie políčka na hodnotu, ktorú už má, nič nemení a táto verzia by ohlásila zlyhanie pri operácii, ktorá bola v poriadku. Obe verzie sú nesprávne v opačných smeroch.