File manager - Edit - /home/webapp69.cm.in.th/u69319090014/shop non 014/db.php
Back
<?php // db.php - Database connection and auto-setup // 0. Load external config file if available (useful for hosting deployment) if (file_exists(__DIR__ . '/config.php')) { require_once __DIR__ . '/config.php'; } // Auto-detect student user ID from path or request URI if hosted on server (e.g. /u69319090014/) $detected_user = null; if (preg_match('/(u\d{8,11})/i', __DIR__ . ' ' . ($_SERVER['REQUEST_URI'] ?? '') . ' ' . ($_SERVER['SCRIPT_NAME'] ?? ''), $m)) { $detected_user = strtolower($m[1]); } $host = defined('DB_HOST') ? DB_HOST : (getenv('DB_HOST') ?: ($_SERVER['DB_HOST'] ?? 'localhost')); $username = defined('DB_USER') ? DB_USER : (getenv('DB_USER') ?: ($_SERVER['DB_USER'] ?? ($detected_user ?: 'root'))); $password = defined('DB_PASS') ? DB_PASS : (getenv('DB_PASS') ?: ($_SERVER['DB_PASS'] ?? '')); $dbname = defined('DB_NAME') ? DB_NAME : (getenv('DB_NAME') ?: ($_SERVER['DB_NAME'] ?? 'shop_non_014')); // Build list of candidate database names to try automatically on web hosting $db_candidates = array_unique(array_filter([ $dbname, $detected_user, $detected_user ? $detected_user . '_db' : null, $detected_user ? $detected_user . '_shop' : null, $username !== 'root' ? $username : null, $username !== 'root' ? $username . '_db' : null, 'shop_non_014' ])); $pdo = null; $last_exception = null; try { // 1. Try connecting to candidate databases directly foreach ($db_candidates as $try_db) { try { $pdo = new PDO("mysql:host=$host;dbname=$try_db;charset=utf8mb4", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbname = $try_db; // Successfully connected! break; } catch (PDOException $e) { $last_exception = $e; // If database missing (1049) or access denied to specific db name (1044), try next candidate if ($e->getCode() == 1049 || $e->getCode() == 1044 || strpos($e->getMessage(), 'Access denied for user') !== false && strpos($e->getMessage(), 'to database') !== false) { continue; } else { // For user authentication failures (1045, 1698), stop loop to display credentials error break; } } } // If direct connection to candidate DBs failed, attempt creating DB if permitted (Local XAMPP) if (!$pdo) { try { $pdo = new PDO("mysql:host=$host", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec("CREATE DATABASE IF NOT EXISTS `$dbname` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { throw $last_exception ?: $e; } } // Table: products $pdo->exec("CREATE TABLE IF NOT EXISTS products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, price DECIMAL(10, 2) NOT NULL, category VARCHAR(100) NOT NULL, sizes VARCHAR(100) NOT NULL, -- Comma-separated S,M,L,XL colors VARCHAR(100) NOT NULL, -- Comma-separated Black,White,Grey stock INT NOT NULL DEFAULT 0, image VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"); // Table: users $pdo->exec("CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL DEFAULT 'customer', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"); // Table: orders (Updated to include user_id) $pdo->exec("CREATE TABLE IF NOT EXISTS orders ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NULL, customer_name VARCHAR(255) NOT NULL, phone VARCHAR(20) NOT NULL, address TEXT NOT NULL, total_price DECIMAL(10, 2) NOT NULL, status VARCHAR(50) DEFAULT 'Pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"); // Table: order_items $pdo->exec("CREATE TABLE IF NOT EXISTS order_items ( id INT AUTO_INCREMENT PRIMARY KEY, order_id INT NOT NULL, product_id INT NOT NULL, size VARCHAR(20) NOT NULL, color VARCHAR(50) NOT NULL, quantity INT NOT NULL, price DECIMAL(10, 2) NOT NULL, FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE, FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"); // Table: coupons $pdo->exec("CREATE TABLE IF NOT EXISTS coupons ( id INT AUTO_INCREMENT PRIMARY KEY, code VARCHAR(50) UNIQUE NOT NULL, discount_type VARCHAR(20) NOT NULL, -- 'percent' or 'fixed' discount_value DECIMAL(10, 2) NOT NULL, min_order_value DECIMAL(10, 2) NOT NULL DEFAULT 0.00, description VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"); // Table: user_coupons $pdo->exec("CREATE TABLE IF NOT EXISTS user_coupons ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, coupon_id INT NOT NULL, is_used TINYINT(1) DEFAULT 0, collected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (coupon_id) REFERENCES coupons(id) ON DELETE CASCADE, UNIQUE KEY user_coupon_unique (user_id, coupon_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"); // Check if we need to upgrade the database to luxury version $check_luxury = $pdo->query("SELECT COUNT(*) FROM products WHERE name LIKE '%Audemars%'")->fetchColumn(); if ($check_luxury == 0) { $pdo->exec("SET FOREIGN_KEY_CHECKS = 0;"); $pdo->exec("TRUNCATE TABLE order_items;"); $pdo->exec("TRUNCATE TABLE orders;"); $pdo->exec("TRUNCATE TABLE user_coupons;"); $pdo->exec("TRUNCATE TABLE coupons;"); $pdo->exec("TRUNCATE TABLE products;"); $pdo->exec("SET FOREIGN_KEY_CHECKS = 1;"); } // Insert Default Admin & Customer if not exist $check_user = $pdo->prepare("SELECT COUNT(*) FROM users WHERE username = :username"); // Admin $check_user->execute([':username' => 'admin']); if ($check_user->fetchColumn() == 0) { $admin_hash = password_hash('admin1234', PASSWORD_BCRYPT); $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES ('admin', :hash, 'admin')") ->execute([':hash' => $admin_hash]); } // Customer $check_user->execute([':username' => 'customer']); if ($check_user->fetchColumn() == 0) { $customer_hash = password_hash('customer1234', PASSWORD_BCRYPT); $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES ('customer', :hash, 'customer')") ->execute([':hash' => $customer_hash]); } // Insert Default Coupons if none exist $coupon_count = $pdo->query("SELECT COUNT(*) FROM coupons")->fetchColumn(); if ($coupon_count == 0) { $default_coupons = [ [ 'code' => 'WELCOMEVIP', 'discount_type' => 'percent', 'discount_value' => 10.00, 'min_order_value' => 50000.00, 'description' => 'ลด 10% สำหรับสมาชิกใหม่ระดับ VIP เมื่อช้อปครบ 50,000 บาทขึ้นไป' ], [ 'code' => 'ROYALTY10000', 'discount_type' => 'fixed', 'discount_value' => 10000.00, 'min_order_value' => 100000.00, 'description' => 'ลดทันที 10,000 บาท สำหรับยอดช้อปครบ 100,000 บาทขึ้นไป' ], [ 'code' => 'ELITE50000', 'discount_type' => 'fixed', 'discount_value' => 50000.00, 'min_order_value' => 500000.00, 'description' => 'ลดพิเศษ 50,000 บาท สำหรับยอดสั่งซื้อพิเศษครบ 500,000 บาทขึ้นไป' ], [ 'code' => 'GOLDDELIVERY', 'discount_type' => 'fixed', 'discount_value' => 1000.00, 'min_order_value' => 10000.00, 'description' => 'บริการขนส่งและประกันภัยระดับพรีเมียม มูลค่า 1,000 บาท ฟรีไม่มีค่าใช้จ่าย' ] ]; $insert_coupon = $pdo->prepare("INSERT INTO coupons (code, discount_type, discount_value, min_order_value, description) VALUES (:code, :discount_type, :discount_value, :min_order_value, :description)"); foreach ($default_coupons as $cp) { $insert_coupon->execute($cp); } } // Determine paths $image_ap = 'https://images.unsplash.com/photo-1547996160-81dfa63595aa?w=800&auto=format&fit=crop'; $image_hermes = 'https://images.unsplash.com/photo-1584917865442-de89df76afd3?w=800&auto=format&fit=crop'; $image_loropiana = 'https://images.unsplash.com/photo-1533867617858-e7b97e060509?w=800&auto=format&fit=crop'; $image_cucinelli = 'https://images.unsplash.com/photo-1620799140408-edc6dcb6d633?w=800&auto=format&fit=crop'; $image_tomford = 'https://images.unsplash.com/photo-1593032465175-481ac7f401a0?w=800&auto=format&fit=crop'; // Insert sample data if products table is empty $stmt = $pdo->query("SELECT COUNT(*) FROM products"); $count = $stmt->fetchColumn(); if ($count == 0) { $sample_products = [ [ 'name' => "Audemars Piguet Royal Oak Chronograph 41mm", 'description' => "นาฬิกาสปอร์ตหรูระดับมาสเตอร์พีซ ตัวเรือนทองคำชมพู 18 กะรัต (18k Rose Gold) ขัดแต่งหน้าปัดลาย 'Grande Tapisserie' สีน้ำเงินคลาสสิก พร้อมกลไก Chronograph ไขลานอัตโนมัติ สำรองพลังงาน 70 ชั่วโมง สัญลักษณ์เหนือกาลเวลาสำหรับผู้สะสมระดับ Elite", 'price' => 2650000.00, 'category' => "นาฬิกาหรู (Luxury Watches)", 'sizes' => "38mm,41mm", 'colors' => "Rose Gold,Yellow Gold,Platinum", 'stock' => 3, 'image' => $image_ap ], [ 'name' => "Hermès Birkin 30 Gold Togo Gold Hardware", 'description' => "กระเป๋าถือระดับสูงสุดที่เป็นที่ต้องการทั่วโลก ผลิตจากหนัง Togo สี Gold อะไหล่ทองคำ (Gold Hardware) ตัดเย็บด้วยมือโดยช่างฝีมือชั้นสูงชาวฝรั่งเศสในระดับชิ้นต่อชิ้น มอบสัมผัสที่สง่างามและแสดงถึงรสนิยมระดับสูงสุด", 'price' => 850000.00, 'category' => "กระเป๋าดีไซเนอร์ (Designer Bags)", 'sizes' => "Size 30,Size 35", 'colors' => "Gold Brown,Noir Black,Etain Grey", 'stock' => 2, 'image' => $image_hermes ], [ 'name' => "Loro Piana Summer Walk Loafers", 'description' => "รองเท้าโลฟเฟอร์หนังกลับกันน้ำ ซับในหนังลูกวัวเกรดพรีเมียม สวมใส่สบายด้วยพื้นยางเอกลักษณ์ นุ่มเบาเป็นพิเศษตามมาตรฐานระดับ Old Money มอบลุคสุภาพบุรุษที่เรียบง่ายแต่ทรงพลัง สะท้อนถึงการพักผ่อนระดับผู้มีอันจะกิน", 'price' => 45000.00, 'category' => "รองเท้าหรู (Luxury Shoes)", 'sizes' => "EU 40,EU 41,EU 42,EU 43,EU 44", 'colors' => "Sand Beige,Navy Blue,Charcoal", 'stock' => 8, 'image' => $image_loropiana ], [ 'name' => "Brunello Cucinelli Cashmere Knit Sweater", 'description' => "เสื้อสเวตเตอร์ถักไหมแคชเมียร์แท้ 100% คัดสรรอย่างเข้มงวดจากแคว้น Solomeo ประเทศอิตาลี เนื้อผ้านุ่มละเอียดเป็นพิเศษ มอบความอบอุ่นและภาพลักษณ์ที่เรียบหรูสไตล์ Quiet Luxury ไร้กาลเวลา", 'price' => 68000.00, 'category' => "เสื้อผ้าแฟชั่นหรู (Haute Couture)", 'sizes' => "S,M,L,XL", 'colors' => "Oatmeal Melange,Slate Grey,Camel", 'stock' => 5, 'image' => $image_cucinelli ], [ 'name' => "Tom Ford Peak-Lapel Silk Tuxedo Suit", 'description' => "สูททักซิโด้ปกแหลมหุ้มผ้าซาตินไหมขัดเงาตัวท็อป คัตติ้งเน้นบ่าคมสไตล์อิตาเลียนสุดประณีต ออกแบบโดยดีไซเนอร์ระดับโลก Tom Ford มอบบุคลิกโดดเด่น สง่างาม ไร้ที่ติสำหรับงานกาล่าค่ำคืนสำคัญ", 'price' => 189000.00, 'category' => "เสื้อผ้าแฟชั่นหรู (Haute Couture)", 'sizes' => "EU 48,EU 50,EU 52,EU 54", 'colors' => "Classic Black,Midnight Blue", 'stock' => 4, 'image' => $image_tomford ] ]; $insert_stmt = $pdo->prepare("INSERT INTO products (name, description, price, category, sizes, colors, stock, image) VALUES (:name, :description, :price, :category, :sizes, :colors, :stock, :image)"); foreach ($sample_products as $prod) { $insert_stmt->execute($prod); } } } catch (PDOException $e) { // If output buffer is clean, output friendly error UI if (!headers_sent()) { http_response_code(500); } ?> <!DOCTYPE html> <html lang="th"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Database Connection Error - N O N _ S H O P</title> <link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;600&family=Outfit:wght@400;600;700&display=swap" rel="stylesheet"> <style> * { box-sizing: border-box; margin: 0; padding: 0; font-family: 'Kanit', 'Outfit', sans-serif; } body { background-color: #0b0c10; color: #c5c6c7; display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; } .error-card { background: rgba(26, 26, 46, 0.95); border: 1px solid rgba(255, 75, 75, 0.4); border-radius: 16px; padding: 30px; max-width: 650px; width: 100%; box-shadow: 0 10px 30px rgba(0,0,0,0.5); backdrop-filter: blur(10px); } .error-header { display: flex; align-items: center; gap: 15px; margin-bottom: 20px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); padding-bottom: 15px; } .error-icon { width: 48px; height: 48px; background: rgba(255, 75, 75, 0.2); color: #ff4b4b; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 24px; font-weight: bold; } .error-title { font-size: 20px; font-weight: 600; color: #ffffff; } .error-subtitle { font-size: 13px; color: #8892b0; } .error-msg { background: rgba(0,0,0,0.4); border-left: 4px solid #ff4b4b; padding: 12px 15px; border-radius: 6px; font-family: monospace; font-size: 13px; color: #ff8e8e; margin-bottom: 20px; word-break: break-all; } .solution-title { font-size: 16px; font-weight: 600; color: #66fcf1; margin-bottom: 10px; } .solution-steps { font-size: 14px; line-height: 1.6; color: #d1d5db; margin-bottom: 15px; } .code-box { background: #111; border: 1px solid #333; border-radius: 8px; padding: 15px; font-family: monospace; font-size: 13px; color: #00ffcc; overflow-x: auto; white-space: pre; margin-top: 10px; } </style> </head> <body> <div class="error-card"> <div class="error-header"> <div class="error-icon">!</div> <div> <div class="error-title">ไม่สามารถเชื่อมต่อฐานข้อมูลได้ (Database Error)</div> <div class="error-subtitle">N O N _ S H O P Connection Diagnostic</div> </div> </div> <div class="error-msg">การเชื่อมต่อล้มเหลว: <?php echo htmlspecialchars($e->getMessage()); ?></div> <div class="solution-title">💡 วิธีแก้ไขสำหรับ Web Hosting:</div> <div class="solution-steps"> สร้างหรือแก้ไขไฟล์ <strong><code>config.php</code></strong> บน Server (ในโฟลเดอร์เดียวกับ <code>db.php</code>) ให้ตรงกับบัญชี MySQL ของโฮสติ้ง: </div> <div class="code-box"><?php // config.php define('DB_HOST', 'localhost'); define('DB_USER', 'ชื่อผู้ใช้_MySQL_บน_Server'); define('DB_PASS', 'รหัสผ่าน_MySQL_บน_Server'); define('DB_NAME', 'ชื่อฐานข้อมูล_บน_Server');</div> </div> </body> </html> <?php exit; }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.29 |
proxy
|
phpinfo
|
Settings