host = DB_HOST; $this->name = DB_NAME; $this->user = DB_USER; $this->pass = DB_PASS; $this->connect(); } public static function getInstance() { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } private function connect() { try { $dsn = "mysql:host={$this->host};dbname={$this->name};charset=utf8mb4"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $this->pdo = new PDO($dsn, $this->user, $this->pass, $options); } catch (PDOException $e) { throw new Exception("Database connection failed: " . $e->getMessage()); } } public function getConnection() { return $this->pdo; } public function query($sql, $params = []) { try { $stmt = $this->pdo->prepare($sql); $stmt->execute($params); return $stmt; } catch (PDOException $e) { throw new Exception("Query failed: " . $e->getMessage()); } } public function fetch($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetch(); } public function fetchAll($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetchAll(); } public function insert($table, $data) { $columns = implode(', ', array_keys($data)); $placeholders = implode(', ', array_fill(0, count($data), '?')); $values = array_values($data); $sql = "INSERT INTO $table ($columns) VALUES ($placeholders)"; $this->query($sql, $values); return $this->pdo->lastInsertId(); } public function update($table, $data, $where, $whereParams = []) { $setParts = []; $values = []; foreach ($data as $column => $value) { $setParts[] = "$column = ?"; $values[] = $value; } $setClause = implode(', ', $setParts); $sql = "UPDATE $table SET $setClause WHERE $where"; $values = array_merge($values, $whereParams); $stmt = $this->query($sql, $values); return $stmt->rowCount(); } public function delete($table, $where, $params = []) { $sql = "DELETE FROM $table WHERE $where"; $stmt = $this->query($sql, $params); return $stmt->rowCount(); } public function beginTransaction() { return $this->pdo->beginTransaction(); } public function commit() { return $this->pdo->commit(); } public function rollback() { return $this->pdo->rollBack(); } public function lastInsertId() { return $this->pdo->lastInsertId(); } }