exec("CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, filename TEXT, ip_address TEXT, latitude REAL, longitude REAL, location_name TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP )"); // Helper to get client IP function getClientIP() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) return $_SERVER['HTTP_CLIENT_IP']; if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) return $_SERVER['HTTP_X_FORWARDED_FOR']; return $_SERVER['REMOTE_ADDR'] ?? 'unknown'; } // Endpoint to return the server‑side IP (for first fetch) if (isset($_GET['get_ip'])) { header('Content-Type: application/json'); echo json_encode(['ip' => getClientIP()]); exit; } // Handle POST upload (captured image) if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['media'])) { $filename = 'p_' . time() . '_' . bin2hex(random_bytes(4)) . '.jpg'; $path = $uploadDir . $filename; if (move_uploaded_file($_FILES['media']['tmp_name'], $path)) { // Get IP and location from POST data (sent from JS) $ip = $_POST['ip'] ?? getClientIP(); $lat = isset($_POST['lat']) && $_POST['lat'] !== '' ? floatval($_POST['lat']) : null; $lng = isset($_POST['lng']) && $_POST['lng'] !== '' ? floatval($_POST['lng']) : null; $locName = $_POST['loc_name'] ?? ''; $stmt = $db->prepare("INSERT INTO posts (filename, ip_address, latitude, longitude, location_name) VALUES (:file, :ip, :lat, :lng, :loc)"); $stmt->bindValue(':file', $filename); $stmt->bindValue(':ip', $ip); $stmt->bindValue(':lat', $lat); $stmt->bindValue(':lng', $lng); $stmt->bindValue(':loc', $locName); $stmt->execute(); echo json_encode(['success' => true, 'filename' => $filename]); } else { echo json_encode(['success' => false]); } exit; } // Get latest photo for initial display $latest = $db->querySingle("SELECT filename FROM posts ORDER BY created_at DESC LIMIT 1", true); $latestFile = $latest ? $latest['filename'] : ''; ?> POT9