Verificarea care este mereu adevărată
Există 23 de instrucțiuni UPDATE în acest serviciu. Exact una dintre ele verifică dacă a modificat ceva. Verificarea aceasta este:
'success' => $n->rowCount() >= 0
rowCount() returnează 0 când niciun rând nu a corespuns. Zero este mai mare sau egal cu zero. Verificarea trece orice s-ar întâmpla.
La ce servește instrucțiunea
Salvează o bifă: dacă proprietarul unui contor vrea un rezumat săptămânal prin e-mail. Adresa se află într-un tabel separat, iar acolo apare un rând abia după ce cineva a dat clic pe linkul de confirmare dintr-un e-mail pe care l-a cerut. Patru contoare au un asemenea rând. Contoare active sunt 2.218.
Așadar, pentru 99,8% dintre contoare, UPDATE nu găsește nimic. Endpointul răspunde success: true și setarea nu este salvată, pentru că nu există unde să fie salvată.
Comentariul de deasupra este corect
Cu trei linii mai sus, în aceeași funcție:
„Doar acolo unde există o adresă de retur confirmată. Fără ea nu există nicio adresă la care să poată merge scrisoarea — iar bifa ar fi promis ceva ce nu se întâmplă.”
Este perfect corect. Cineva s-a gândit la acest caz, l-a înțeles și a scris raționamentul. Apoi linia de dedesubt a folosit >= acolo unde raționamentul cerea >.
Merită privit în față, pentru că explicația obișnuită — nimeni nu s-a gândit la asta — este la îndemână și greșită. Gândirea se află în fișier. Ce a eșuat este un singur caracter, într-un loc în care versiunea greșită și cea corectă arată la fel la prima vedere și se comportă identic în fiecare test care are un rând de actualizat.
Nimeni nu este mințit
Iată partea care ar fi ușor de omis, iar omiterea ei ar face acest articol mai dramatic și mai puțin adevărat.
Pagina nu afișează acea bifă decât dacă rândul există. La un ecran distanță, în codul care desenează caseta de setări a proprietarului, același tabel este interogat mai întâi, iar întregul bloc este sărit când interogarea nu întoarce nimic. Așa că un proprietar de contor fără adresă confirmată nu vede niciodată controlul, nu dă niciodată clic pe el și nu primește niciodată confirmarea falsă.
Verificarea defectă poate fi atinsă doar apelând endpointul direct, cu un token valid. Cine face asta primește success: true și nicio setare salvată. Este un defect real și unul restrâns.
De ce merită totuși consemnat
Funcția este sigură datorită unei protecții pe care nimeni nu a notat-o drept protecție. Linia care există ca să o facă sigură nu o face sigură. Ce o face sigură este o condiție de afișare dintr-o altă funcție, al cărei comentariu explică de ce bifa este ascunsă — nu că ceva depinde de faptul că rămâne ascunsă.
Eliminați sau restructurați acea condiție de afișare — un lucru rezonabil când se reproiectează un panou de setări — și defectul devine vizibil instantaneu, fără ca nimic, nicăieri, să lege cele două modificări. Siguranța este reală și este accidentală, iar siguranța accidentală este genul care dispare în timpul unor lucrări fără legătură.
Același cod face corect acest lucru un fișier mai încolo. Funcția echivalentă a inelului întreabă dacă rândul există, returnează false când nu există și nu mai trimite deloc actualizarea. Acel tabel are în prezent zero rânduri, așa că funcția returnează false de fiecare dată când este apelată, ceea ce este răspunsul corect.
Forma generală
O instrucțiune UPDATE care nu găsește niciun rând nu este o eroare în nicio bază de date. Este o instrucțiune reușită care nu a făcut nimic, iar fiecare strat de deasupra ei va raporta succes dacă nu întreabă ceva. Douăzeci și două dintre instrucțiunile de aici nu întreabă, și pentru cele mai multe asta e în regulă: actualizează un rând despre care cererea a dovedit deja că există.
Cea care trebuia să întrebe a întrebat într-un fel care nu poate eșua. rowCount() >= 0 nu este o verificare slabă, ci absența unei verificări deghizată în verificare — și este mai rea decât nicio verificare, pentru că următoarea persoană care citește funcția vede un rezultat inspectat și nu mai caută.
Expresia rowCount() > 0 apare de zero ori în acest cod. Aceasta este cifra care a transformat o greșeală de un caracter în ceva care merită un articol: nu faptul că a fost scrisă greșit o dată, ci faptul că nu exista nicăieri o variantă corectă cu care să fie comparată.
Reparat pe 28 august 2026. Endpointul întreabă acum dacă rândul există înainte de actualizare, așa cum făcea deja funcția inelului din fișierul vecin, și răspunde false când nu există. Reparația evidentă de un caracter — compararea cu mai-mare-decât-zero — a fost mai întâi măsurată și respinsă: driverul raportează rândurile modificate, nu pe cele găsite, așa că setarea bifei la valoarea pe care o are deja nu schimbă nimic, iar acea versiune ar fi raportat eșec pentru o operație care era în regulă. Ambele versiuni sunt greșite, în direcții opuse.