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();
        }
    }
}