Form post edilince muhtemelen ajax ile kontrol ediyorsunuz, ilk tıktan sonra recaptha o şekilde hata verebiliyor ben de deneyimlemiştim, aslında hata değil de öyle bir sisteme sahip.
Nasıl render ettiğinizi bilmiyorum ama reset metodu işinize yarayabilir.
Diyelim js tarafında böyle render ettiniz
grecaptcha.render('recaptcha', {
sitekey: 'sitekey',
theme: "dark"
})
kullanıcıyı ajax tarafında kontrol ettiniz ve hata verdi, js tarafında yine recaptcha yı sıfırlayın
grecaptcha.reset()
Kod editörünüz destekliyorsa bütün metodları görmek için ts dosyasını indirebilirsiniz.
npm install --save @types/grecaptcha
Sizin sessionStorage den anladığınız olay ne, bunu bir açıklayabilir misiz?
if($_POST) {
if (!isset($_POST['csrf_token'])) {
$response = [
'status' => false,
'text' => 'Token ile oynama!'
];
}
else if ($_POST['csrf_token'] != $_SESSION['csrf']) {
$response = [
'status' => false,
'text' => 'Token ile oynama!'
];
}
else {
$query = $db->query("SELECT * FROM kullanici WHERE id = {$_SESSION['kullanici']['id']}");
$kullanici = $query->fetch(PDO::FETCH_ASSOC);
if ($kullanici['ad'] != post('ad') || $kullanici['soyad'] != post('soyad') || $kullanici['tc'] != post('tc') || $kullanici['dogum_tarihi'] != post('dogum_tarihi')){
$islem = $db->prepare("UPDATE kullanici SET ad = ?, soyad = ?, tc = ?, dogum_tarihi = ?, tc_verify = ? WHERE id = ?");
$islem = $islem->execute([
post('ad'),
post('soyad'),
post('tc'),
post('dogum_tarihi'),
0,
$_SESSION['kullanici']['id']
]);
}
$successText = [];
$errorText = '';
$query = $db->prepare("SELECT id, email, telefon, sef FROM kullanici WHERE (email = ? OR telefon = ? OR sef = ?) AND id != ?");
$query->execute([
post('email'),
post('telefon'),
post('sef'),
$_SESSION['kullanici']['id']
]);
if ($query->rowCount()) {
$control = $query->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE);
foreach ($control as $item) {
if ($item['email'] == post('email')) {
$response = [
'status' => false,
'text' => 'Email Kullanımda'
];
goto end;
}
if ($item['telefon'] == post('telefon')) {
$response = [
'status' => false,
'text' => 'Telefon Numarası Kullanımda'
];
goto end;
}
if ($item['sef'] == post('sef')) {
$response = [
'status' => false,
'text' => 'Kullanıcı Adı Kullanımda'
];
goto end;
}
}
}
$dogum = date('Y', strtotime(post('dogum_tarihi')));
$bilgiler = [
"isim" => post('ad'),
"soyisim" => post('soyad'),
"dogumyili" => $dogum,
"tcno" => post('tc')
];
$sonuc = tcno_dogrula($bilgiler) == 'true';
if ($sonuc) {
$islem = $db->prepare("UPDATE kullanici SET ad = ?, soyad = ?, tc = ?, tc_verify = ?, dogum_tarihi = ?, email = ?, email_verify = ?, telefon = ?, sef = ?, sifre = ?, iban = ?, cinsiyet = ? WHERE id = ?");
$islem->execute([
post('ad'),
post('soyad'),
post('tc'),
1,
post('dogum_tarihi'),
post('email'),
0,
post('telefon'),
post('sef'),
post('sifre'),
post('iban'),
post('cinsiyet'),
$_SESSION['kullanici']['id']
]);
if ($islem->rowCount()) {
$response = [
'status' => true,
'text' => 'İşlem başarılı!'
];
}
else {
$response = [
'status' => false,
'text' => 'İşlem tamamlanamadı!'
];
}
}
else {
$response = [
'status' => false,
'text' => 'Kimlik bilgileriniz doğrulanamadı!'
];
}
}
end:
echo json_encode($response);
}
else {
header('Location:anasayfa');
}
$(function () {
$("#user_update").on("submit", function (e) {
e.preventDefault()
let setBtn = $(".setting__button")
$.ajax('api/user-update.php', {
method: 'POST',
data: $(this).serialize(),
dataType: "json",
beforeSend() {
setBtn.html("<i class='fa fa-spinner fa-spin'></i>")
}
}).then(success => {
if (success.status)
$('#log').html(success.text).addClass('text-success').removeClass('text-danger');
else
$('#log').html(success.text).addClass('text-danger').removeClass('text-success');
}, fail => {
console.log(`Server hatası: ${fail}`)
}).always(() => {
setBtn.html("Güncelle");
})
})
})
Ssp ile bunu yapamazsın, ya isteğine uygun bir şekilde özelleştirmen gerek ya da bütün senaryoyu kendin kurgulaman gerek
Evet () => deyimi bir 'arrow function' oluşturmak için kullanılır. Ben genelde eğer oluşturduğum fonksiyon içerisinde this
anahtar kelimesini kullanmayacaksam arrow function tercih ediyorum. Video
? ve : ifadesi ternary operatör diye geçer. Php deki kullanımı ile temelde aynı sözdizimine sahip. ? Den önceki koşul sağlanıyorsa ? nin sağ tarafı çalışır, sağlanmıyorsa : den sonrası çalışır.
dataset de elemente data- diye bizim özel olarak tanımladığımız verilere ulaşmak için kullanılır. Buradaki target mesela tamamen benim kafama göre oluşturduğum bir isim. Tabii İngilizce kelime olarak yaptığı iş bakımından anlamlı yine de. Html kısmında data-target yazdım ben, sen istersen data-hedef de yazabilirsin
Şöyle bir şey hazırladım, belki fikir verir.
Bu arada yanlışlıkla spam işaretledim kusura bakma.
Bunu javascript tarafında halledin, 7 numaralı sütuna yazacağınızı düşünürsek columns değerinin içerisindeki 7 numaralı sütun için render fonksiyonunda kontrol edip ona göre aktif pasif yazabilirsiniz
Bunun sebebi muhtemelen 'header already sent by output' tarzı bir hata alıyor olman. Sunucuda error_log dosyası oluşturmayı aktif edip kontrol edebilirsiniz.
Ben yaptığım olayı açıklayayım, siz kodunuzda .product-image altındaki bütün a elemanlarını alıyordunuz ama o elemanların arasında Sepete ekle butonunun a elemanları da vardı. Ben .product-image in sadece bir seviye altındaki a elemanlarını almak için > çocuk seçisini kullandım.
.product-codenumber elemanı da seçtiğimiz a elemanlarının dom ağacında içinde değil aynı seviyede iki eleman ötedeki kardeşleri konumunda olduğu için de next_sibling i iki defa kullanarak ulaştım
Hiyerarşi ile ilgili ufak sorunların vardı
<?php
$html = file_get_html('http://eshop.erhanteknik.com.tr/urunlerimiz?categoryId=1');
$find = $html->find('.product-image > a');
if (count($find)) {
foreach ($find as $item){ ?>
<img src="<?= $item->find('img',0)->src; ?>" alt="">
<div><?= $item->next_sibling()->next_sibling()->plaintext ?></div>
<?php }
}