is_string($value) && $value !== '')); } } if (!function_exists('lasuca_save_section_order')) { /** * Persists a member's preferred section ordering. */ function lasuca_save_section_order(mysqli $connection, string $sectionKey, string $memberId, array $sectionOrder): bool { $normalisedKey = lasuca_normalise_panel_key($sectionKey); $safeMemberId = trim($memberId); $sanitisedOrder = array_values(array_filter($sectionOrder, static fn($value): bool => is_string($value) && $value !== '')); $payload = json_encode($sanitisedOrder, JSON_THROW_ON_ERROR); $sql = 'INSERT INTO section_layouts (panel_key, member_id, section_order, updated_at) VALUES (?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE section_order = VALUES(section_order), updated_at = NOW()'; $statement = mysqli_prepare($connection, $sql); if (!$statement) { error_log('lasuca_save_section_order: failed to prepare statement: ' . mysqli_error($connection)); return false; } mysqli_stmt_bind_param($statement, 'sss', $normalisedKey, $safeMemberId, $payload); if (!mysqli_stmt_execute($statement)) { error_log('lasuca_save_section_order: failed to execute statement: ' . mysqli_stmt_error($statement)); mysqli_stmt_close($statement); return false; } $affected = mysqli_stmt_affected_rows($statement); mysqli_stmt_close($statement); return $affected > 0; } } if (!function_exists('lasuca_reset_section_order')) { /** * Removes any persisted ordering for the user/panel. */ function lasuca_reset_section_order(mysqli $connection, string $sectionKey, string $memberId): bool { $normalisedKey = lasuca_normalise_panel_key($sectionKey); $safeMemberId = trim($memberId); $sql = 'DELETE FROM section_layouts WHERE panel_key = ? AND member_id = ?'; $statement = mysqli_prepare($connection, $sql); if (!$statement) { error_log('lasuca_reset_section_order: failed to prepare statement: ' . mysqli_error($connection)); return false; } mysqli_stmt_bind_param($statement, 'ss', $normalisedKey, $safeMemberId); if (!mysqli_stmt_execute($statement)) { error_log('lasuca_reset_section_order: failed to execute statement: ' . mysqli_stmt_error($statement)); mysqli_stmt_close($statement); return false; } $affected = mysqli_stmt_affected_rows($statement); mysqli_stmt_close($statement); return $affected > 0; } } if (!function_exists('lasuca_section_layout_health_check')) { /** * Performs a lightweight connectivity check for diagnostics. */ function lasuca_section_layout_health_check(): bool { $connection = lasuca_get_section_layout_connection(); if (!$connection) { return false; } $result = mysqli_query($connection, 'SELECT 1'); if ($result instanceof mysqli_result) { mysqli_free_result($result); mysqli_close($connection); return true; } mysqli_close($connection); return false; } }