• 23-04-2025, 10:47:27
    #1
    Merhaba
    Aşağıdaki kodda ilk sorguda gelen siparişleri kaydediyorum.
    Alt kısımda ise siparişten gelen ürün adedini (sipadet) stoktan düşmek istiyorum ama bir yerde yanlış yapıyorum.
    Stok update yapmak istediğim tablo siparişler tablosu urunstok sütunu
    Şartlar ;
    siparisler.urunkodu = siparis_urunler.sipurun
    siparisler.urunstok >0
    Üst kısımda kayıt yaparken gelen sipariş adeti $ca['sepetadet']

    Yardımcı olursanız sevinirim.

    if ($result->rowCount()) {
        $cart = $db->prepare("SELECT * FROM sepet INNER JOIN urunler ON urunler.urunkodu = sepet.sepeturun WHERE sepetuser=:b");
        $cart->execute([':b' => $bcode]);
        if ($cart->rowCount()) {
            foreach ($cart as $ca) {
                $orderproducts = $db->prepare("INSERT INTO siparis_urunler SET
                    sipkodu    =:s,
                    sipurun    =:u,
                    sipbirim   =:b,
                    sipadet    =:a,
                    siptoplam  =:t,
                    sipkg      =:k,
                    siptoplamkg=:tk,
                    sipurunadi =:ua
                ");
                $orderproducts->execute([
                    ':s'   => $code,
                    ':u'   => $ca['sepeturun'],
                    ':b'   => $ca['birimfiyat'],
                    ':a'   => $ca['sepetadet'],
                    ':t'   => $ca['toplamfiyat'],
                    ':k'   => $ca['birimkg'],
                    ':tk'  => $ca['toplamkg'],
                    ':ua'  => $ca['urunbaslik']
                ]);
            }
        $stock = "UPDATE urunler INNER JOIN siparis_urunler ON urunler.urunkodu = siparis_urunler.sipurun
                          WHERE urunler.urunstok > 0 AND siparis_urunler.sipurun = urunler.urunkodu";
        $restock = $db->prepare($stock);
        $restock->execute(array(':urunstok' => $ca['sepetadet']));
        }
    }
  • 23-04-2025, 10:58:49
    #2
    Update sorgusunda SET kullanmalısınız. ayrıca $ca['sepetadet'] döngü dışında kullanmışsınız bu yüzden en son gelen veriyi baz alır ve inner join mantıksız olur. ya döngü içine alacaksınız ya da en son toplu yapacaksınız. Şu kodun işe yaraması lazım:
    if ($result->rowCount()) {
        $cart = $db->prepare("SELECT * FROM sepet INNER JOIN urunler ON urunler.urunkodu = sepet.sepeturun WHERE sepetuser=:b");
        $cart->execute([':b' => $bcode]);
    
        if ($cart->rowCount()) {
            foreach ($cart as $ca) {
                $orderproducts = $db->prepare("INSERT INTO siparis_urunler SET
                    sipkodu    =:s,
                    sipurun    =:u,
                    sipbirim   =:b,
                    sipadet    =:a,
                    siptoplam  =:t,
                    sipkg      =:k,
                    siptoplamkg=:tk,
                    sipurunadi =:ua
                ");
                $orderproducts->execute([
                    ':s'   => $code,
                    ':u'   => $ca['sepeturun'],
                    ':b'   => $ca['birimfiyat'],
                    ':a'   => $ca['sepetadet'],
                    ':t'   => $ca['toplamfiyat'],
                    ':k'   => $ca['birimkg'],
                    ':tk'  => $ca['toplamkg'],
                    ':ua'  => $ca['urunbaslik']
                ]);
            }
            $stock = $db->prepare("
                UPDATE urunler
                INNER JOIN siparis_urunler ON urunler.urunkodu = siparis_urunler.sipurun
                SET urunler.urunstok = urunler.urunstok - siparis_urunler.sipadet
                WHERE siparis_urunler.sipkodu = :kod
                  AND urunler.urunstok >= siparis_urunler.sipadet
            ");
            $stock->execute([':kod' => $code]);
        }
    }
  • 23-04-2025, 11:29:30
    #3
    ErayEfe adlı üyeden alıntı: mesajı görüntüle
    Update sorgusunda SET kullanmalısınız. ayrıca $ca['sepetadet'] döngü dışında kullanmışsınız bu yüzden en son gelen veriyi baz alır ve inner join mantıksız olur. ya döngü içine alacaksınız ya da en son toplu yapacaksınız. Şu kodun işe yaraması lazım:
    if ($result->rowCount()) {
        $cart = $db->prepare("SELECT * FROM sepet INNER JOIN urunler ON urunler.urunkodu = sepet.sepeturun WHERE sepetuser=:b");
        $cart->execute([':b' => $bcode]);
    
        if ($cart->rowCount()) {
            foreach ($cart as $ca) {
                $orderproducts = $db->prepare("INSERT INTO siparis_urunler SET
                    sipkodu    =:s,
                    sipurun    =:u,
                    sipbirim   =:b,
                    sipadet    =:a,
                    siptoplam  =:t,
                    sipkg      =:k,
                    siptoplamkg=:tk,
                    sipurunadi =:ua
                ");
                $orderproducts->execute([
                    ':s'   => $code,
                    ':u'   => $ca['sepeturun'],
                    ':b'   => $ca['birimfiyat'],
                    ':a'   => $ca['sepetadet'],
                    ':t'   => $ca['toplamfiyat'],
                    ':k'   => $ca['birimkg'],
                    ':tk'  => $ca['toplamkg'],
                    ':ua'  => $ca['urunbaslik']
                ]);
            }
            $stock = $db->prepare("
                UPDATE urunler
                INNER JOIN siparis_urunler ON urunler.urunkodu = siparis_urunler.sipurun
                SET urunler.urunstok = urunler.urunstok - siparis_urunler.sipadet
                WHERE siparis_urunler.sipkodu = :kod
                  AND urunler.urunstok >= siparis_urunler.sipadet
            ");
            $stock->execute([':kod' => $code]);
        }
    }
    ErayEfe hocam, bu şekilde son veriyi güncelliyor, öncekileri yok sayıyor.
  • 24-04-2025, 20:07:40
    #4
    Sanırım benim kodlarda sorun var. Problemi bu şekilde anlatırsam daha doğru olacak gibi:
    urunler tablosundaki ürünlerin stok adetlerinden, sepet tablosundaki ürün adetlerini düşmek istiyorum.

    Yani sonuçta urunler tablosundaki
    Ürün B stok miktarı 180-3=177
    Ürün D stok miktarı 90-1=89 olması gerekiyor.

  • 26-04-2025, 16:58:15
    #5
    $stock = "UPDATE urunler INNER JOIN siparis_urunler ON urunler.urunkodu = siparis_urunler.sipurun
    SET urunler.stok = urunler.stok - :urunstok
    WHERE urunler.stok > 0 AND siparis_urunler.sipurun = :urun_kodu";
    
    $restock = $db->prepare($stock);
    $restock->execute([
    ':urunstok' => $ca['sepetadet'],
    ':urun_kodu' => $ca['sipurun']
    ]);
    update kısmını bu şekilde dener misiniz.


    bu arada siparis_urunler adında bir tablonuz var değil mi?
  • 27-04-2025, 20:48:05
    #6
    fatbotter.com
    Stok güncelleme işleminin her ürün için tekrarlanması gerekiyor, ancak sizin kodunuzda bu işlem sadece bir kez ve son ürün için yapılıyor. Bu yüzden sadece bir ürünün stoğu doğru şekilde güncellenirken, diğerleri etkilenmiyor.

    Olası hatalarda veri tutarsızlığını önlemek için bir transaction içinde çalışmalısınız. beginTransaction(), commit() ve rollBack() metotlarını araştırabilirsiniz.

    if ($result->rowCount()) {
        $cart = $db->prepare("SELECT * FROM sepet INNER JOIN urunler ON urunler.urunkodu = sepet.sepeturun WHERE sepetuser=:b");
        $cart->execute([':b' => $bcode]);
    
        if ($cart->rowCount()) {
            $db->beginTransaction(); // İşlemi atomik hale getirmek için transaction başlat
    
            try {
                foreach ($cart as $ca) {
                    $orderproducts = $db->prepare("INSERT INTO siparis_urunler SET
                        sipkodu    =:s,
                        sipurun    =:u,
                        sipbirim   =:b,
                        sipadet    =:a,
                        siptoplam  =:t,
                        sipkg      =:k,
                        siptoplamkg=:tk,
                        sipurunadi =:ua
                    ");
                    $orderproducts->execute([
                        ':s'   => $code,
                        ':u'   => $ca['sepeturun'],
                        ':b'   => $ca['birimfiyat'],
                        ':a'   => $ca['sepetadet'],
                        ':t'   => $ca['toplamfiyat'],
                        ':k'   => $ca['birimkg'],
                        ':tk'  => $ca['toplamkg'],
                        ':ua'  => $ca['urunbaslik']
                    ]);
    
    
                    // Her ürün için stok güncellemesi
                    $stock = $db->prepare("
                        UPDATE urunler 
                        SET urunstok = urunstok - :adet
                        WHERE urunkodu = :urunkodu 
                          AND urunstok >= :adet
                    ");
                    $stock->execute([
                        ':adet' => $ca['sepetadet'],
                        ':urunkodu' => $ca['sepeturun']
                    ]);
                }
    
                $db->commit(); // Tüm işlemler başarılıysa transaction'ı tamamla
    
            } catch (PDOException $e) {
                $db->rollBack(); // Hata durumunda transaction'ı geri al
                echo "Hata: " . $e->getMessage();
            }
        }
    }