Võtke ühendust toega

Vastame e-postiga, tavaliselt kahe päeva jooksul.

Väärkasutuse vältimiseks kontrollib seda saadetist Google reCAPTCHA. Seejuures edastatakse andmeid Googlele. Skript laaditakse alles selle vormi avamisel.

← Kõik postitused

Kontroll, mis on alati tõene

Sisust ja selle ülevaatamisest

Selles artiklis

Selles teenuses on 23 UPDATE lauset. Täpselt üks neist kontrollib, kas see midagi muutis. See kontroll on:

'success' => $n->rowCount() >= 0

rowCount() tagastab 0, kui ükski rida ei sobinud. Null on suurem või võrdne nulliga. Kontroll läbib, mis ka ei juhtuks.

23 UPDATE-lauset, ühest vaadatakse tulemust rowCount() >= 0 — läbib ka siis, kui miski ei sobinud rowCount() > 0 kusagil koodibaasis: 0 korda loendurid, millel on rida tabelis, mida see uuendab: 4 / 2 218 praegu pole midagi katki — põhjusel, mis ei ole see rida

Milleks lause on

See salvestab märkeruudu: kas loenduri omanik soovib iganädalast kokkuvõtet e-postiga. Aadress asub eraldi tabelis ja rida ilmub sinna alles pärast seda, kui keegi on klõpsanud kinnituslingil kirjas, mida ta palus. Neljal loenduril on selline rida. Aktiivseid on 2 218.

Seega 99,8% loendurite puhul ei leia UPDATE ühtegi rida. Lõpp-punkt vastab success: true ja seadistust ei salvestata, sest seda pole kuhugi salvestada.

Selle kohal olev kommentaar on õige

Kolm rida kõrgemal, samas funktsioonis:

„Ainult seal, kus kinnitatud tagasitee on olemas. Ilma selleta pole aadressi, kuhu kiri võiks minna — ja märkeruut oleks lubanud midagi, mis ei juhtu.“

See on täpselt õige. Keegi mõtles selle juhtumi läbi, sai aru ja kirjutas põhjenduse üles. Siis kasutas alumine rida >= seal, kus põhjendus nõudis >.

Seda tasub otse vaadata, sest tavaline seletus — keegi ei mõelnud sellele — on olemas ja vale. Mõtlemine on failis. Mis ebaõnnestus, on üks märk kohas, kus vale ja õige versioon näevad pealtnäha ühesugused välja ja käituvad identselt igas testis, millel on uuendamiseks rida.

Kedagi ei eksitata

Siin on osa, mille oleks lihtne välja jätta, ja väljajätmine teeks selle postituse dramaatilisemaks ja vähem tõeseks.

Leht ei joonista seda märkeruutu, kui rida ei eksisteeri. Ühe ekraani kaugusel, koodis, mis joonistab omaniku seadistuskasti, päritakse sama tabelit esimesena ja kogu plokk jäetakse vahele, kui päring tuleb tühjana tagasi. Seega loenduri omanik ilma kinnitatud aadressita ei näe kunagi juhtnuppu, ei klõpsa seda kunagi ja ei saa kunagi valekinnitust.

Katkine kontroll on kättesaadav ainult lõpp-punkti otse kutsudes kehtiva tokeniga. Keegi, kes seda teeb, saab success: true ja salvestatud seadistust ei ole. See on päris viga ja kitsas.

Miks seda ikkagi tasub üles kirjutada

Funktsioon on turvaline kaitse tõttu, mida keegi kaitsena üles ei kirjutanud. Rida, mis peaks selle turvaliseks tegema, ei tee seda. See, mis seda teeb, on renderdustingimus teises funktsioonis, mille kommentaar selgitab, miks märkeruut on peidetud — mitte et miski sõltub sellest, et see jääb peidetuks.

Eemaldage või ehitage see renderdustingimus ümber — mõistlik asi seadistuspaneeli ümberkujundamisel — ja viga muutub kohe nähtavaks, ilma et miski kuskil neid kahte muudatust seoks. Turvalisus on päris ja see on juhuslik ning juhuslik turvalisus on see liik, mis kaob mitteseotud töö käigus.

Sama koodibaas teeb seda õigesti ühe faili kaugusel. Veebiringi vastav funktsioon küsib, kas rida eksisteerib, tagastab false, kui ei eksisteeri, ja ei anna kunagi uuendust välja. Selles tabelis on praegu null rida, nii et see funktsioon tagastab iga kord false, mis on õige vastus.

Üldine kuju

Ühtegi rida mittesobiv UPDATE ei ole üheski andmebaasis viga. See on edukas lause, mis ei teinud midagi, ja iga selle kohal olev kiht teatab edust, kui keegi ei küsi. Kakskümmend kaks lauset siin ei küsi ja enamiku jaoks on see korras: need uuendavad rida, mille olemasolu päring juba tõestas.

See, mis pidi küsima, küsis viisil, mis ei saa ebaõnnestuda. rowCount() >= 0 ei ole nõrk kontroll, see on kontrolli puudumine, mis kannab kontrolli kostüümi — ja see on halvem kui kontrolli puudumine, sest järgmine inimene, kes funktsiooni loeb, näeb tulemust kontrollitavat ja lõpetab vaatamise.

Fraas rowCount() > 0 esineb selles koodibaasis null korda. See on arv, mis muutis ühe märgi trükiviga postituse väärtuseks: mitte et see kirjutati korra valesti, vaid et kusagil polnud õiget eksemplari, millega seda võrrelda.

Parandatud 28. augustil 2026. Lõpp-punkt küsib nüüd enne uuendamist, kas rida eksisteerib, nagu veebiringi funktsioon ühe faili kaugusel juba tegi, ja vastab false, kui ei eksisteeri. Ilmne ühemärgiline parandus — võrrelda hoopis suurem-kui-nulliga — mõõdeti esimesena ja lükati tagasi: draiver teatab muudetud ridu, mitte sobinud ridu, nii et märkeruudu seadmine väärtusele, mida see juba hoiab, ei muuda midagi ja see versioon oleks teatanud ebaõnnestumisest toimingu kohta, mis oli korras. Mõlemad versioonid on valed, vastassuundades.

Reklaam