Kontrolli që del gjithmonë i vërtetë
Për përmbajtjen dhe kontrollin e saj
Në këtë artikull
Në këtë shërbim ka 23 komanda UPDATE gjithsej. Vetëm njëra kontrollon nëse ndryshoi diçka. Kontrolli është:
'success' => $n->rowCount() >= 0
rowCount() kthen 0 kur nuk përputhet asnjë rresht. Zero është më e madhe ose e barabartë me zero. Kontrolli kalon çfarëdo që të ndodhë.
Për çfarë shërben komanda
Ruan një kuti zgjedhjeje: nëse pronari dëshiron përmbledhje javore me email. Adresa është në tabelë më vete dhe rreshti krijohet vetëm pasi dikush klikon lidhjen e konfirmimit në një email që e kërkoi vetë. Katër numërues kanë rresht të tillë. Aktivë janë 2 218.
Prandaj për 99,8% të numëruesve komanda UPDATE nuk përputhet me asgjë. Pika fundore përgjigjet success: true dhe cilësimi nuk ruhet, sepse nuk ka ku të ruhet.
Komenti sipër është i saktë
Tre rreshta më lart, në të njëjtin funksion:
„Vetëm kur ekziston një rrugë kthimi e konfirmuar. Pa të nuk ka adresë ku të shkojë mesazhi — dhe kutia e zgjedhjes do të premtonte diçka që nuk ndodh.“
Kjo është pikërisht e saktë. Dikush e mendoi rastin, e kuptoi dhe shënoi arsyetimin. Pastaj rreshti poshtë përdori >= aty ku arsyetimi kërkonte >.
Ia vlen të shihet drejtpërdrejt, sepse shpjegimi i zakonshëm — nuk e mendoi askush — është gati, por i gabuar. Mendimi është në skedar. Dështoi një shenjë, në një vend ku versioni i gabuar dhe i saktë duken njësoj me një vështrim dhe sillen njësoj në çdo test që ka rresht për të përditësuar.
Askush nuk po gënjehet
Kjo pjesë do të lihej lehtë jashtë dhe heqja e saj do ta bënte postimin më dramatik e më pak të vërtetë.
Faqja nuk e shfaq kutinë nëse rreshti nuk ekziston. Një ekran më tej, kodi që vizaton kutinë e cilësimeve të pronarit pyet fillimisht të njëjtën tabelë dhe kapërcen gjithë bllokun kur përgjigjja është bosh. Prandaj pronari pa adresë të konfirmuar nuk e sheh kurrë kontrollin, nuk e klikon dhe nuk merr konfirmimin e rremë.
Kontrolli i prishur arrihet vetëm duke thirrur drejtpërdrejt pikën fundore me një token të vlefshëm. Kush e bën këtë merr success: true dhe asnjë cilësim të ruajtur. Është defekt i vërtetë dhe i ngushtë.
Pse ende ia vlen të shkruhet
Funksioni është i sigurt falë një mbrojtjeje që askush nuk e dokumentoi si mbrojtje. Rreshti që ekziston për ta bërë të sigurt nuk e bën të tillë. E bën një kusht shfaqjeje në funksion tjetër, komenti i të cilit shpjegon pse kutia fshihet — jo se diçka varet nga mbajtja e saj të fshehur.
Hiqeni ose ristrukturojeni atë kusht — diçka e arsyeshme gjatë ridizajnimit të panelit të cilësimeve — dhe defekti bëhet menjëherë i dukshëm, pa asgjë që lidh dy ndryshimet. Siguria është reale, por rastësore dhe siguria rastësore zhduket gjatë punëve të palidhura.
I njëjti kod e bën saktë një skedar më tej. Funksioni përkatës i unazës së uebsajteve pyet nëse rreshti ekziston, kthen false kur nuk ekziston dhe nuk e nis fare përditësimin. Tabela tani ka zero rreshta, prandaj funksioni kthen false çdo herë që thirret, përgjigjja e saktë.
Modeli i përgjithshëm
Një komandë UPDATE që nuk përputhet me asnjë rresht nuk është gabim në asnjë bazë të dhënash. Është komandë e suksesshme që nuk bëri asgjë dhe çdo shtresë sipër do të raportojë sukses nëse nuk pyet diçka. Njëzet e dy komandat këtu nuk pyesin dhe për shumicën është në rregull: përditësojnë një rresht që kërkesa tashmë provoi se ekziston.
Ajo që duhej të pyeste, pyeti në një mënyrë që nuk mund të dështojë. rowCount() >= 0 nuk është kontroll i dobët, është mungesë kontrolli e veshur si i tillë — më keq se pa kontroll, sepse lexuesi tjetër i funksionit sheh se rezultati shqyrtohet dhe ndalon së kërkuari.
Shprehja rowCount() > 0 shfaqet zero herë në këtë kod. Ky është numri që e bëri gabimin njëshenjësh të vlefshëm për një postim: jo se u shkrua gabim një herë, por se nuk kishte askund shembull të saktë për krahasim.
U rregullua më 28 gusht 2026. Pika fundore tani pyet nëse rreshti ekziston përpara përditësimit, si funksioni i unazës një skedar më tej, dhe përgjigjet false kur mungon. Zgjidhja e dukshme me një shenjë — krahasimi me më e madhe se zero — u mat e para dhe u refuzua: drejtuesi raporton rreshtat e ndryshuar, jo të përputhurit, prandaj vendosja e kutisë në vlerën ekzistuese nuk ndryshon asgjë dhe ai version do të raportonte dështim për një veprim të saktë. Të dy versionet janë gabim, në drejtime të kundërta.