";
flush();
}
}
// Logic
$do_install = $is_cli || ($_SERVER['REQUEST_METHOD'] === 'POST');
if ($do_install) {
if (!$is_cli) {
echo '
Installation Progress
';
} else {
echo "=== Hospital Management System Installer ===\n";
}
try {
// 1. Check Config
if (!file_exists(__DIR__ . '/db/config.php')) {
throw new Exception("Configuration file 'db/config.php' not found.");
}
log_msg("✅ Configuration file found.", $is_cli);
require_once __DIR__ . '/db/config.php';
$db = db();
log_msg("✅ Database connection established.", $is_cli);
// 2. Run init_db.php logic
log_msg("🔄 Initializing base database schema...", $is_cli);
// Use output buffering to capture init_db output
ob_start();
include __DIR__ . '/init_db.php';
$init_output = ob_get_clean();
if ($is_cli) {
echo " >> " . str_replace("\n", "\n >> ", trim($init_output)) . "\n";
} else {
log_msg(">> " . str_replace("\n", "
> ", trim($init_output)), $is_cli);
}
log_msg("✅ Base schema initialized.", $is_cli);
// 3. Run migrations
log_msg("🔄 Applying migrations...", $is_cli);
$db->query("SET FOREIGN_KEY_CHECKS=0;");
$files = glob(__DIR__ . '/db/migrations/*.sql');
sort($files);
$migrated_count = 0;
foreach ($files as $file) {
$filename = basename($file);
$sql_content = file_get_contents($file);
$sql_content = preg_replace('/--.*$/m', '', $sql_content);
$statements = explode(';', $sql_content);
foreach ($statements as $sql) {
$sql = trim($sql);
if (empty($sql)) continue;
try {
// Use query() instead of exec() to handle potential result sets (like SELECT 1)
// and close the cursor explicitly.
$stmt = $db->query($sql);
if ($stmt) {
$stmt->closeCursor();
}
} catch (PDOException $e) {
// Ignore "exists" errors
if (strpos($e->getMessage(), "Duplicate column") === false &&
strpos($e->getMessage(), "already exists") === false &&
strpos($e->getMessage(), "Duplicate key") === false &&
strpos($e->getMessage(), "1062 Duplicate entry") === false &&
strpos($e->getMessage(), "1054 Unknown column") === false &&
strpos($e->getMessage(), "1146 Table") === false &&
strpos($e->getMessage(), "1553 Cannot drop index") === false && strpos($e->getMessage(), "1826 Duplicate FOREIGN KEY") === false && strpos($e->getMessage(), "1828 Cannot drop column") === false) {
log_msg("⚠️ Error in $filename: " . $e->getMessage(), $is_cli);
}
}
}
$migrated_count++;
}
$db->query("SET FOREIGN_KEY_CHECKS=1;");
log_msg("✅ Applied $migrated_count migration files.", $is_cli);
// 4. Verify Admin User
$stmt = $db->prepare("SELECT COUNT(*) FROM users WHERE email = ?");
$stmt->execute(['admin@hospital.com']);
$count = $stmt->fetchColumn();
$stmt->closeCursor(); // Close cursor
if ($count == 0) {
log_msg("⚠️ Admin user missing. Creating...", $is_cli);
$pass = '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'; // admin123
// Ensure role 1 exists (Administrator) - seed roles first if missing
$stmt = $db->query("INSERT IGNORE INTO roles (id, name, slug, permissions) VALUES (1, 'Administrator', 'admin', '*')");
$stmt->closeCursor();
$stmt = $db->query("INSERT INTO users (name, email, password, role_id) VALUES ('System Admin', 'admin@hospital.com', '$pass', 1)");
$stmt->closeCursor();
log_msg("✅ Admin user created.", $is_cli);
} else {
log_msg("✅ Admin user exists.", $is_cli);
}
log_msg("🎉 Installation Completed Successfully!", $is_cli);
if ($is_cli) {
echo "\nLogin Credentials:\n";
echo "Email: admin@hospital.com\n";
echo "Password: admin123\n";
}
} catch (Exception $e) {
log_msg("❌ CRITICAL ERROR: " . $e->getMessage(), $is_cli);
$error = true;
}
if (!$is_cli) {
echo '
'; // End log-output
if (!isset($error)) {
echo '
Setup Complete!
You can now log in to the system.
- Email: admin@hospital.com
- Password: admin123
Go to Dashboard
';
} else {
echo '
Setup Failed
Check logs above.
Retry
';
}
}
} else {
// Web Mode: Show Welcome Screen
?>
Welcome
This script will set up the database tables and default data.
Prerequisites:
- PHP Version: ✅
- Config File: