File manager - Edit - /home/webapp69.cm.in.th/u69319090042/Shop/checkout.php
Back
<?php require_once 'config.php'; if (!isLoggedIn()) { header('Location: login.php'); exit; } $user_id = $_SESSION['user_id']; // Get cart items $stmt = $pdo->prepare("SELECT c.quantity, p.* FROM cart c JOIN products p ON c.product_id = p.id WHERE c.user_id = ?"); $stmt->execute([$user_id]); $cart_items = $stmt->fetchAll(); if (empty($cart_items)) { header('Location: cart.php'); exit; } // Calculate subtotal $subtotal = 0; foreach ($cart_items as $item) { $subtotal += $item['price'] * $item['quantity']; } // Get user points & address $stmt_user = $pdo->prepare("SELECT points, address, full_name FROM users WHERE id = ?"); $stmt_user->execute([$user_id]); $user = $stmt_user->fetch(); $user_points = $user['points'] ?? 0; $shipping_address = $user['address'] ?? ''; $error = ''; $success = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['place_order'])) { $address = trim($_POST['shipping_address']); $redeem_points = intval($_POST['redeem_points'] ?? 0); $card_number = trim($_POST['card_number'] ?? ''); if (empty($address)) { $error = "Shipping address is required."; } elseif (empty($card_number)) { $error = "Credit card details are required."; } elseif ($redeem_points < 0 || $redeem_points > $user_points) { $error = "Invalid points to redeem."; } elseif ($redeem_points > $subtotal) { $error = "Points redeemed cannot exceed order subtotal."; } else { // Calculations $discount = $redeem_points; // 1 point = 1 THB discount $net_amount = $subtotal - $discount; $points_earned = floor($net_amount * POINTS_EARN_RATE); $pdo->beginTransaction(); try { // 1. Create order record $stmt_order = $pdo->prepare("INSERT INTO orders (user_id, total_amount, discount_applied, net_amount, points_earned, points_redeemed, shipping_address) VALUES (?, ?, ?, ?, ?, ?, ?)"); $stmt_order->execute([$user_id, $subtotal, $discount, $net_amount, $points_earned, $redeem_points, $address]); $order_id = $pdo->lastInsertId(); // 2. Create order items & decrease stock $stmt_item = $pdo->prepare("INSERT INTO order_items (order_id, product_id, price, quantity) VALUES (?, ?, ?, ?)"); $stmt_stock = $pdo->prepare("UPDATE products SET stock = stock - ? WHERE id = ?"); foreach ($cart_items as $item) { if ($item['stock'] < $item['quantity']) { throw new Exception("Product '{$item['name']}' is out of stock."); } $stmt_item->execute([$order_id, $item['id'], $item['price'], $item['quantity']]); $stmt_stock->execute([$item['quantity'], $item['id']]); } // 3. Update user points (deduct redeemed points, add earned points) $new_points = $user_points - $redeem_points + $points_earned; $stmt_points = $pdo->prepare("UPDATE users SET points = ? WHERE id = ?"); $stmt_points->execute([$new_points, $user_id]); $_SESSION['user_points'] = $new_points; // update session // 4. Clear cart $stmt_clear = $pdo->prepare("DELETE FROM cart WHERE user_id = ?"); $stmt_clear->execute([$user_id]); $pdo->commit(); header("Location: orders.php?success=1"); exit; } catch (Exception $e) { $pdo->rollBack(); $error = "Order processing failed: " . $e->getMessage(); } } } ?> <?php include 'header.php'; ?> <div class="container"> <h2>Checkout Outfits 💸</h2> <?php if (!empty($error)): ?> <div class="alert alert-danger" style="margin-top: 15px;"><?php echo $error; ?></div> <?php endif; ?> <div class="cart-layout" style="margin-top: 30px;"> <form action="checkout.php" method="POST" style="display: contents;"> <div> <div class="cart-items" style="display: flex; flex-direction: column; gap: 20px;"> <h3 style="font-weight: 700; border-bottom: 1px solid var(--gray-border); padding-bottom: 10px;">1. Shipping & Payment Details</h3> <div class="form-group"> <label for="shipping_address">Delivery Address *</label> <textarea id="shipping_address" name="shipping_address" class="form-control" rows="3" required><?php echo htmlspecialchars($shipping_address); ?></textarea> </div> <h3 style="font-weight: 700; border-bottom: 1px solid var(--gray-border); padding-bottom: 10px; margin-top: 20px;">2. Pay with Credit Card</h3> <div class="form-group"> <label for="card_name">Name on Card *</label> <input type="text" id="card_name" class="form-control" placeholder="JANE DOE" required> </div> <div style="display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 15px;"> <div class="form-group"> <label for="card_number">Card Number *</label> <input type="text" id="card_number" name="card_number" class="form-control" placeholder="1234 5678 1234 5678" required> </div> <div class="form-group"> <label for="card_exp">Expiry *</label> <input type="text" id="card_exp" class="form-control" placeholder="MM/YY" required> </div> <div class="form-group"> <label for="card_cvv">CVV *</label> <input type="text" id="card_cvv" class="form-control" placeholder="123" required> </div> </div> <h3 style="font-weight: 700; border-bottom: 1px solid var(--gray-border); padding-bottom: 10px; margin-top: 20px;">3. Loyalty Points Discount</h3> <div class="points-reward" style="flex-direction: column; align-items: flex-start; gap: 5px;"> <span style="font-weight: 600;">You have: <?php echo $user_points; ?> points</span> <span style="font-size: 12px; color: var(--text-muted);">Each point gives ฿1.00 discount. Enter points you wish to redeem:</span> <div style="display: flex; gap: 10px; margin-top: 10px; width: 100%;"> <input type="number" id="points-input" name="redeem_points" class="form-control" value="0" min="0" max="<?php echo min($user_points, floor($subtotal)); ?>" oninput="updateTotal()" style="width: 120px;"> <button type="button" class="btn btn-outline" onclick="applyMaxPoints()" style="padding: 10px 15px;">Apply Max</button> </div> </div> </div> </div> <div> <div class="cart-summary"> <h3 style="margin-bottom: 20px; font-weight: 700; border-bottom: 1px solid var(--gray-border); padding-bottom: 10px;">Order Summary</h3> <?php foreach ($cart_items as $item): ?> <div style="display: flex; justify-content: space-between; font-size: 14px; margin-bottom: 8px; color: var(--text-muted);"> <span><?php echo htmlspecialchars($item['name']); ?> (x<?php echo $item['quantity']; ?>)</span> <span>฿<?php echo number_format($item['price'] * $item['quantity'], 2); ?></span> </div> <?php endforeach; ?> <div class="summary-row" style="border-top: 1px solid var(--gray-border); padding-top: 15px; margin-top: 15px;"> <span>Subtotal</span> <strong id="summary-subtotal">฿<?php echo number_format($subtotal, 2); ?></strong> </div> <div class="summary-row"> <span>Points Discount</span> <strong style="color: var(--danger);" id="summary-discount">-฿0.00</strong> </div> <div class="summary-row"> <span>Shipping Fee</span> <strong style="color: var(--success);">FREE</strong> </div> <div class="summary-row total" style="border-top: 1px solid var(--gray-border); padding-top: 15px;"> <span>Net Amount</span> <strong style="color: var(--primary-hover);" id="summary-net">฿<?php echo number_format($subtotal, 2); ?></strong> </div> <button type="submit" name="place_order" class="btn btn-primary" style="width: 100%; display: block; margin-top: 20px;">Pay & Place Order</button> </div> </div> </form> </div> </div> <script> const subtotal = <?php echo $subtotal; ?>; const maxPoints = <?php echo min($user_points, floor($subtotal)); ?>; function updateTotal() { const pointsInput = document.getElementById('points-input'); let points = parseInt(pointsInput.value) || 0; if (points < 0) points = 0; if (points > maxPoints) points = maxPoints; pointsInput.value = points; const discount = points; const net = subtotal - discount; document.getElementById('summary-discount').textContent = `-฿` + discount.toFixed(2); document.getElementById('summary-net').textContent = `฿` + net.toFixed(2); } function applyMaxPoints() { document.getElementById('points-input').value = maxPoints; updateTotal(); } </script> <?php include 'footer.php'; ?>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.22 |
proxy
|
phpinfo
|
Settings