码桶
发现社区成员的开源项目
index.php4.3 KB
<?php
// 1. 防止重复安装:如果根目录已存在 config.php,则禁止访问安装页面
if (file_exists(__DIR__ . '/../config.php')) {
die('系统已安装!如需重新安装,请先删除 config.php 文件。');
}
$error_msg = ''; // 初始化错误信息变量
// 2. 处理表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$db_host = $_POST['db_host'] ?? 'localhost';
$db_name = $_POST['db_name'] ?? '';
$db_user = $_POST['db_user'] ?? '';
$db_pass = $_POST['db_pass'] ?? '';
$admin_user = $_POST['admin_user'] ?? 'admin';
$admin_pass = $_POST['admin_pass'] ?? '';
// 简单的表单验证
if (empty($db_name) || empty($admin_pass)) {
$error_msg = "数据库名和管理员密码不能为空!";
} else {
try {
// 3. 尝试连接数据库 (使用 PDO)
$dsn = "mysql:host=$db_host;dbname=$db_name;charset=utf8mb4";
$pdo = new PDO($dsn, $db_user, $db_pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
// ========== 【关键修复】:读取并执行 install.sql 文件 ==========
$sql_file = __DIR__ . '/install.sql';
if (!file_exists($sql_file)) {
throw new Exception("找不到数据库初始化文件 install.sql!请确保该文件与 index.php 在同一目录下。");
}
$sql_content = file_get_contents($sql_file);
// 按分号拆分 SQL 语句并逐条执行(避免多语句执行的安全限制)
$statements = array_filter(array_map('trim', explode(';', $sql_content)));
foreach ($statements as $statement) {
if (!empty($statement)) {
$pdo->exec($statement);
}
}
// ============================================================
// 5. 创建管理员账号 (此时 users 表已存在,可以正常插入)
$hashed_password = password_hash($admin_pass, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("INSERT INTO users (username, password, role) VALUES (:user, :pass, 'admin')");
$stmt->execute([':user' => $admin_user, ':pass' => $hashed_password]);
// 6. 生成配置文件
$config_content = "<?php\n";
$config_content .= "define('DB_HOST', '$db_host');\n";
$config_content .= "define('DB_NAME', '$db_name');\n";
$config_content .= "define('DB_USER', '$db_user');\n";
$config_content .= "define('DB_PASS', '$db_pass');\n";
// 优化 SITE_URL 获取方式,防止端口号丢失或路径错误
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http";
$site_url = $protocol . "://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']);
$config_content .= "define('SITE_URL', '" . rtrim($site_url, '/') . "');\n";
file_put_contents(__DIR__ . '/../config.php', $config_content);
// 7. 安装成功,重定向到首页或后台
header('Location: ../index.php?msg=install_success');
exit;
} catch (PDOException | Exception $e) {
$error_msg = "数据库连接或配置失败:" . $e->getMessage();
}
}
}
?>
<!-- 8. 前端 HTML 表单展示 -->
<!DOCTYPE html>
<html>
<head><title>博客系统一键安装</title></head>
<body style="font-family:sans-serif; max-width:600px; margin:50px auto;">
<h2>欢迎使用一键安装向导</h2>
<?php if (!empty($error_msg)): ?>
<p style="color:red;"><?php echo htmlspecialchars($error_msg); ?></p>
<?php endif; ?>
<form method="POST">
<label>数据库主机:<input type="text" name="db_host" value="localhost" required></label><br><br>
<label>数据库名称:<input type="text" name="db_name" required></label><br><br>
<label>数据库用户:<input type="text" name="db_user" required></label><br><br>
<label>数据库密码:<input type="password" name="db_pass"></label><br><br>
<hr>
<label>管理员账号:<input type="text" name="admin_user" value="admin" required></label><br><br>
<label>管理员密码:<input type="password" name="admin_pass" required></label><br><br>
<button type="submit">开始安装</button>
</form>
</body>
</html>