setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 1. 创建 users 表 $sql = " CREATE TABLE IF NOT EXISTS `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL COMMENT '姓名', `email` varchar(255) NOT NULL COMMENT '邮箱', `email_verified_at` timestamp NULL DEFAULT NULL, `password` varchar(255) NOT NULL COMMENT '密码', `remember_token` varchar(100) DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `users_email_unique` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "; $pdo->exec($sql); $messages[] = '✅ 用户表 users 创建/已存在'; // 2. 检查 patients 表是否存在 $stmt = $pdo->query("SHOW TABLES LIKE 'patients'"); $patientsTableExists = $stmt->rowCount() > 0; if ($patientsTableExists) { // 表已存在,检查是否有 user_id 字段 $stmt = $pdo->query("SHOW COLUMNS FROM `patients` LIKE 'user_id'"); $hasUserId = $stmt->rowCount() > 0; if (!$hasUserId) { // 检查是否有数据 $countStmt = $pdo->query("SELECT COUNT(*) FROM `patients`"); $count = $countStmt->fetchColumn(); if ($count > 0) { // 有数据,需要先创建一个默认用户 // 检查是否已有用户 $userCountStmt = $pdo->query("SELECT COUNT(*) FROM `users`"); $userCount = $userCountStmt->fetchColumn(); if ($userCount == 0) { // 创建默认管理员用户 $defaultPassword = password_hash('admin123', PASSWORD_BCRYPT); $pdo->exec("INSERT INTO `users` (`name`, `email`, `password`, `created_at`, `updated_at`) VALUES ('管理员', 'admin@example.com', '{$defaultPassword}', NOW(), NOW())"); $messages[] = '✅ 已创建默认用户: admin@example.com (密码: admin123)'; } // 获取第一个用户的 ID $firstUserStmt = $pdo->query("SELECT id FROM `users` ORDER BY id ASC LIMIT 1"); $firstUserId = $firstUserStmt->fetchColumn(); // 添加 user_id 字段(允许 NULL) $pdo->exec("ALTER TABLE `patients` ADD COLUMN `user_id` bigint(20) unsigned NULL AFTER `id`"); $messages[] = '✅ 已添加 user_id 字段到 patients 表'; // 将现有数据关联到第一个用户 $pdo->exec("UPDATE `patients` SET `user_id` = {$firstUserId} WHERE `user_id` IS NULL"); $messages[] = "✅ 已将现有 {$count} 条患者数据关联到用户 ID: {$firstUserId}"; // 修改字段为 NOT NULL $pdo->exec("ALTER TABLE `patients` MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL"); // 添加外键约束 try { $pdo->exec("ALTER TABLE `patients` ADD KEY `patients_user_id_foreign` (`user_id`)"); $pdo->exec("ALTER TABLE `patients` ADD CONSTRAINT `patients_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE"); $messages[] = '✅ 已添加外键约束'; } catch (PDOException $e) { // 外键可能已存在,忽略 $messages[] = '⚠️ 外键约束已存在或无法添加'; } } else { // 没有数据,直接添加字段和约束 $pdo->exec("ALTER TABLE `patients` ADD COLUMN `user_id` bigint(20) unsigned NOT NULL AFTER `id`"); try { $pdo->exec("ALTER TABLE `patients` ADD KEY `patients_user_id_foreign` (`user_id`)"); $pdo->exec("ALTER TABLE `patients` ADD CONSTRAINT `patients_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE"); } catch (PDOException $e) { // 忽略 } $messages[] = '✅ 已添加 user_id 字段到 patients 表'; } } else { $messages[] = '✅ patients 表已有 user_id 字段'; } } else { // 创建新的 patients 表(包含 user_id) $sql = " CREATE TABLE `patients` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL COMMENT '所属用户', `name` varchar(255) NOT NULL COMMENT '姓名', `gender` varchar(255) NOT NULL COMMENT '性别', `age` int(11) NOT NULL COMMENT '年龄', `diagnosis` varchar(255) NOT NULL COMMENT '出院诊断', `discharge_date` date NOT NULL COMMENT '转诊时间', `address` varchar(255) DEFAULT NULL COMMENT '户籍地址', `phone` varchar(255) DEFAULT NULL COMMENT '联系方式', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `follow_up_count` int(11) NOT NULL DEFAULT 0 COMMENT '已随访次数', `last_follow_up_date` date DEFAULT NULL COMMENT '上次随访日期', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), KEY `patients_user_id_foreign` (`user_id`), CONSTRAINT `patients_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "; $pdo->exec($sql); $messages[] = '✅ 患者表 patients 创建成功'; } // 3. 创建 sessions 表 $sql = " CREATE TABLE IF NOT EXISTS `sessions` ( `id` varchar(255) NOT NULL, `user_id` bigint(20) unsigned DEFAULT NULL, `ip_address` varchar(45) DEFAULT NULL, `user_agent` text DEFAULT NULL, `payload` longtext NOT NULL, `last_activity` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `sessions_user_id_index` (`user_id`), KEY `sessions_last_activity_index` (`last_activity`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "; $pdo->exec($sql); $messages[] = '✅ 会话表 sessions 创建/已存在'; // 显示表结构 $stmt = $pdo->query("SHOW TABLES"); $tables = $stmt->fetchAll(PDO::FETCH_COLUMN); $messages[] = '📋 当前数据库表: ' . implode(', ', $tables); } catch (PDOException $e) { $error = '❌ 数据库操作失败: ' . $e->getMessage(); } ?>