getMessage()); } // --- Migration Setup --- $migrationsTable = 'migrations'; $migrationsDir = __DIR__ . '/db/migrations/'; // Create migrations table if it doesn't exist try { $pdo->exec("CREATE TABLE IF NOT EXISTS `$migrationsTable` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `migration` VARCHAR(255) NOT NULL, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); } catch (PDOException $e) { die("✘ Error creating migrations table: " . $e->getMessage()); } // Get applied migrations $appliedMigrations = $pdo->query("SELECT `migration` FROM `$migrationsTable`")->fetchAll(PDO::FETCH_COLUMN); echo "Processing Migrations...\n"; // --- Run Migrations --- $migrationFiles = glob($migrationsDir . '*.sql'); sort($migrationFiles); $allGood = true; foreach ($migrationFiles as $file) { $migrationName = basename($file); if (in_array($migrationName, $appliedMigrations)) { echo "[SKIPPED] Migration $migrationName has already been applied.\n"; continue; } echo "Applying migration: $migrationName... "; $sql = file_get_contents($file); try { $pdo->exec($sql); // Mark as applied $stmt = $pdo->prepare("INSERT INTO `$migrationsTable` (`migration`) VALUES (?)"); $stmt->execute([$migrationName]); echo "✔ Done.\n"; } catch (PDOException $e) { $errorMessage = $e->getMessage(); // Check for non-critical errors to ignore and continue $isDuplicateColumn = strpos($errorMessage, 'Duplicate column name') !== false; $isDuplicateKey = strpos($errorMessage, 'Duplicate entry') !== false; $isColumnNotFound = strpos($errorMessage, "Unknown column") !== false; $isCantDropField = strpos($errorMessage, "Can't DROP COLUMN") !== false; if ($isDuplicateColumn || $isDuplicateKey || $isColumnNotFound || $isCantDropField) { $reason = "Already applied"; if ($isDuplicateColumn) $reason = "Duplicate Column"; if ($isDuplicateKey) $reason = "Duplicate Entry"; if ($isColumnNotFound) $reason = "Column Not Found (will be created later)"; if ($isCantDropField) $reason = "Column already dropped"; echo "✔ Skipped ($reason - marking as run).\n"; // Mark as applied even if it failed with a recoverable error $stmt = $pdo->prepare("INSERT INTO `$migrationsTable` (`migration`) VALUES (?)"); $stmt->execute([$migrationName]); } else { echo "✘ Error applying $migrationName: " . $e->getMessage() . "\n"; $allGood = false; // We will now continue instead of breaking // break; } } } if ($allGood) { echo "\n🎉 All migrations have been applied successfully!\n"; } else { echo "\nAn error occurred. Not all migrations could be applied. Please review the errors above.\n"; } ?>