Sorguyu çift tırnak içine yazdığınız için normal koşullarda aşağıdaki gibi değişkeni sorgu içerisinde kullanabilirsiniz. id olduklarından dolayı bunların int tipinde olduklarını düşünüyorum.
$item_controls = $db->prepare("SELECT * FROM mc_user_items where user_item_user_id = $session_user_id and user_item_item_id = $trade_id");
Olmazsa daha kesin bir şekilde yapalım.
Veri tabanındaki tablonun user_item_user_id
ve user_item_item_id
sütunlarının tiplerinin INT
olduğundan emin olun. Sonra değişkenleri de type casting ile integer a çevirelim.
$session_user_id = (int) $session_user_id;
$trade_id = (int) $trade_id;
Sonra yukarıdaki sorguyu yazdığınızda çalışması beklenir.
Veritabanında resim adlarını nasıl bir mantıkla tutuyorsun. img sütun adı ile içerisinde ornek.jpg tarzı bir sistemin mi var. Ve diğer resimleri aynı sütuna nasıl entegre edeceğini mi bilemiyorsun.
Diyelim ki öyle. İki türlü şey önerebilirim. Ya bu resimleri tuttuğun sütunu longtext yani json türünde yap ve resim adlarını json formatında burada tut. Sorguda decode yapıp geri kullanabilirsin. İlk sıradaki yani 0 indisli resim varsayılan resim olur, yanına istediğin kadar daha eklersin. Döngü yapıp ekranda geri gösterebilirsin.
Veya resimler diye bir tablo oluştur, bu tabloya bir tane ürün_id sütunu koy ve bu sütun ürünler tablosundaki id sütununa foreign key ile bağla. Hatta bu bağlama türünü CASCADE yaparsan ürün silindiğinde bu ürün ile ilgili resimler de otomatik silinir ama bu gerçek resimler sunucuda kalmaya devam eder, neyse bu sana kalmış. İşte ürün eklediğin zaman da bu yeni resim tablosuna resimleri yine döngü ile eklersin. Önce ürünü kaydedersin, sonra lastInsertId ile son eklenen ürünün id sini alıp resim tablosundaki ürün_id kısmı için kullanırsın
Bak bu kodu chatgpt ye yazdırdım, bence iyi çalışıyor
function find_subs($mainCategory, $arr, $str = '') {
if (array_key_exists($mainCategory['ID'], $arr)) {
$current = $arr[$mainCategory['ID']];
unset($arr[$mainCategory['ID']]);
foreach ($current as $item) {
echo $str . $item['kategoriAD'] . '<br>';
if (array_key_exists($item['ID'], $arr)) {
$str .= $item['kategoriAD'] . ' --> ';
find_subs($item, $arr, $str);
}
}
}
}
$query = $db->query("SELECT kategoriUST, urunler.* FROM urunler")->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
$mainCategories = reset($query);
unset($query[key($query)]);
foreach ($mainCategories as $mainCategory) {
$str = $mainCategory['kategoriAD'] . ' --> ';
echo $mainCategory['kategoriAD'] . '<br>';
find_subs($mainCategory, $query, $str);
}
Bir küçük not: Tutarlı çalışabilmesi için tablonuzdaki ilk kaydın bir ana kategori yani üst id si 0 olması gerekir.
$columns = array(
array('db' => 'id', 'dt' => 0),
array('db' => 'siparisTarih','dt' => 1 , "formatter" =>function($siparisTarih){
return turkcetarih_formati('j F Y , l, H:i:s',$siparisTarih);
}),
array('db' => 'siparisNo','dt' => 2 , "formatter" =>function($siparisNo){
return "<a href='' class='btn btn-primary'>MZR{$siparisNo}</a>";
}),
array('db' => 'siparisUser', 'dt' => 3),
array('db' => 'siparisFirma', 'dt' => 4),
array('db' => 'siparisFirma', 'dt' => 5),
array('db' => 'siparisDurum','dt' => 6 , "formatter" =>function($val, $row){
return match ($val) {
0 => 'Sipariş oluşturuldu',
1 => 'Sipariş 1 durumunda',
2 => 'Sipariş 2 durumunda',
3 => 'Sipariş 3 durumunda',
default => 'Durum bulunamadı'
};
}),
);
Burada dikkat etmen gereken PHP 8+ kullanmak ve match işlemindeki sıkı tip denetimi sebebiyle 1,2,3 durumlarının veri tabanında tutulduğu kolona göre integer veya string olmasını kontrol ederek bu sayıları tırnak içine almak veya almamak.
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