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.