Sindbad~EG File Manager
<?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