• 08-03-2021, 02:12:03
    #1
    Merhabalar bir problemim var yardımcı olabilecek varsa çok memnun olurum hemen kısaca bahsetmek istiyorum

    Aşağıda sepet tablom var ve sepete eklenen urun_id ile


    hesaplara eklenen hesap_kategori_id birbirleri ile ilişkili olan alanlarım ve istediğim şey sepete eklenmiş fakat daha sonra bir başkası tarafından alınmış ve sepetde o şekilde kalmışsa satın al dediğimde stokda artık kalmadı gibi bir uyarı verdirtmek.(not hesap durumu eğer 1 ise bu ürün satılmış ben kontrol ettirirken 0 olanları saydırtmak istiyorum yani)

    $sepetsor=$db->prepare("SELECT * FROM sepet WHERE kullanici_id=:id ");
                $sepetsor->execute(array(
                    'id' => $kullanici_id
                ));
                //istediği adet kadar hesap var mı?
                while ($sepetcek=$sepetsor->fetch(PDO::FETCH_ASSOC)) {
                    $toplam_sepet_urun_sayisi=$toplam_sepet_urun_sayisi+$sepetcek['urun_adet'];
                    $kategoriler = $db->prepare("SELECT * FROM hesaplar where hesap_kategori_id=? and hesap_durumu=?");
                    $kategoriler->execute(array($sepetcek['urun_id'],0));
                    $kategoriler->fetchALL(PDO::FETCH_ASSOC);
                    $say = $kategoriler->rowCount();
                    if ($say<$kategori_adet) {
                        header("Location: cart?sonuc=yetersiz_stok");
                        break;
                        exit;
    
                    }
                    else{
                        //stok eklenen sepet içinde var
                    }
                }
    bu kodda nerede hata yaptığımı bulamadım $kategori_adet değişkeni post ile gelen değişken ve değeri doğru fetch ile fetchALL kullanımlarımdamı bir hata var denedim ama çözemedim yardımcı olabilecek olursa çok mutlu olurum biraz uzun oldu şimdiden kusura bakmayın
  • 08-03-2021, 02:19:54
    #2
    döngüdeki fetch değil fetchAll olacak
  • 08-03-2021, 02:33:54
    #3
    fetchAll olarak düzenlediğimde de sorun ortadan kalkmıyor sepete 2 adet ekliyorum ve veritabanından elimle bir tanesinin hesap_durumunu 1 olarak değiştiriyorum daha sonra ödeme yap diyorum bana 1 tane hesap veriyor ama 2 tane almışım gibi sepeti onaylıyor ve 2 ürün parası kesiyor.
  • 08-03-2021, 02:42:11
    #4
    Umarım sorunu yanlış anlamamışımdır.

    Şuan ben girdim ve session içerisinde benim id m 21 diye var sayıyorum başlamadan önce benim sepetimde olan ama ödemesini yapmadığım ürünleri almam gerekiyor.


    Sepet içindeki ürün id lerini alacağım diyorum

    (select sepet.urun_id from sepet)
    ve sepet ile hesaplar kolonunu birleştiriyorum
    (INNER JOIN hesaplar)
    birleştirme koşulu olarak sepetteki ürün id ve hesaplar da ki hesap kategori id yi ve sepetteki kullanıcı id ile hesaplar da ki hesap id yi eşliyorum böylece sepete eklenmiş ama alınmış alınmamış tüm dataları elde ediyorum
    (on sepet.urun_id = hesaplar.hesap_kategori_id and sepet.kullanici_id = hesaplar.hesap_id)
    şimdi tüm veriyi filtrelemek için koşulumu yazıyorum kullanıcı id 21 ve sipariş tamamlanmamış olanlar lazım bize
    (where sepet.kullanici_id = 21 and hesaplar.hesap_durumu = 0)
    tüm bu işlemleri tamamladıktan sonra aşağıdaki sql i elde ediyoruz ve iç içe sql yazacağımız için bunu kenarda tutuyoruz
    select sepet.urun_id from sepet INNER JOIN hesaplar on sepet.urun_id = hesaplar.hesap_kategori_id and sepet.kullanici_id = hesaplar.hesap_id where sepet.kullanici_id = 21 and hesaplar.hesap_durumu = 0
    şimdi bizden önce aynı ürünler için sipariş girmiş ve tamamlamış olanları yakalayacağız.

    tekrar sepet kolonunu çağırıyor ve içerisine hesapları dahil ediyoruz

    Select * from sepet INNER JOIN hesaplar
    her iki kolonu birleştirmenin şartı olarak sepetler içerisindeki ürün id ve hesaplar içerisindeki hesap kategori id yi eşitliyoruz ayrıca hesap durumu 1 olanları yani ödenmiş olanları istiyoruz

    on sepet.urun_id = hesaplar.hesap_kategori_id and hesaplar.hesap_durumu = 1
    daha sonra tekrar koşulumuzu yazıyoruz şuanda online olan kullanıcının sepetindeki ürünleri karşılaştırmamız gerekiyor koşul iç içe sql yapısıyla birlikte aşağıda ki gibi

    where sepet.urun_id IN (select sepet.urun_id from sepet INNER JOIN hesaplar on sepet.urun_id = hesaplar.hesap_kategori_id and sepet.kullanici_id = hesaplar.hesap_id where sepet.kullanici_id = 21 and hesaplar.hesap_durumu = 0)

    Tüm bunları işledikten sonra elde etmiş olmamız gereken sql aşağıdaki gibidir
    Select * from sepet INNER JOIN hesaplar on sepet.urun_id = hesaplar.hesap_kategori_id and hesaplar.hesap_durumu = 1 where sepet.urun_id IN (select sepet.urun_id from sepet INNER JOIN hesaplar on sepet.urun_id = hesaplar.hesap_kategori_id and sepet.kullanici_id = hesaplar.hesap_id where sepet.kullanici_id = 21 and hesaplar.hesap_durumu = 0)
    Doğrudan bu r10 konsolu içerisinde yazdım umarım hatalı yazmamışımdır yazdığım kodun mantığı şuan sessionu olan kullanıcının sepetindeki ödenmemiş ürünleri başkaları ödemiş ise döndürmek

    Ayrıca afiyet olsun
  • 08-03-2021, 02:51:53
    #5
    evet özenle hazırladığınız cevap için çok teşekkür ederim anladığınız problem tamamen doğru fakat sorunun sorguda olduğunu düşünmüyorum mantığımız aynı sadece sorguları tek sorguda birleştirmişsiniz ayrıca yemek için teşekkürler
  • 08-03-2021, 03:54:41
    #6
    Sorun çözüldü.

  • 08-03-2021, 04:12:52
    #7
    @YasinKose; çok teşekkür ederim tekrardan