Konu hakkında dün yanlış bildiğim ve haliyle buraya da yanlış yazdığım bir şeyi düzeltmek istiyorum, belki sonradan bu yazıyı birileri okur, bu yüzden yanlış bilgiyi düzeltmek gerekiyor. Mesajımda Bunun için kodu kısaltmak için then sonrasına tek bir kod yazılması yeterli olur yazmışım, fakat bu bilgi doğru değil. Konu sahibi arkadaşın bu cevabında belirttiği durumdan sonra bu konuyu daha doğru hâliyle öğrenmek istedim. 400 yanıt kodu ile gelen yanıtlarda çalışmadığını, 200 yanıt kodu ile gelen cevaplarda çalıştığını söyledi. Çünkü then metodu, done ve fail metodlarının (başarılı ve başarısız) birleştirilmiş bir şekli gibi düşünülebilir. İlk fonksiyon olarak done, ikinci fonksiyon olarak fail alıyor. Ben then içerisinde tek bir fonksiyon kuıllandığım için bu da hâliyle done yani success fonksiyonuna denk geliyor. Onun için de 400 hata kodlu yanıtı yakalayamıyor ve yönlendirme işlemi gerçekleşmiyordu.
Sunucundan gelen yanıtın ne olduğuna bakmaksızın çalışan metod olarak always metodu kullanılıyor. Bu bilgiler ışığında then yerine always yazılırsa daha doğru bir yanıt verilmiş olur.
Rica ederim, kolay gelsin :)
location.href = '<?php echo $arow->site_url; ?>/soru/${sorusef}'
bu kısım benim attığım kod ile aynı değil, dikkat ederseniz ben backtick yani ` karakteri kullandım, siz normal kesme işareti yapmışsınız, bunlar farklı şeyler. backtick işareti sayesinde string içerisinde + işaretlerini kullanmadan javascript kodu/değişkeni vs yazabiliyoruz.
Öncelikle size de bazı mesajlarımda belirttiğim bazı durumları açıklayayım. Daha temiz ve doğru bir kod yazabilme açısından ufak detaylar.
(Muhtemelen JQuery nin güncel sürümlerinden birini kullandığınızı varsayıyorum)
$(selector).click(function() {}) yerine $(selector).on("click", function() {}) kullanın
Gördüğüm kadarıyla a elemanına sorusef ve cevapid adında özellikler (attribute) eklemişsiniz. Bu HTML5 kurallarına biraz aykırı bir durum, eğer veri taşımak için kendiniz bir şey eklemek istiyorsanız bunu data- ön eki ile kullanmanız gerekir. Diğer türlü de çalışır ama yanlış bir kullanım olur. data-sorusef ve data-cevapid şeklinde düzenlemenizi öneririm. Jquery tarafında bu değerleri alırken de attr data metodunu kullanabilirsiniz.
Sorunuza gelecek olursak success ve error fonksiyon olması fark etmeksizin her türlü aynı linke yönlendirme yapmak istiyorsunuz. Bunun için kodu kısaltmak için then sonrasına tek bir kod yazılması yeterli olur. Yukarıda söylediğim değişikliği yapmanız sonucu kodun son hâli şöyle gözükecektir.
$(function() {
$("a.soru_okundu").on("click", function() {
let nesne = $(this),
id = nesne.attr("id"),
sorusef = nesne.data("sorusef"),
cevapid = nesne.data("cevapid");
$.ajax({
url: "<?= $arow->site_url ?>/sistem/bildirim-okundu.php",
data: {
id: id,
sorusef: sorusef,
cevapid: cevapid
},
type: "post",
dataType: "json"
}).then(() => {
location.href = `<?php echo $arow->site_url; ?>/soru/${sorusef}`
})
})
})
Bunun en temiz tarafı ne biliyor musun, bunu direkt olarak sql tarafında halletmek, ya bir foreign key yazacaksın ya da trigger oluşturacaksın.
Foreign key için yapman gereken adımlar: phpmyadmin'den (muhtemelen onu kullanıyorsundur) yorumlar tablosunu açıyorsun, Yapı sekmesine tıklıyorsun, ardından ilişki görünümü, ON DELETE ve ON UPDATE açılır menüsünden ikisinde de CASCADE seçeneğini seçiyorsun. Sağda sütun olarak dersid seçiyorsun, onun sağında database seçilidir değilse database seçiyorsun, onun sağında tablo seçeneğinden dersler i seçiyorsun, onun da sağında yani en sondaki sütun olarak da dersler tablosundaki id değerini seçiyorsun.
Yani yaptığımız olay kısaca şu şekilde, dersler tablosundaki bir sütunda silme veya değişiklik işlemi yapıldığında o sütunun yorumlar tablosundaki dersid değerine sahip sütunda da aynı olay yapılsın. CASCADE yapmamız bundan ötürü. Böylece veritabanı bütünlüğün korunmuş olur, PHP tarafında meydana gelebilecek hatalardan bağımsız olarak sorunsuz bir şekilde ekstra bir koda ihtiyaç olmadan çalışacaktır.
Diğer yöntem ise TRIGGER eklemek. Şöyle ki bir tabloda bir UPDATE,DELETE,INSERT işlemi yapıldığında Mysql tarafından otomatik bazı kodları yürütmeyi sağlar.
Senin örnekte dersler tablosundan bir sütun silindiği zaman yorumlar tablosundan o sütunun id değerine sahip sütunları silmek için şöyle bir trigger kodu oluşturabilirsin. Bu kodları SQL sekmesine yazman gerekiyor.
DELIMITER $$
CREATE TRIGGER trigger_ismi AFTER DELETE
ON dersler
FOR EACH ROW
BEGIN
DELETE FROM yorumlar WHERE dersid = OLD.id;
END$$
DELIMITER ;
Trigger hakkında daha detaylı bilgiye buradan ulaşabilirsin.
Bu uyarıyı back-end den mi alıyorsunuz yoksa formun kendisi mi veriyor, ve kodlar nasıl?
Yok diye bir şey yok ama o kadar zor ki bu istediğin, keşke Google'un yanlış yazımları nasıl doğru anladığını biz de anlamış olsaydık :)