prepare(" SELECT p.project_name, b.batch_number FROM survey_url_batches b JOIN projects p ON b.project_id = p.project_id WHERE b.project_id = ? AND b.batch_number = ? AND p.client_id = ? "); $stmt->execute([$project_id, $batch_number, $client_id]); $batch = $stmt->fetch(PDO::FETCH_ASSOC); if (!$batch) { exit; } // Get all URLs $stmt = $shopPdo->prepare(" SELECT unique_identifier, rr_proxy_url, client_url, is_sent, sent_at FROM survey_urls WHERE project_id = ? AND batch_number = ? ORDER BY id ASC "); $stmt->execute([$project_id, $batch_number]); $urls = $stmt->fetchAll(PDO::FETCH_ASSOC); // Set headers for CSV download header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="' . $project_id . '_Batch' . $batch_number . '_' . date('Ymd') . '.csv"'); // Open output stream $output = fopen('php://output', 'w'); // Add UTF-8 BOM for Excel fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF)); // Write headers fputcsv($output, [ 'Unique ID', 'Relevant Reflex URL', 'Client Survey URL', 'Status', 'Sent Date' ]); // Write data foreach ($urls as $url) { fputcsv($output, [ $url['unique_identifier'], $url['rr_proxy_url'], $url['client_url'], $url['is_sent'] ? 'Sent' : 'Available', $url['sent_at'] ? date('Y-m-d H:i:s', strtotime($url['sent_at'])) : '' ]); } fclose($output); exit; } catch (Exception $e) { error_log("Export error: " . $e->getMessage()); exit; }