Destekle iletişim

E-postayla, genellikle iki gün içinde yanıt veririz.

Google reCAPTCHA, kötüye kullanıma karşı bu gönderimi denetler; bu sırada veriler Google'a aktarılır. Komut dosyası yalnızca bu form açıldığında yüklenir.

← Tüm yazılar

Her zaman doğru çıkan kontrol

Bu hizmette 23 UPDATE ifadesi var. Bunlardan tam olarak biri bir şeyi değiştirip değiştirmediğini kontrol ediyor. O kontrol şu:

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

rowCount() hiçbir satır eşleşmediğinde 0 döndürür. Sıfır, sıfırdan büyük ya da sıfıra eşittir. Kontrol ne olursa olsun geçer.

23 UPDATE ifadesi, sonuca yalnızca biri bakıyor rowCount() >= 0 — hiçbir şey eşleşmese de geçer kod tabanında rowCount() > 0: 0 kez güncellediği tabloda satırı olan sayaçlar: 2.218'de 4 bugün hiçbir şey bozuk değil — ama bu satır sayesinde değil

Bu ifade ne işe yarıyor

Bir onay kutusunu kaydediyor: sayaç sahibinin e-postayla haftalık bir özet isteyip istemediğini. Adres ayrı bir tabloda duruyor ve orada bir satır ancak biri, kendi istediği bir e-postadaki onay bağlantısına tıkladıktan sonra oluşuyor. Dört sayacın böyle bir satırı var. Etkin sayaçların sayısı ise 2.218.

Yani sayaçların %99,8'inde UPDATE ifadesi hiçbir şeyle eşleşmiyor. Uç nokta success: true yanıtını veriyor ve ayar kaydedilmiyor, çünkü onu kaydedecek bir yer yok.

Üstündeki yorum doğru

Üç satır yukarıda, aynı fonksiyonda:

“Yalnızca onaylanmış bir dönüş yolu varsa. Yoksa bültenin gidebileceği bir adres de yoktur — ve onay kutusu gerçekleşmeyecek bir şeyi vaat etmiş olurdu.”

Bu tamamen doğru. Biri bu durumu düşünmüş, anlamış ve gerekçesini yazmış. Sonra alttaki satır >= kullanmış, oysa gerekçe şunu gerektiriyordu: >.

Buna dosdoğru bakmaya değer, çünkü olağan açıklama — kimse bunu düşünmemiş — el altında ama yanlış. Düşünce dosyanın içinde duruyor. Başarısız olan tek bir karakter; üstelik yanlış sürümle doğru sürümün ilk bakışta aynı göründüğü ve güncellenecek bir satırı olan her testte aynı davrandığı bir yerde.

Kimseye yalan söylenmiyor

Şimdi dışarıda bırakılması kolay olan kısım geliyor; onu dışarıda bırakmak bu yazıyı daha dramatik ama daha az doğru yapardı.

Satır yoksa sayfa o onay kutusunu hiç göstermiyor. Bir ekran ötede, sahibin ayarlar kutusunu çizen kodda aynı tablo önce sorgulanıyor ve sorgu boş dönerse bütün blok atlanıyor. Yani onaylanmış adresi olmayan bir sayaç sahibi bu denetimi hiç görmüyor, ona hiç tıklamıyor ve sahte onayı hiç almıyor.

Bozuk kontrole ancak uç nokta geçerli bir belirteçle doğrudan çağrılarak ulaşılabiliyor. Bunu yapan biri success: true yanıtını alıyor, ama kaydedilmiş bir ayar yok. Bu gerçek bir kusur, ama dar kapsamlı.

Neden yine de yazmaya değer

Özellik, kimsenin koruma olarak yazıya geçirmediği bir koruma sayesinde güvende. Onu güvenli kılmak için var olan satır, onu güvenli kılmıyor. Güvenli kılan şey başka bir fonksiyondaki bir görüntüleme koşulu; onun yorumu da onay kutusunun neden gizlendiğini açıklıyor — bir şeyin onun gizli kalmasına bağlı olduğunu değil.

O görüntüleme koşulunu kaldırın ya da yeniden düzenleyin — bir ayarlar panelini yeniden tasarlarken yapılacak makul bir şey — kusur anında görünür hâle gelir ve iki değişikliği birbirine bağlayan hiçbir şey yoktur. Güvenlik gerçek, ama tesadüfi; tesadüfi güvenlik de ilgisiz işler sırasında ortadan kaybolan türdendir.

Aynı kod tabanı bunu bir yandaki dosyada doğru yapıyor. Web halkasının eşdeğer fonksiyonu satırın var olup olmadığını soruyor, yoksa false döndürüyor ve güncellemeyi hiç çalıştırmıyor. O tabloda şu anda sıfır satır var; dolayısıyla o fonksiyon her çağrıldığında false döndürüyor ve doğru yanıt da bu.

Genel tablo

Hiçbir satırla eşleşmeyen bir UPDATE ifadesi hiçbir veritabanında hata değildir. Hiçbir şey yapmamış başarılı bir ifadedir ve bir şey sormadıkça üstündeki her katman başarı bildirir. Buradaki ifadelerin yirmi ikisi sormuyor ve çoğu için bu sorun değil: isteğin var olduğunu zaten kanıtladığı bir satırı güncelliyorlar.

Sorması gereken tek ifade ise, başarısız olamayacak bir biçimde sordu. rowCount() >= 0 zayıf bir kontrol değil, kontrol kılığına girmiş bir kontrol yokluğu — ve hiç kontrol olmamasından da kötü, çünkü fonksiyonu okuyan bir sonraki kişi bir sonucun incelendiğini görür ve bakmayı bırakır.

Bu kod tabanında rowCount() > 0 ifadesi sıfır kez geçiyor. Tek karakterlik bir yazım hatasını bir yazıya değer kılan sayı bu: bir kez yanlış yazılmış olması değil, onu karşılaştırabilecek doğru bir örneğin hiçbir yerde olmaması.

28 Ağustos 2026'da düzeltildi. Uç nokta artık, bir yandaki dosyada web halkası fonksiyonunun zaten yaptığı gibi, güncellemeden önce satırın var olup olmadığını soruyor ve yoksa false yanıtını veriyor. Akla ilk gelen tek karakterlik düzeltme — bunun yerine sıfırdan büyüklükle karşılaştırmak — önce ölçüldü ve reddedildi: sürücü eşleşen satırları değil, değişen satırları bildiriyor; dolayısıyla onay kutusunu zaten sahip olduğu değere ayarlamak hiçbir şeyi değiştirmiyor ve o sürüm, sorunsuz bir işlem için başarısızlık bildirirdi. İki sürüm de yanlış, ama zıt yönlerde.

Reklam