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