File manager - Edit - /var/www/order.cmtc.ac.th/showproduct.php
Back
<?php session_start(); include('config/db.php'); include('includes/check_timer.php'); // ✅ ตรวจสอบเวลานับถอยหลัง // ✅ ตรวจสอบว่ามี session การชำระเงินค้างอยู่หรือไม่ $checkout_locked = false; if (isset($_SESSION['checkout_expire']) && time() < $_SESSION['checkout_expire']) { $checkout_locked = true; // ยังอยู่ในระยะเวลาชำระเงิน } // ✅ ตรวจสอบว่ามีเวลานับถอยหลังจาก checkout.php หรือไม่ $checkout_active = false; if (isset($_SESSION['checkout_expire'])) { if (time() < $_SESSION['checkout_expire']) { $checkout_active = true; } else { // ถ้าหมดเวลาแล้วให้ล้างค่า unset($_SESSION['checkout_expire']); } } $id = intval($_GET['id']); $prod = $conn->query("SELECT * FROM products WHERE id=$id")->fetch_assoc(); if(!$prod){ header("Location: index.php"); exit; } // คำนวณจำนวนคงเหลือจริง (stock - reserved) $available = max(0, intval($prod['stock']) - intval($prod['reserved'])); // บันทึกการเข้าชมสินค้า (คุณอาจต้องการจำกัดเป็น 1 ครั้งต่อวันต่อ IP ถ้าต้องการ) $user_ip = $_SERVER['REMOTE_ADDR']; $conn->query("INSERT INTO product_views (product_id, user_ip, viewed_at) VALUES ($id, '$user_ip', NOW())"); // ดึงจำนวนเข้าชมทั้งหมด $view_data = $conn->query("SELECT COUNT(*) AS total_views FROM product_views WHERE product_id = $id")->fetch_assoc(); $total_views = $view_data['total_views'] ?? 0; // ดึงสถานะระบบจอง และ pre-order $setting_booking = $conn->query("SELECT setting_value FROM settings WHERE setting_key='booking_status'")->fetch_assoc(); $booking_status = $setting_booking['setting_value'] ?? 'on'; $setting_preorder = $conn->query("SELECT setting_value FROM settings WHERE setting_key='pre_order_status'")->fetch_assoc(); $can_preorder = ($setting_preorder['setting_value'] ?? 'off') === 'on'; // ดึงจำนวนที่ถูกจองแล้ว (ยืนยัน / ปกติ) $q = $conn->query(" SELECT SUM(i.qty) AS total FROM order_items i JOIN orders o ON o.id = i.order_id WHERE i.product_id = {$prod['id']} AND i.confirm_status != 'ยกเลิก' AND i.item_status = 'ปกติ' "); $count_ordered = 0; if($q && $r = $q->fetch_assoc()) { $count_ordered = intval($r['total']); } // คำนวณเปอร์เซ็นต์การจอง และสี progress bar $total_for_percent = $prod['stock'] + $count_ordered; $percent = ($total_for_percent > 0) ? round(($count_ordered / $total_for_percent) * 100) : 0; if ($percent <= 30) $barColor = '#28a745'; elseif ($percent <= 70) $barColor = '#ffc107'; else $barColor = '#dc3545'; // --- การจัดการตะกร้า (เพิ่ม/ลบ) --- // เพิ่มสินค้าเข้าตะกร้า (เฉพาะเมื่อระบบเปิดจอง) if($booking_status == 'on' && isset($_POST['add_to_cart'])){ $pid = intval($_POST['product_id']); $qty = max(1, intval($_POST['qty'])); // ดึง stock และ reserved ปัจจุบัน $p = $conn->query("SELECT stock, reserved FROM products WHERE id=$pid")->fetch_assoc(); if($p){ $stock = intval($p['stock']); $reserved = intval($p['reserved']); $available_now = $stock - $reserved; if($available_now >= $qty || $can_preorder){ // ตัดยอด reserved (กันไว้ชั่วคราว) $conn->query("UPDATE products SET reserved = reserved + $qty WHERE id = $pid"); // เก็บใน session cart if(!isset($_SESSION['cart'][$pid])){ $_SESSION['cart'][$pid] = $qty; } else { $_SESSION['cart'][$pid] += $qty; } // บันทึก log การเพิ่มตะกร้า (ถ้ามี) $session_id = session_id(); $conn->query("INSERT INTO booking_logs (product_id, qty, session_id, booked_at) VALUES ($pid, $qty, '$session_id', NOW())"); header("Location: showproduct.php?id=$pid&cart_added=1"); exit; } else { header("Location: showproduct.php?id=$pid&out_of_stock=1"); exit; } } } // ลบสินค้าออกจากตะกร้า (คืน reserved) if(isset($_POST['remove_from_cart'])){ $pid = intval($_POST['product_id']); if(isset($_SESSION['cart'][$pid])){ $qty_remove = intval($_SESSION['cart'][$pid]); // คืนยอด reserved $conn->query("UPDATE products SET reserved = GREATEST(reserved - $qty_remove, 0) WHERE id = $pid"); unset($_SESSION['cart'][$pid]); header("Location: showproduct.php?id=$pid&removed=1"); exit; } } // หากต้องการให้ผู้ใช้ปรับลดจำนวนในตะกร้าแยกต่างหาก ให้เพิ่ม handling แบบ update_qty (ไม่ใส่ที่นี่เพื่อความเรียบง่าย) // นับจำนวนรวมในตะกร้า $cart_count = 0; if(isset($_SESSION['cart'])) { foreach($_SESSION['cart'] as $qty) { $cart_count += $qty; } } // จำนวนที่อยู่ในตะกร้าของสินค้านี้ $in_cart = isset($_SESSION['cart'][$id]) ? intval($_SESSION['cart'][$id]) : 0; // จำนวนคงเหลือจริงที่ผู้ใช้เพิ่มเติมจะสามารถเลือกได้ $available = max(0, intval($prod['stock']) - intval($prod['reserved']) ); $remaining_for_user = max(0, $available); // สำหรับ input max ?> <?php include('includes/timer_bar.php'); ?> <!DOCTYPE html> <html lang="th"> <head> <meta charset="UTF-8"> <title><?=$system_name?> <?=$coin_name?> <?=$school_name?> : <?=$prod['name']?></title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/lightbox2@2.11.4/dist/css/lightbox.min.css" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;500;600&display=swap" rel="stylesheet"> <!-- ✅ Summernote --> <link href="https://cdn.jsdelivr.net/npm/summernote@0.8.20/dist/summernote-lite.min.css" rel="stylesheet"> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/summernote@0.8.20/dist/summernote-lite.min.js"></script> <style> body {font-family:'Kanit',sans-serif;background:#fafafa;} .detail-card {border-radius:15px;box-shadow:0 2px 8px rgba(0,0,0,0.1);} .image-row {display:flex;justify-content:center;align-items:flex-start;gap:20px;flex-wrap:wrap;} .image-box {flex:0 1 45%;text-align:center;} .img-thumb {width:100%;border-radius:12px;cursor:pointer;transition:transform 0.2s ease;} .img-thumb:hover {transform:scale(1.05);} .img-label {font-size:14px;text-align:center;margin-top:6px;color:#555;} .qty-group {display:flex;align-items:center;gap:8px;} .qty-btn {width:32px;height:32px;border:1px solid #ccc;border-radius:6px;background:#fff;font-weight:bold;cursor:pointer;} .qty-btn:hover {background:#eee;} .modal-content {border-radius:16px;} .progress {height:8px;border-radius:6px;background-color:#e9ecef;margin-top:8px;overflow:hidden;} .progress-bar {transition:width 0.6s ease;} </style> </head> <body> <?php include('template_user_header.php'); ?> <div class="container py-5"> <div class="row g-4 align-items-start detail-card bg-white p-4"> <!-- รูป --> <div class="col-md-6 text-center"> <div class="image-row"> <?php if($prod['img1']): ?> <div class="image-box"> <a href="uploads/products/<?=$prod['img1']?>" data-lightbox="product<?=$prod['id']?>" data-title="ด้านหน้า: <?=$prod['name']?>"><img src="uploads/products/<?=$prod['img1']?>" class="img-thumb" alt="ด้านหน้า"></a> <div class="img-label">ด้านหน้า</div> </div> <?php endif; ?> <?php if($prod['img2']): ?> <div class="image-box"> <a href="uploads/products/<?=$prod['img2']?>" data-lightbox="product<?=$prod['id']?>" data-title="ด้านหลัง: <?=$prod['name']?>"><img src="uploads/products/<?=$prod['img2']?>" class="img-thumb" alt="ด้านหลัง"></a> <div class="img-label">ด้านหลัง</div> </div> <?php endif; ?> </div> </div> <!-- รายละเอียด --> <div class="col-md-6"> <div class="d-flex justify-content-between align-items-center mb-2"> <h3 class="fw-bold mb-0"><?=$prod['name']?></h3> <span class="text-muted small">👁️ <?=$total_views?> ครั้ง</span> </div> <p class="fs-5 text-danger mb-2">ราคา <b><?=number_format($prod['price'],2)?></b> บาท</p> <p class="text-secondary mb-3"><?=$prod['detail']?></p> <?php if($prod['stock'] > 0): ?> <p><b>คงเหลือจริง:</b> <?=$available?> เหรียญ</p> <?php if($in_cart > 0): ?> <p class="text-info"><b>อยู่ในตะกร้าของคุณ:</b> <?=$in_cart?> เหรียญ</p> <?php endif; ?> <p><b>จองแล้ว (ยืนยัน):</b> <?=$count_ordered?> เหรียญ</p> <div class="progress"> <div class="progress-bar" role="progressbar" style="width: <?=$percent?>%; background-color: <?=$barColor?>;" aria-valuenow="<?=$percent?>" aria-valuemin="0" aria-valuemax="100"></div> </div> <?php elseif($can_preorder): ?> <p class="text-warning"><b>Pre Order</b></p> <?php else: ?> <p class="text-danger"><b>เหรียญหมด</b></p> <?php endif; ?> <?php if($booking_status == 'off'): ?> <div class="alert alert-danger mt-3 text-center">⛔ ขณะนี้ระบบปิดรับการจองเหรียญ</div> <?php endif; ?> <!-- ฟอร์มเพิ่ม/ลบตะกร้า --> <form method="post" class="mt-3"> <input type="hidden" name="product_id" value="<?=$prod['id']?>"> <div class="mb-3"> <label class="fw-semibold">จำนวนที่ต้องการ:</label> <?php if($available > 0 || $can_preorder): ?> <div class="qty-group mt-2"> <button type="button" class="qty-btn" id="minusBtn">-</button> <input type="number" id="qtyInput" name="qty" value="1" min="1" max="<?= $available > 0 ? $available : 99 ?>" class="form-control w-auto text-center"> <button type="button" class="qty-btn" id="plusBtn">+</button> </div> <?php else: ?> <p class="text-muted">ไม่สามารถเลือกจำนวนได้ (เหรียญหมด)</p> <?php endif; ?> </div> <div class="d-flex flex-column flex-md-row gap-2"> <?php if($checkout_locked): ?> <button class="btn btn-secondary w-100 py-2" disabled> ⛔ อยู่ระหว่างการชำระเงิน </button> <?php elseif($booking_status == 'off'): ?> <button class="btn btn-secondary w-100 py-2" disabled>⛔ ระบบปิดรับจอง</button> <?php elseif($available > 0 || $can_preorder): ?> <button type="submit" name="add_to_cart" class="btn btn-success w-100 py-2"> 🛒 เพิ่มไปยังตะกร้า </button> <?php else: ?> <button class="btn btn-secondary w-100 py-2" disabled>เหรียญหมด</button> <?php endif; ?> <a href="index.php" class="btn btn-outline-secondary w-100 py-2">⬅ กลับหน้าแรก</a> </div> </form> <?php if($checkout_locked): ?> <a href="user/checkout.php".php" class="btn btn-outline-primary w-100 py-2">🗑️ ไปหน้าชำระเงิน</a> <?php else: ?> <?php if($in_cart > 0): ?> <form method="post" class="mt-2"> <input type="hidden" name="product_id" value="<?=$prod['id']?>"> <button type="submit" name="remove_from_cart" class="btn btn-outline-danger w-100 py-2">🗑️ ลบออกจากตะกร้า (คืนยอด)</button> <?php endif; ?> </form> <?php endif; ?> </div> </div> </div> <!-- Modal แจ้งเตือนเมื่อเพิ่มสินค้าในตะกร้า --> <div class="modal fade" id="cartModal" tabindex="-1" aria-labelledby="cartModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content border-0 shadow-lg"> <div class="modal-header bg-success text-white"> <h5 class="modal-title" id="cartModalLabel">เพิ่มเหรียญสำเร็จ</h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button> </div> <div class="modal-body text-center py-4"> <h1 class="text-success mb-3">✅</h1> <p class="fs-5 fw-semibold">เพิ่มเหรียญลงตะกร้าเรียบร้อยแล้ว!</p> </div> <div class="modal-footer justify-content-center"> <a href="user/index.php" class="btn btn-primary">ดูตะกร้าสินค้า</a> <a href="index.php" class="btn btn-secondary">เลือกเหรียญเพิ่ม</a> </div> </div> </div> </div> <!-- scripts --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/lightbox2@2.11.4/dist/js/lightbox-plus-jquery.min.js"></script> <script> document.getElementById('minusBtn')?.addEventListener('click',()=>{ let input=document.getElementById('qtyInput'); let val=parseInt(input.value); if(val>1) input.value=val-1; }); document.getElementById('plusBtn')?.addEventListener('click',()=>{ let input=document.getElementById('qtyInput'); let val=parseInt(input.value); let max = parseInt(input.max); if(val < max) input.value=val+1; }); // แสดง Modal เมื่อเพิ่มสินค้าสำเร็จ (redirect จะมี ?cart_added=1) <?php if(isset($_GET['cart_added'])): ?> document.addEventListener('DOMContentLoaded', function(){ const modalEl = document.getElementById('cartModal'); if(modalEl){ const modal = new bootstrap.Modal(modalEl); modal.show(); setTimeout(() => { try{ modal.hide(); } catch(e){} }, 3000); } }); <?php endif; ?> </script> </div> <?php include("footer.php"); ?> </body> </html>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.42 |
proxy
|
phpinfo
|
Settings