Ajax hata mesajı yazdırma
Merhaba arkadaşlar. Şuan yalnızca php ile kodladığım sitemi ajax ile daha dinamik hale getirmeye çalışıyorum. Çok yeniyim ve eksiğim çok. Bazen ne kadar arama yapsamda sorunuma bir çözüm bulamıyorum.
Sorunum şu: Üye girişi yapıldığında işlem başarılı ise önceki sayfaya yönlendiriyor, sorun yok. Fakat işlem başarısız olduğunda gelen cevabı yine başarılı olarak değerlendirdiği için yine yönlendirme yapıyor. Bu success kısmında if ve else kullanımı yapabilir miyiz? Yapabilirsek eğer nasıl yaparız? Çözüm konusunda yardımcı olacaklara şimdiden çok teşekkür ediyorum.
Kodlarım şu şekilde:
<script>
$("button").click(function (event) {
event.preventDefault();
$.ajax({
type: 'POST',
url: '<?php echo $arow->site_url; ?>/sistem/giris.php',
data: $("form").serialize(),
dataType: "html",
beforeSend: function () {
$('#sonuc').html('<div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div>');
},
success : function() {
window.history.go(-1);
},
error: function() {
alert('Bir hata oldu. Lütfen daha sonra tekrar deneyin.');
}
});
});
</script>
<?php
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') die("Hatalı istek");
if ($_POST) {
$uye_mail=strip_tags(trim($_POST['uye_mail']));
$uye_sifre=strip_tags(trim(sha1(md5($_POST['uye_sifre']))));
$unutma=isset($_POST['beni_hatirla']);
$kriptosifre=mb_substr($uye_sifre,0,32);
$uyesor=$db->prepare("SELECT * FROM uye WHERE uye_mail=:mail AND uye_sifre=:sifre AND uye_durum=:durum");
$uyesor->execute(array(
':mail' => $uye_mail,
':sifre' => $kriptosifre,
':durum' => 1
));
$say=$uyesor->rowCount();
if ($say==1) {
$_SESSION['uye_mail']=$uye_mail;
$songiris=$db->prepare("UPDATE uye SET uye_sonip=:i, uye_songiris=:t WHERE uye_mail=:um");
$songiris->execute([':i'=>IP(),':t'=>date('Y-m-d H:i:s'), ':um'=>$uye_mail]);
if ($unutma){
setcookie("uye", sha1(md5($uye_mail)), time()+60*60*24*180, "/");
exit;
} else {
exit;
}
} else {
?>
<br><br>
<span>Eposta adresi veya parola hatalı ya da aktivasyon işlemini tamamlamadınız.</span>
<hr>
<span>Bir hata olmadığından eminseniz eğer lütfen bizimle iletişime geçin.</span>
<?php
}
}
?>
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (4)
ajax isteminde error network durumunu dinler.
Hiçbir durum belirtilmemiş işlemler 500 Fatal dışında genelde 200 yani success döndürür.
Php kodlarınızda işlemin başarısız olduğunu bildirmek için
http_response_code(400); //Kendi durumunuza göre bir hata kodu belirtin, bu bir error bildirir.
fonksiyonunu kullanabilirsiniz. Bu ajax kodunuzdaki error mekanizmasını tetikleyecektir.
Başarılı işlemler içinde response kodunu 200 olarak yinede geri döndürün.
Success kontrolünde 200 dışında gelen yanıtlarıda hata olarak bildirebilirsiniz :)
Rica ederim, aslında bu bahsettiğiniz diğer cevapta kısmen bulunmakta. Orada bir dizi ile status ve message tutulmuş.
Ajax isteminizde success veya error function(response) kısmındaki response php betiğinden gelen json formatındaki sonucu sizin almanıza olanak sağlıyor.
Yani örnekten yola çıkarsak response.message size "Giriş başarılı" metnini döndürecektir.
Sizin burada eklemeniz gereken, boş olmamasını istediğiniz post elemanlarını bir diziye atıp error response kodu ile geri döndürmek.
Ajax betiğinizdeki error kısmında da bunu response.errorValues gibi bir tanımla kontrol edebilirsiniz. Parçalayabilirsiniz.
Bir örnek vermek gerekirse;
if($_POST...
$attiributes = [
"firstname" => "Ad",
"email" => "E-Posta Adresi"
]
$errorValues = [];
foreach($_POST as $key => $val){ //Post ile gelen elemanları parçaladık
if(is_null($val)){ //Elemanın değeri boşmu diye sorduk
$error_values = [ //Boşsa dizimize bunu eklemek istiyoruz
"attr" => $key, //Error values dizimize boş olan değeri atadık, örneğin firstname
"message" => $attiributes[$key]." boş olamaz" //Burada hatalı alanı kullanıcıya verdik. Ortalama sonuç bu oalcaktır; "E-Posta Adresi Boş olamaz, Ad boş olamaz vb."
]
}
}
if($errorValues){ //Eğer formda bir hata varsa hatayı döndür
http_response_code(400);
echo json_encode([
"status" => false,
"message" => "Eksik veya hatalı alanları kontrol edin",
"errorValues" => $errorValues
]);
return false;
}
@desrana hocam çok teşekkürler. Sorunum kısmen çözüldü. Şimdi ben iki tane hata bildireceğim. Birincisi boş alan bırakmayın, ikincisi eposta ya da şifre hatalı. Bunları hangi kodlarla bildiririm ve ajaxta bunları ayrı ayrı nasıl yazdırırım?
@abdullahx hocam sizede çok teşekkür ediyorum emek verdiniz kodlarımı yeniden düzenleyerek yardımcı olmanız çok güzel.
$("form").on("submit", function (e) {
e.preventDefault();
$.ajax({
method: 'POST',
url: '<?php echo $arow->site_url; ?>/sistem/giris.php',
data: $(this).serialize(),
dataType: "json",
beforeSend: () => {
$('#sonuc').html('<div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div>');
},
success : response => {
if (response.status) {
// işlem başarılı ise yapılacak işlemler
} else {
// İşlem başarısız ise yapılacak işlemler
}
},
error:() => {
alert('Bir hata oldu. Lütfen daha sonra tekrar deneyin.');
}
});
});
<?php
$response = [];
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')
$response = [
'status' => false,
'text' => 'Hatalı istek'
];
if ($_POST) {
$uye_mail=strip_tags(trim($_POST['uye_mail']));
$uye_sifre=strip_tags(trim(sha1(md5($_POST['uye_sifre']))));
$unutma=isset($_POST['beni_hatirla']);
$kriptosifre=mb_substr($uye_sifre,0,32);
$uyesor=$db->prepare("SELECT * FROM uye WHERE uye_mail=:mail AND uye_sifre=:sifre AND uye_durum=:durum");
$uyesor->execute(array(
':mail' => $uye_mail,
':sifre' => $kriptosifre,
':durum' => 1
));
if ($uyesor->rowCount) {
$_SESSION['uye_mail']=$uye_mail;
$songiris=$db->prepare("UPDATE uye SET uye_sonip=:i, uye_songiris=:t WHERE uye_mail=:um");
$songiris->execute([':i'=>IP(),':t'=>date('Y-m-d H:i:s'), ':um'=>$uye_mail]);
if ($unutma)
setcookie("uye", sha1(md5($uye_mail)), time()+60*60*24*180, "/");
$response = [
'status' => true,
'text' => 'Giriş başarılı, yönlendiriliyorsunuz...'
];
} else {
$response = [
'status' => false,
'text' => 'Giriş bilgileri hatalı veya aktivasyon işlemi tamamlanmadı'
];
}
}
echo json_encode($response);