false, 'error' => 'Invalid JSON payload', ]; } // --------------------------------------------------------------------- // 2. User / Session ermitteln (robust) // --------------------------------------------------------------------- $userId = null; $isLoggedIn = 0; // A) user_id direkt in Session if (!empty($_SESSION['user_id'])) { $userId = (int)$_SESSION['user_id']; } // B) dein Login: $_SESSION['user']['id'] elseif (!empty($_SESSION['user']['id'])) { $userId = (int)$_SESSION['user']['id']; } // C) optional auth-Block elseif (!empty($_SESSION['auth']['user_id'])) { $userId = (int)$_SESSION['auth']['user_id']; } if ($userId) { $isLoggedIn = 1; } $sessionId = session_id() ?: null; $ipAddress = $_SERVER['REMOTE_ADDR'] ?? null; $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? null; // --------------------------------------------------------------------- // 3. Grobe Auswertung aus dem Report // --------------------------------------------------------------------- $modeRequested = $data['mode_requested'] ?? 'unknown'; $meta = $data['meta'] ?? []; $browserName = null; $browserVersion = null; $osName = null; $osVersion = null; // Byte-Summe aus allen Tests $measuredBytes = 0; if (!empty($data['quick']['size_bytes'])) { $measuredBytes += (int)$data['quick']['size_bytes']; } if (!empty($data['benchmark']['size_bytes'])) { $measuredBytes += (int)$data['benchmark']['size_bytes']; } if (!empty($data['writeverify']['total_bytes'])) { $measuredBytes += (int)$data['writeverify']['total_bytes']; } $capacityStatus = 'unknown'; // noch nicht im Browser ermittelt $volumeLabel = null; $manufacturer = null; $modelName = null; $usbType = null; $filesystem = null; $advCapacityBytes = null; // kompletter Report $testReportJson = $raw ?: json_encode($data, JSON_UNESCAPED_UNICODE); // --------------------------------------------------------------------- // 4. Insert // --------------------------------------------------------------------- /** @var PDO $pdo */ global $pdo; try { $sql = " INSERT INTO web_quicktests ( user_id, is_logged_in, usb_device_id, browser_name, browser_version, os_name, os_version, volume_label, manufacturer, model_name, usb_type, advertised_capacity_bytes, measured_capacity_bytes, capacity_status, filesystem, test_report_json, ip_address, session_id, client_id ) VALUES ( :user_id, :is_logged_in, :usb_device_id, :browser_name, :browser_version, :os_name, :os_version, :volume_label, :manufacturer, :model_name, :usb_type, :advertised_capacity_bytes, :measured_capacity_bytes, :capacity_status, :filesystem, :test_report_json, :ip_address, :session_id, :client_id ) "; $stmt = $pdo->prepare($sql); $stmt->execute([ 'user_id' => $userId, 'is_logged_in' => $isLoggedIn, 'usb_device_id' => null, 'browser_name' => $browserName, 'browser_version' => $browserVersion, 'os_name' => $osName, 'os_version' => $osVersion, 'volume_label' => $volumeLabel, 'manufacturer' => $manufacturer, 'model_name' => $modelName, 'usb_type' => $usbType, 'advertised_capacity_bytes' => $advCapacityBytes, 'measured_capacity_bytes' => $measuredBytes ?: null, 'capacity_status' => $capacityStatus, 'filesystem' => $filesystem, 'test_report_json' => $testReportJson, 'ip_address' => $ipAddress, 'session_id' => $sessionId, 'client_id' => $clientId ]); $id = (int)$pdo->lastInsertId(); // DEBUG-Ausgabe nur für STAGING return [ 'ok' => true, 'id' => $id, 'mode' => $modeRequested, 'measured_bytes' => $measuredBytes ?: null, // Debug-Info 'debug_user_id' => $userId, 'debug_is_logged_in' => $isLoggedIn, 'debug_session_id' => $sessionId, 'debug_client_id' => $clientId, 'debug_session_has_user' => isset($_SESSION['user']), 'debug_user' => $_SESSION['user'] ?? null ]; } catch (Throwable $e) { error_log('[usbcheck] web_quicktests insert failed: ' . $e->getMessage()); return [ 'ok' => false, 'error' => 'DB error', 'debug' => $e->getMessage(), ]; } }