Sindbad~EG File Manager

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

<?php
require_once 'config/config.php';

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

echo "<h2>Fix 'member_id' UNIQUE Index Issue</h2>";
echo "<hr>";

echo "<h3>Problem Identified:</h3>";
echo "<p>There's a UNIQUE index named <strong>'member_id'</strong> on the <strong>'membership_id'</strong> column.</p>";
echo "<p>This is causing the error: <code>Duplicate entry '' for key 'member_id'</code></p>";
echo "<p>When trying to insert members with empty membership_id values, it violates the UNIQUE constraint.</p>";

echo "<h3>Solution:</h3>";
echo "<p>We need to DROP the UNIQUE index named 'member_id' and optionally add a regular (non-unique) index for performance.</p>";

if (!isset($_POST['fix_now'])) {
    echo "<form method='post' style='margin: 20px 0;'>";
    echo "<button type='submit' name='fix_now' style='padding: 15px 30px; background: #dc2626; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; font-weight: bold;'>DROP UNIQUE Index 'member_id'</button>";
    echo "</form>";
} else {
    echo "<h3>Applying Fix...</h3>";
    
    try {
        $db->beginTransaction();
        
        // Check if the index exists
        echo "<p>Checking for UNIQUE index 'member_id'...</p>";
        $stmt = $db->query("SHOW INDEX FROM members WHERE Key_name = 'member_id'");
        $index = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if ($index) {
            echo "<p style='color: orange;'>Found UNIQUE index: {$index['Key_name']} on column: {$index['Column_name']}</p>";
            
            // Drop the UNIQUE index
            echo "<p>Dropping UNIQUE index 'member_id'...</p>";
            $db->exec("ALTER TABLE members DROP INDEX `member_id`");
            echo "<p style='color: green;'>✓ Successfully dropped UNIQUE index 'member_id'</p>";
            
            // Check if there's already a regular index on membership_id
            $stmt = $db->query("SHOW INDEX FROM members WHERE Column_name = 'membership_id' AND Key_name LIKE 'idx_%'");
            $regularIndex = $stmt->fetch();
            
            if (!$regularIndex) {
                echo "<p>Adding regular (non-unique) index for performance...</p>";
                $db->exec("ALTER TABLE members ADD INDEX idx_membership_id (membership_id)");
                echo "<p style='color: green;'>✓ Added regular index 'idx_membership_id'</p>";
            } else {
                echo "<p style='color: green;'>✓ Regular index already exists: {$regularIndex['Key_name']}</p>";
            }
            
        } else {
            echo "<p style='color: green;'>✓ UNIQUE index 'member_id' not found (already removed or doesn't exist)</p>";
        }
        
        // Now check for and fix any empty membership_id values
        echo "<p>Checking for empty membership_id values...</p>";
        $stmt = $db->query("SELECT COUNT(*) as count FROM members WHERE membership_id = '' OR membership_id IS NULL");
        $result = $stmt->fetch();
        
        if ($result['count'] > 0) {
            echo "<p style='color: orange;'>Found {$result['count']} members with empty membership_id. Generating values...</p>";
            
            // Function to generate membership ID
            function generateMembershipId() {
                return 'MEM' . date('Y') . str_pad(mt_rand(1, 999999), 6, '0', STR_PAD_LEFT);
            }
            
            $stmt = $db->query("SELECT id FROM members WHERE membership_id = '' OR membership_id IS NULL");
            $emptyMembers = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            $updateStmt = $db->prepare("UPDATE members SET membership_id = :membership_id WHERE id = :id");
            
            foreach ($emptyMembers as $member) {
                // Generate unique membership_id
                do {
                    $membershipId = generateMembershipId();
                    $checkStmt = $db->prepare("SELECT id FROM members WHERE membership_id = :membership_id");
                    $checkStmt->execute(['membership_id' => $membershipId]);
                } while ($checkStmt->fetch());
                
                $updateStmt->execute([
                    'membership_id' => $membershipId,
                    'id' => $member['id']
                ]);
                
                echo "<p style='font-size: 12px;'>Updated member ID {$member['id']} with membership_id: $membershipId</p>";
            }
            
            echo "<p style='color: green;'>✓ Generated membership_id for {$result['count']} members</p>";
        } else {
            echo "<p style='color: green;'>✓ No empty membership_id values found</p>";
        }
        
        // Check for duplicates
        echo "<p>Checking for duplicate membership_id values...</p>";
        $stmt = $db->query("
            SELECT membership_id, COUNT(*) as count, GROUP_CONCAT(id) as ids
            FROM members 
            WHERE membership_id IS NOT NULL AND membership_id != ''
            GROUP BY membership_id 
            HAVING count > 1
        ");
        $duplicates = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        if (count($duplicates) > 0) {
            echo "<p style='color: orange;'>Found " . count($duplicates) . " duplicate membership_id values. Fixing...</p>";
            
            foreach ($duplicates as $dup) {
                $ids = explode(',', $dup['ids']);
                // Keep first one, regenerate for the rest
                array_shift($ids);
                
                $updateStmt = $db->prepare("UPDATE members SET membership_id = :membership_id WHERE id = :id");
                
                foreach ($ids as $memberId) {
                    // Generate unique membership_id
                    do {
                        $membershipId = generateMembershipId();
                        $checkStmt = $db->prepare("SELECT id FROM members WHERE membership_id = :membership_id");
                        $checkStmt->execute(['membership_id' => $membershipId]);
                    } while ($checkStmt->fetch());
                    
                    $updateStmt->execute([
                        'membership_id' => $membershipId,
                        'id' => $memberId
                    ]);
                    
                    echo "<p style='font-size: 12px;'>Fixed duplicate for member ID $memberId with new membership_id: $membershipId</p>";
                }
            }
            
            echo "<p style='color: green;'>✓ Fixed " . count($duplicates) . " duplicate membership_id values</p>";
        } else {
            echo "<p style='color: green;'>✓ No duplicate membership_id values found</p>";
        }
        
        $db->commit();
        
        echo "<hr>";
        echo "<h3 style='color: green;'>✓ ALL FIXES APPLIED SUCCESSFULLY!</h3>";
        echo "<p><strong>You can now add members without the duplicate entry error.</strong></p>";
        echo "<p><a href='modules/membership/add.php' style='padding: 10px 20px; background: #1E40AF; color: white; text-decoration: none; border-radius: 5px; display: inline-block; margin: 10px 0;'>Go to Add Member Page</a></p>";
        
    } catch (PDOException $e) {
        $db->rollBack();
        echo "<p style='color: red;'><strong>Error:</strong> " . $e->getMessage() . "</p>";
        echo "<p>Transaction rolled back. No changes were made.</p>";
    }
}

echo "<hr>";
echo "<h3>What was done:</h3>";
echo "<ul>";
echo "<li>Removed UNIQUE constraint from 'membership_id' column</li>";
echo "<li>Generated unique membership_id for any empty values</li>";
echo "<li>Fixed any duplicate membership_id values</li>";
echo "<li>Added regular index for performance (if needed)</li>";
echo "</ul>";

echo "<p><a href='check_member_id_column.php'>← Back to Diagnostic Page</a></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; }
    code {
        background: #fee;
        padding: 2px 6px;
        border-radius: 3px;
        color: #c00;
    }
</style>

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