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