pdo === null) { try { $dsn = "mysql:host=" . $this->host . ";dbname=" . $this->dbname . ";charset=utf8mb4"; $this->pdo = new PDO($dsn, $this->username, $this->password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ]); } catch (PDOException $e) { throw new Exception("Database connection failed: " . $e->getMessage()); } } return $this->pdo; } } // includes/functions.php function generatePasteId($length = 8) { $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $id = ''; for ($i = 0; $i < $length; $i++) { $id .= $characters[rand(0, strlen($characters) - 1)]; } return $id; } function timeAgo($datetime) { $time = time() - strtotime($datetime); if ($time < 60) return 'just now'; if ($time < 3600) return floor($time/60) . ' minutes ago'; if ($time < 86400) return floor($time/3600) . ' hours ago'; if ($time < 2592000) return floor($time/86400) . ' days ago'; if ($time < 31536000) return floor($time/2592000) . ' months ago'; return floor($time/31536000) . ' years ago'; } function sanitizeOutput($string) { return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); } function getClientIP() { $ipkeys = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR']; foreach ($ipkeys as $key) { if (array_key_exists($key, $_SERVER) === true) { foreach (explode(',', $_SERVER[$key]) as $ip) { $ip = trim($ip); if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) { return $ip; } } } } return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; }