Sindbad~EG File Manager

Current Path : /home/copmadinaarea/thecopmadinaarea.org/portal/
Upload File :
Current File : /home/copmadinaarea/thecopmadinaarea.org/portal/FIX_MEMBER_DUPLICATE_ERROR.php

<?php
/**
 * Fix Member Duplicate Entry Error
 * This script fixes the "Duplicate entry '' for key 'member_id'" error
 */

require_once 'config/config.php';

$db = Database::getInstance()->getConnection();
$messages = [];

echo "<h2>Fixing Member Duplicate Entry Error</h2>";
echo "<hr>";

try {
    // Step 1: Check if 'member_id' column exists (shouldn't exist)
    echo "<h3>Step 1: Checking for 'member_id' column...</h3>";
    $stmt = $db->query("SHOW COLUMNS FROM members LIKE 'member_id'");
    if ($stmt->fetch()) {
        echo "<p style='color: orange;'>Found 'member_id' column (this shouldn't exist). Checking if it can be removed...</p>";
        
        // Check if it has a unique constraint
        $stmt = $db->query("SHOW INDEX FROM members WHERE Column_name = 'member_id'");
        $indexes = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        foreach ($indexes as $index) {
            if ($index['Non_unique'] == 0) {  // Unique index found
                $keyName = $index['Key_name'];
                echo "<p>Dropping unique key: $keyName</p>";
                $db->exec("ALTER TABLE members DROP INDEX `$keyName`");
                $messages[] = "Dropped unique index '$keyName' on member_id column";
            }
        }
        
        // Now try to drop the column
        echo "<p>Attempting to drop 'member_id' column...</p>";
        $db->exec("ALTER TABLE members DROP COLUMN member_id");
        $messages[] = "Removed 'member_id' column";
        echo "<p style='color: green;'>✓ Successfully removed 'member_id' column</p>";
    } else {
        echo "<p style='color: green;'>✓ No 'member_id' column found (good)</p>";
    }
    
    // Step 2: Fix empty membershipcard_id values
    echo "<h3>Step 2: Checking for empty membershipcard_id values...</h3>";
    $stmt = $db->query("SELECT id, first_name, last_name FROM members WHERE membershipcard_id = '' OR membershipcard_id IS NULL");
    $emptyMembers = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (count($emptyMembers) > 0) {
        echo "<p style='color: orange;'>Found " . count($emptyMembers) . " members with empty membershipcard_id. Generating new IDs...</p>";
        
        require_once 'classes/MembershipCard.php';
        $membershipCard = new MembershipCard();
        
        foreach ($emptyMembers as $member) {
            // Generate unique card number
            do {
                $cardNumber = $membershipCard->generateCardNumber();
                $checkStmt = $db->prepare("SELECT id FROM members WHERE membershipcard_id = :card_number");
                $checkStmt->execute(['card_number' => $cardNumber]);
            } while ($checkStmt->fetch());
            
            // Update member with new card number
            $updateStmt = $db->prepare("UPDATE members SET membershipcard_id = :card_number WHERE id = :id");
            $updateStmt->execute([
                'card_number' => $cardNumber,
                'id' => $member['id']
            ]);
            
            echo "<p>Updated member #{$member['id']} ({$member['first_name']} {$member['last_name']}) with card number: $cardNumber</p>";
            $messages[] = "Generated membershipcard_id for member #{$member['id']}";
        }
        echo "<p style='color: green;'>✓ Fixed " . count($emptyMembers) . " empty membershipcard_id values</p>";
    } else {
        echo "<p style='color: green;'>✓ No empty membershipcard_id values found</p>";
    }
    
    // Step 3: Check for and fix duplicate membershipcard_id values
    echo "<h3>Step 3: Checking for duplicate membershipcard_id values...</h3>";
    $stmt = $db->query("
        SELECT membershipcard_id, GROUP_CONCAT(id) as member_ids, COUNT(*) as count 
        FROM members 
        GROUP BY membershipcard_id 
        HAVING count > 1
    ");
    $duplicates = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (count($duplicates) > 0) {
        echo "<p style='color: orange;'>Found " . count($duplicates) . " duplicate membershipcard_id values. Fixing...</p>";
        
        require_once 'classes/MembershipCard.php';
        $membershipCard = new MembershipCard();
        
        foreach ($duplicates as $dup) {
            $memberIds = explode(',', $dup['member_ids']);
            // Keep the first ID, regenerate for the rest
            array_shift($memberIds); // Remove first ID (keep it unchanged)
            
            foreach ($memberIds as $memberId) {
                // Generate unique card number
                do {
                    $cardNumber = $membershipCard->generateCardNumber();
                    $checkStmt = $db->prepare("SELECT id FROM members WHERE membershipcard_id = :card_number");
                    $checkStmt->execute(['card_number' => $cardNumber]);
                } while ($checkStmt->fetch());
                
                // Update member with new card number
                $updateStmt = $db->prepare("UPDATE members SET membershipcard_id = :card_number WHERE id = :id");
                $updateStmt->execute([
                    'card_number' => $cardNumber,
                    'id' => $memberId
                ]);
                
                echo "<p>Updated member #$memberId with new card number: $cardNumber</p>";
                $messages[] = "Fixed duplicate membershipcard_id for member #$memberId";
            }
        }
        echo "<p style='color: green;'>✓ Fixed " . count($duplicates) . " duplicate membershipcard_id values</p>";
    } else {
        echo "<p style='color: green;'>✓ No duplicate membershipcard_id values found</p>";
    }
    
    // Step 4: Verify the fix
    echo "<h3>Step 4: Verifying the fix...</h3>";
    
    // Check for empty values again
    $stmt = $db->query("SELECT COUNT(*) as count FROM members WHERE membershipcard_id = '' OR membershipcard_id IS NULL");
    $emptyCount = $stmt->fetch()['count'];
    
    // Check for duplicates again
    $stmt = $db->query("
        SELECT COUNT(*) as count 
        FROM (
            SELECT membershipcard_id, COUNT(*) as cnt 
            FROM members 
            GROUP BY membershipcard_id 
            HAVING cnt > 1
        ) as dups
    ");
    $dupCount = $stmt->fetch()['count'];
    
    if ($emptyCount == 0 && $dupCount == 0) {
        echo "<p style='color: green; font-size: 18px; font-weight: bold;'>✓ All issues fixed! You can now add members without errors.</p>";
    } else {
        if ($emptyCount > 0) {
            echo "<p style='color: red;'>⚠ Still found $emptyCount empty membershipcard_id values</p>";
        }
        if ($dupCount > 0) {
            echo "<p style='color: red;'>⚠ Still found $dupCount duplicate membershipcard_id values</p>";
        }
    }
    
    // Summary
    echo "<hr>";
    echo "<h3>Summary of Actions:</h3>";
    if (count($messages) > 0) {
        echo "<ul>";
        foreach ($messages as $msg) {
            echo "<li>$msg</li>";
        }
        echo "</ul>";
    } else {
        echo "<p>No actions needed - database was already clean!</p>";
    }
    
    echo "<hr>";
    echo "<p><a href='modules/membership/add.php'>← Go to Add Member Page</a></p>";
    echo "<p><a href='check_members_table.php'>→ View Table Structure</a></p>";
    
} catch (PDOException $e) {
    echo "<p style='color: red;'><strong>Database Error:</strong> " . $e->getMessage() . "</p>";
    echo "<p>Please check your database connection and try again.</p>";
} catch (Exception $e) {
    echo "<p style='color: red;'><strong>Error:</strong> " . $e->getMessage() . "</p>";
}
?>

<style>
    body {
        font-family: Arial, sans-serif;
        max-width: 900px;
        margin: 20px auto;
        padding: 20px;
        background: #f5f5f5;
    }
    h2 { color: #1E40AF; }
    h3 { color: #333; margin-top: 20px; }
    p { margin: 10px 0; }
    ul { background: white; padding: 20px; border-radius: 5px; }
    li { margin: 5px 0; }
    a {
        display: inline-block;
        padding: 10px 20px;
        background: linear-gradient(135deg, #1E40AF 0%, #9333EA 100%);
        color: white;
        text-decoration: none;
        border-radius: 5px;
        margin: 5px;
    }
    a:hover {
        opacity: 0.9;
    }
</style>

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists