File manager - Edit - /home/webapp69.cm.in.th/u69319090037/Shop/config/db.php
Back
<?php /** * Database Connection class using PDO * CMTC Shopping */ // Enable error reporting to identify any server-side issues ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); class Database { // ========================================== // [ตั้งค่าฐานข้อมูล HOST จริง / PRODUCTION] // ========================================== private $prod_host = "localhost"; // หรือ IP / Hostname ที่โฮสติ้งกำหนด เช่น mysql.host.com private $prod_name = "shop69319090037"; // ชื่อฐานข้อมูลบนโฮสต์ (DB_NAME) private $prod_user = "u69319090037"; // ชื่อผู้ใช้ฐานข้อมูลบนโฮสต์ (DB_USER) private $prod_pass = "@6937"; // รหัสผ่านฐานข้อมูลบนโฮสต์ (DB_PASS) // ========================================== // [ตั้งค่าฐานข้อมูล LOCALHOST / XAMPP] // ========================================== private $local_host = "localhost"; private $local_name = "shop69319090037"; private $local_user = "root"; private $local_pass = ""; public $conn; /** * Get the database connection * @return PDO */ public function getConnection() { $this->conn = null; // ตรวจสอบสภาพแวดล้อมอัตโนมัติ (Localhost vs Production Host) $server_name = $_SERVER['SERVER_NAME'] ?? $_SERVER['HTTP_HOST'] ?? 'localhost'; $is_local = in_array($server_name, ['localhost', '127.0.0.1', '::1']) || strpos($server_name, '192.168.') === 0; if ($is_local) { $host = $this->local_host; $db_name = $this->local_name; $username = $this->local_user; $password = $this->local_pass; } else { $host = $this->prod_host; $db_name = $this->prod_name; $username = $this->prod_user; $password = $this->prod_pass; } try { // บน Localhost ให้ช่วยสร้าง DB / ตารางอัตโนมัติถ้ายังไม่มี if ($is_local && $username === 'root') { try { $pdo_init = new PDO("mysql:host={$host};charset=utf8mb4", $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT]); $pdo_init->exec("CREATE DATABASE IF NOT EXISTS `{$db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"); } catch(Throwable $e) {} } // เชื่อมต่อฐานข้อมูลด้วย PDO + UTF-8 (utf8mb4) $this->conn = new PDO( "mysql:host={$host};dbname={$db_name};charset=utf8mb4", $username, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci" ] ); // นำเข้าข้อมูลเริ่มต้นอัตโนมัติ (หากฐานข้อมูลยังว่างเปล่า) try { $checkTable = $this->conn->query("SHOW TABLES LIKE 'users'"); if ($checkTable && $checkTable->rowCount() == 0) { $schemaFile = __DIR__ . '/../database/schema.sql'; if (file_exists($schemaFile)) { $sql = file_get_contents($schemaFile); $this->conn->exec($sql); } } } catch(Throwable $e) {} // Auto migration ตรวจสอบคอลัมน์ที่จำเป็น try { $this->conn->exec("ALTER TABLE users ADD COLUMN address TEXT NULL AFTER phone"); } catch(Throwable $e) {} try { $this->conn->exec("ALTER TABLE orders ADD COLUMN shipping_address TEXT NULL AFTER recipient_photo"); } catch(Throwable $e) {} try { // Drop unique index on sku to allow flexibility and prevent duplicate SKU errors $indexes = $this->conn->query("SHOW INDEX FROM products WHERE Column_name = 'sku' AND Non_unique = 0"); if ($indexes) { $idxRows = $indexes->fetchAll(); foreach ($idxRows as $idx) { $this->conn->exec("ALTER TABLE products DROP INDEX `{$idx['Key_name']}`"); } } } catch(Throwable $e) {} } catch(Throwable $exception) { while (ob_get_level() > 0) { ob_end_clean(); } // Strip sensitive credentials from error message before logging $raw_msg = $exception->getMessage(); $safe_msg = !empty($password) ? str_replace($password, '********', $raw_msg) : $raw_msg; // Server-side error log error_log("Database Connection Error: " . $safe_msg); // Display clean, secure user-facing message $error_html = "<div style='font-family: Sarabun, Tahoma, sans-serif; max-width: 650px; margin: 60px auto; padding: 30px; border-radius: 14px; background: #fff; border: 1px solid #f5c2c7; color: #842029; box-shadow: 0 10px 30px rgba(0,0,0,0.08);'>"; $error_html .= "<h3 style='margin-top:0; color:#dc3545; display:flex; align-items:center; gap:8px;'>⚠️ ระบบไม่สามารถเชื่อมต่อฐานข้อมูลได้</h3>"; $error_html .= "<div style='background:#fdf2f2; padding:12px 15px; border-radius:8px; font-family:monospace; margin:15px 0; word-break:break-all;'><b>Error:</b> " . htmlspecialchars($safe_msg) . "</div>"; $error_html .= "<p style='margin-bottom:8px; font-weight:bold; color:#333;'>การตั้งค่าที่ระบบพยายามเชื่อมต่อบน Hosting:</p>"; $error_html .= "<ul style='margin-top:5px; padding-left:20px; color:#555; line-height:1.8;'>"; $error_html .= "<li>Host: <code>" . htmlspecialchars($host) . "</code></li>"; $error_html .= "<li>Database Name: <code>" . htmlspecialchars($db_name) . "</code></li>"; $error_html .= "<li>Username: <code>" . htmlspecialchars($username) . "</code></li>"; $error_html .= "</ul>"; $error_html .= "<hr style='border:0; border-top:1px solid #eee; margin:20px 0;'>"; $error_html .= "<p style='margin-bottom:5px; font-weight:bold; color:#333;'>วิธีแก้ไข:</p>"; $error_html .= "<ol style='margin-top:5px; padding-left:20px; color:#555; line-height:1.8;'>"; $error_html .= "<li>เปิดไฟล์ <code>config/db.php</code> แล้วตรวจสอบว่า <b>\$prod_name</b>, <b>\$prod_user</b>, <b>\$prod_pass</b> ตรงกับที่สร้างไว้บน Hosting Control Panel หรือไม่</li>"; $error_html .= "<li>ตรวจสอบใน phpMyAdmin ว่าได้ Import ไฟล์ <code>database/schema.sql</code> เข้าไปในฐานข้อมูลแล้วหรือไม่</li>"; $error_html .= "</ol></div>"; die($error_html); } return $this->conn; } } ?>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.23 |
proxy
|
phpinfo
|
Settings