码桶

发现社区成员的开源项目

main
xgkblog/install/index.php
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>