query($check_sql); if ($check_result->num_rows > 0) { $member_data = $check_result->fetch_assoc(); if ($member_data['payment_status'] == 1) { $sql = "UPDATE members SET is_approved = 1 WHERE id = $member_id"; if ($conn->query($sql)) { $success = "Member approved successfully!"; } } else { $success = "Cannot approve: Payment not completed yet!"; } } } // Handle delete if (isset($_GET['delete'])) { $member_id = (int)$_GET['delete']; $conn->query("DELETE FROM survey_reviews WHERE member_id = $member_id"); $conn->query("DELETE FROM contact_messages WHERE member_id = $member_id"); $delete_sql = "DELETE FROM members WHERE id = $member_id"; if ($conn->query($delete_sql)) { $success = "Member deleted successfully!"; } else { $success = "Failed to delete member: " . $conn->error; } } // Handle re-verify (resend verification email) if (isset($_GET['reverify'])) { $member_id = (int)$_GET['reverify']; $member_sql = "SELECT * FROM members WHERE id = $member_id AND is_verified = 0"; $member_result = $conn->query($member_sql); if ($member_result->num_rows > 0) { $member_data = $member_result->fetch_assoc(); // Generate new verification token $new_token = bin2hex(random_bytes(32)); $update_token_sql = "UPDATE members SET verification_token = '$new_token' WHERE id = $member_id"; if ($conn->query($update_token_sql)) { // Increment reverify count $conn->query("UPDATE members SET reverify_count = reverify_count + 1 WHERE id = $member_id"); $verification_link = SITE_URL . "/verify-email.php?token=" . $new_token; $to = $member_data['email']; $subject = "Verify Your Email - Paid Survey Hub India"; $message = "Hello " . $member_data['full_name'] . ",\n\n"; $message .= "We are resending this verification email for your Paid Survey Hub India account.\n\n"; $message .= "Please click the link below to verify your email address:\n"; $message .= $verification_link . "\n\n"; $message .= "If you did not create this account, please ignore this email.\n\n"; $message .= "Best regards,\n"; $message .= "Paid Survey Hub India Team"; $headers = "From: noreply@paidsurveyhub.in\r\n"; $headers .= "Reply-To: signupverification@paidsurveyhub.in\r\n"; if (mail($to, $subject, $message, $headers)) { $success = "Verification email resent successfully to " . htmlspecialchars($member_data['email']) . "!"; } else { $success = "Failed to send verification email. Please try again."; } } else { $success = "Failed to generate new verification token."; } } else { $success = "Member not found or already verified."; } } // Build query with filters $where_clauses = ["1=1"]; $search = isset($_GET['search']) ? clean_input($_GET['search']) : ''; if (!empty($search)) { $where_clauses[] = "(full_name LIKE '%$search%' OR email LIKE '%$search%' OR phone LIKE '%$search%')"; } if (isset($_GET['verified']) && $_GET['verified'] !== '') { $verified = (int)$_GET['verified']; $where_clauses[] = "is_verified = $verified"; } if (isset($_GET['approved']) && $_GET['approved'] !== '') { $approved = (int)$_GET['approved']; $where_clauses[] = "is_approved = $approved"; } if (isset($_GET['paid']) && $_GET['paid'] !== '') { $paid = (int)$_GET['paid']; $where_clauses[] = "payment_status = $paid"; } $date_from = isset($_GET['date_from']) ? clean_input($_GET['date_from']) : ''; $date_to = isset($_GET['date_to']) ? clean_input($_GET['date_to']) : ''; if (!empty($date_from)) { $where_clauses[] = "created_at >= '$date_from 00:00:00'"; } if (!empty($date_to)) { $where_clauses[] = "created_at <= '$date_to 23:59:59'"; } $order_by = "created_at"; $order_dir = "DESC"; if (isset($_GET['sort'])) { $allowed_sorts = ['full_name', 'email', 'phone', 'created_at', 'is_verified', 'is_approved', 'payment_status']; if (in_array($_GET['sort'], $allowed_sorts)) { $order_by = $_GET['sort']; } } if (isset($_GET['dir']) && strtoupper($_GET['dir']) === 'ASC') { $order_dir = 'ASC'; } $where_sql = implode(" AND ", $where_clauses); // Count total records for pagination $count_sql = "SELECT COUNT(*) as total FROM members WHERE $where_sql"; $count_result = $conn->query($count_sql); $total_records = $count_result->fetch_assoc()['total']; $per_page = 25; $total_pages = max(1, ceil($total_records / $per_page)); $current_page = isset($_GET['page']) ? max(1, min((int)$_GET['page'], $total_pages)) : 1; $offset = ($current_page - 1) * $per_page; $sql = "SELECT * FROM members WHERE $where_sql ORDER BY $order_by $order_dir LIMIT $offset, $per_page"; $result = $conn->query($sql); // Export functionality (exports ALL matching records) if (isset($_GET['export']) && $_GET['export'] === 'csv') { header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="members_' . date('Y-m-d_H-i-s') . '.csv"'); $export_sql = "SELECT * FROM members WHERE $where_sql ORDER BY $order_by $order_dir"; $export_result = $conn->query($export_sql); $output = fopen('php://output', 'w'); fputcsv($output, ['ID', 'Full Name', 'Email', 'Phone', 'Verified', 'Approved', 'Paid', 'Reverify Count', 'Registered Date']); while ($row = $export_result->fetch_assoc()) { fputcsv($output, [ $row['id'], $row['full_name'], $row['email'], $row['phone'], $row['is_verified'] ? 'Yes' : 'No', $row['is_approved'] ? 'Yes' : 'No', $row['payment_status'] ? 'Yes' : 'No', $row['reverify_count'], date('Y-m-d H:i:s', strtotime($row['created_at'])) ]); } fclose($output); exit(); } // Helper: Build query string preserving all current filters function build_query_params($overrides = []) { $params = []; $keys = ['search', 'verified', 'approved', 'paid', 'sort', 'dir', 'date_from', 'date_to', 'page']; foreach ($keys as $key) { if (isset($overrides[$key])) { if ($overrides[$key] !== '') { $params[$key] = $overrides[$key]; } } elseif (isset($_GET[$key]) && $_GET[$key] !== '') { $params[$key] = $_GET[$key]; } } return http_build_query($params); } $page_title = 'Manage Members'; include '../includes/header.php'; ?>
← Back to Dashboard

Manage Members

Reset

Total: member(s) 1): ?> | Page of

📊 Export CSV
num_rows > 0): ?>
fetch_assoc()): ?>
Name Phone Verified Approved Paid Registered Actions
0): ?>
1): ?>
1): ?> ← Prev ← Prev 1): ?> 1 2): ?> ... ... Next → Next →
'; } } ?>
No members found matching your criteria.