(列名 => ALTER 语句) // 实际表名由调用方传入(兼容大小写迁移场景);仅添加缺失列 function mnbt_upgrade_columns($actual_config, $actual_zj, $actual_bt, $actual_dplan, $actual_duser) { return array( // V1.81 修复字段 $actual_config => array( 'mailhost' => "ALTER TABLE `{$actual_config}` ADD `mailhost` VARCHAR(50) NULL DEFAULT NULL", 'mailuser' => "ALTER TABLE `{$actual_config}` ADD `mailuser` VARCHAR(50) NULL DEFAULT NULL", 'mailpassword' => "ALTER TABLE `{$actual_config}` ADD `mailpassword` VARCHAR(50) NULL DEFAULT NULL", 'mailport' => "ALTER TABLE `{$actual_config}` ADD `mailport` VARCHAR(20) NOT NULL DEFAULT '465'", 'ymjkkg' => "ALTER TABLE `{$actual_config}` ADD `ymjkkg` VARCHAR(20) NOT NULL DEFAULT 'false'", 'mtyxfskg' => "ALTER TABLE `{$actual_config}` ADD `mtyxfskg` VARCHAR(20) NOT NULL DEFAULT 'false'", 'ymjktsyz' => "ALTER TABLE `{$actual_config}` ADD `ymjktsyz` VARCHAR(20) NOT NULL DEFAULT '7'", 'wjjkkg' => "ALTER TABLE `{$actual_config}` ADD `wjjkkg` VARCHAR(20) NOT NULL DEFAULT 'false'", 'mtwjfskg' => "ALTER TABLE `{$actual_config}` ADD `mtwjfskg` VARCHAR(50) NOT NULL DEFAULT 'false'", 'wjjktsyz' => "ALTER TABLE `{$actual_config}` ADD `wjjktsyz` VARCHAR(20) NOT NULL DEFAULT '7'", 'optionzc' => "ALTER TABLE `{$actual_config}` ADD `optionzc` VARCHAR(20) NOT NULL DEFAULT 'stop'", 'zjyxbd' => "ALTER TABLE `{$actual_config}` ADD `zjyxbd` VARCHAR(20) NOT NULL DEFAULT 'true'", 'wjsckg' => "ALTER TABLE `{$actual_config}` ADD `wjsckg` VARCHAR(20) NOT NULL DEFAULT 'false'", 'wjsccnr' => "ALTER TABLE `{$actual_config}` ADD `wjsccnr` TEXT NULL DEFAULT NULL", 'wjsckgqbfx' => "ALTER TABLE `{$actual_config}` ADD `wjsckgqbfx` VARCHAR(10) NOT NULL DEFAULT 'true'", 'wjscml' => "ALTER TABLE `{$actual_config}` ADD `wjscml` VARCHAR(500) NOT NULL DEFAULT '/www/wwwroot'", 'wjstqml' => "ALTER TABLE `{$actual_config}` ADD `wjstqml` TEXT NULL DEFAULT NULL", 'wjstqhz' => "ALTER TABLE `{$actual_config}` ADD `wjstqhz` TEXT NULL DEFAULT NULL", 'wjscdzmax' => "ALTER TABLE `{$actual_config}` ADD `wjscdzmax` INT(11) NOT NULL DEFAULT 5242880", 'wjscdhmax' => "ALTER TABLE `{$actual_config}` ADD `wjscdhmax` INT(11) NOT NULL DEFAULT 1000", 'wjscqzcs' => "ALTER TABLE `{$actual_config}` ADD `wjscqzcs` VARCHAR(50) NOT NULL DEFAULT '0 3 * * *'", 'wjscqzcskg' => "ALTER TABLE `{$actual_config}` ADD `wjscqzcskg` VARCHAR(20) NOT NULL DEFAULT 'true'", 'pay_methods' => "ALTER TABLE `{$actual_config}` ADD `pay_methods` TEXT NOT NULL DEFAULT ''", // V1.84 独立主页系统(与 update/update_v184_home.sql 保持一致) 'home_enable' => "ALTER TABLE `{$actual_config}` ADD `home_enable` varchar(10) NOT NULL DEFAULT 'true'", 'home_theme' => "ALTER TABLE `{$actual_config}` ADD `home_theme` varchar(50) NOT NULL DEFAULT ''", 'home_theme_settings' => "ALTER TABLE `{$actual_config}` ADD `home_theme_settings` text NOT NULL", 'home_title' => "ALTER TABLE `{$actual_config}` ADD `home_title` text NOT NULL", 'home_hero' => "ALTER TABLE `{$actual_config}` ADD `home_hero` text NOT NULL", 'home_primary' => "ALTER TABLE `{$actual_config}` ADD `home_primary` varchar(10) NOT NULL DEFAULT '#4f46e5'", 'home_logo' => "ALTER TABLE `{$actual_config}` ADD `home_logo` text NOT NULL", 'home_favicon' => "ALTER TABLE `{$actual_config}` ADD `home_favicon` text NOT NULL", 'home_footer' => "ALTER TABLE `{$actual_config}` ADD `home_footer` text NOT NULL", 'home_show_notice' => "ALTER TABLE `{$actual_config}` ADD `home_show_notice` varchar(10) NOT NULL DEFAULT 'true'", 'home_show_plans' => "ALTER TABLE `{$actual_config}` ADD `home_show_plans` varchar(10) NOT NULL DEFAULT 'true'", // V1.85 对外 API 协议模式开关(0=1.83+ 严格,1=1.81 兼容) 'api_compat' => "ALTER TABLE `{$actual_config}` ADD `api_compat` varchar(10) NOT NULL DEFAULT '0'", ), $actual_zj => array( 'backup' => "ALTER TABLE `{$actual_zj}` ADD `backup` VARCHAR(50) NOT NULL DEFAULT '{\"max\":\"3\",\"dq\":0}'", 'mailuser' => "ALTER TABLE `{$actual_zj}` ADD `mailuser` VARCHAR(50) NULL DEFAULT NULL", ), $actual_bt => array( 'ftpdz' => "ALTER TABLE `{$actual_bt}` ADD `ftpdz` VARCHAR(50) NOT NULL DEFAULT 'false'", 'mrbts_php' => "ALTER TABLE `{$actual_bt}` ADD `mrbts_php` VARCHAR(10) NOT NULL DEFAULT ''", ), // V1.83.1 Docker 磁盘配额字段(表已在 repair_tables.sql 中补齐) $actual_dplan => array( 'disk_max' => "ALTER TABLE `{$actual_dplan}` ADD `disk_max` varchar(20) NOT NULL DEFAULT '0' COMMENT '磁盘配额 MB 上限(0=不限制)'", 'proxy_max' => "ALTER TABLE `{$actual_dplan}` ADD `proxy_max` varchar(20) NOT NULL DEFAULT '0' COMMENT '反向代理数量上限(0=不限制)'", ), $actual_duser => array( 'disk_usage' => "ALTER TABLE `{$actual_duser}` ADD `disk_usage` bigint(20) NOT NULL DEFAULT '0' COMMENT '最近磁盘用量(字节)'", 'disk_usage_at' => "ALTER TABLE `{$actual_duser}` ADD `disk_usage_at` varchar(50) DEFAULT NULL COMMENT '磁盘用量采集时间'", ), ); } if (file_exists('install.lock')) exit(Res(1, '已安装', ['vs' => $vs,'is_install'=>true], 1)); function send_post() { //如果需要进行离线安装请将$ins_tall=true;改为$ins_tall=false; //注意:离线安装不支持进行在线更新! //如果无法安装可尝试进行离线安装! try { $ins_tall = true; if (!$ins_tall) return array('code' => 1, 'authcode' => '您安装时使用的为离线安装!'); global $mn_conf; if (empty($mn_conf['url']) || empty($mn_conf['aet']) || empty($mn_conf['install_wj'])) { return array('code' => 1, 'authcode' => ''); } include("../MPHX/BL.php"); $url = $mn_conf['aet'] . "://" . $mn_conf['url'] . ":" . $mn_conf['port'] . "/" . $mn_conf['install_wj'] . "/coder.php"; $post_data = array( 'url' => $_SERVER['HTTP_HOST'], 'bb' => $WEBQB, ); $postdata = http_build_query($post_data); $options = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type:application/x-www-form-urlencoded', 'content' => $postdata, 'timeout' => 5 // 缩短超时 ) ); $context = stream_context_create($options); $result = @file_get_contents($url, false, $context); if ($result === false) return array('code' => 1, 'authcode' => ''); $decoded = json_decode($result, true); if (!is_array($decoded)) return array('code' => 1, 'authcode' => ''); return $decoded; } catch (Exception $e) { return array('code' => 1, 'authcode' => ''); } } switch ($action) { case 'index': echo Res(1, '基础信息返回', ['vs' => $vs]); break; case 'system': echo Res(1, '系统基础环境监测', [ 'vs' => [ 'info' => PHP_VERSION, 'is_vs_install' => version_compare(PHP_VERSION, '7.4.0', '>=') ], 'curl_exec' => function_exists('curl_exec'), 'mn_link' => ((int)send_post()['code'] ?? 0) === 1, ]); break; case 'database_info_wire': require_once './db.class.php'; $db_host = isset($_POST['db_host']) ? $_POST['db_host'] : NULL; $db_port = isset($_POST['db_port']) ? $_POST['db_port'] : NULL; $db_user = isset($_POST['db_user']) ? $_POST['db_user'] : NULL; $db_pwd = isset($_POST['db_pwd']) ? $_POST['db_pwd'] : NULL; $db_name = isset($_POST['db_name']) ? $_POST['db_name'] : NULL; if ($db_host == null || $db_port == null || $db_user == null || $db_pwd == null || $db_name == null) { echo '
保存错误,请确保每项都不为空
<< 返回上一页
'; exit; } $result = send_post(); if (is_array($result) && $result['code'] == '0') { exit(Res(0,$result['msg'])); } else { $config = " '{$db_host}', //数据库服务器 'port' => {$db_port}, //数据库端口 'user' => '{$db_user}', //数据库用户名 'pwd' => '{$db_pwd}', //数据库密码 'dbname' => '{$db_name}', //数据库名 ); ?>"; $mnAuthcode=""; } if(!$con=DB::connect($db_host,$db_user,$db_pwd,$db_name,$db_port)){ $enumMsg=[ 2002=>'连接数据库失败,数据库地址填写错误!', 1045=>'连接数据库失败,数据库用户名或密码填写错误!', 1049=>'连接数据库失败,数据库名不存在!', ]; exit(Res(0,$enumMsg[DB::connect_errno()]??'['.DB::connect_errno().']'.DB::connect_error())); }else{ $cfgw = file_put_contents('../config.php', $config); $sqw = file_put_contents('../MPHX/SQ.php', $mnAuthcode); if ($cfgw !== false && $sqw !== false) { // 用 SHOW TABLES 获取全部表名,PHP 端忽略大小写比较 $all_tables_result = DB::query("SHOW TABLES"); $found = array(); $in_table = false; if ($all_tables_result) { while ($row = DB::fetch($all_tables_result)) { $tbl = reset($row); $found[] = $tbl; if (strcasecmp($tbl, 'MN_config') === 0) $in_table = true; } } $diag = array('in_table' => $in_table); if (!$in_table) { $diag['db_error'] = DB::error() ?: ''; $diag['all_tables'] = $found; } echo Res(1, '数据库信息保存成功', $diag); } else { $err_detail = ''; if ($cfgw === false) $err_detail .= 'config.php 写入失败;'; if ($sqw === false) $err_detail .= 'MPHX/SQ.php 写入失败;'; if (!is_writable('..')) $err_detail .= '上级目录不可写;'; if (!is_writable('../MPHX')) $err_detail .= 'MPHX目录不可写;'; if (file_exists('../config.php') && !is_writable('../config.php')) $err_detail .= 'config.php存在但不可覆盖;'; if (file_exists('../MPHX/SQ.php') && !is_writable('../MPHX/SQ.php')) $err_detail .= 'MPHX/SQ.php存在但不可覆盖;'; echo Res(0, '数据库信息保存失败:' . $err_detail); } } break; case 'check_upgrade': include_once '../config.php'; if (!$dbconfig['user'] || !$dbconfig['pwd'] || !$dbconfig['dbname']) { exit(Res(0, '请先填写并保存数据库配置')); } require_once './db.class.php'; $cn = DB::connect($dbconfig['host'], $dbconfig['user'], $dbconfig['pwd'], $dbconfig['dbname'], $dbconfig['port']); if (!$cn) { exit(Res(0, '数据库连接失败:' . DB::connect_error())); } DB::query("set sql_mode = ''"); DB::query("set names utf8"); $has_config = table_exists_case('MN_config'); $result = array( 'is_v179' => false, 'need_upgrade' => false, 'missing_tables' => array(), 'missing_columns' => array(), ); if ($has_config) { $result['is_v179'] = true; // 获取当前数据库中所有表(忽略大小写) $all_tables_result = DB::query("SHOW TABLES"); $existing_tables = array(); if ($all_tables_result) { while ($row = DB::fetch($all_tables_result)) { $existing_tables[] = strtolower(reset($row)); } } // 检查所有标准表 $all_tables = mnbt_standard_tables(); foreach ($all_tables as $tbl) { if (!in_array(strtolower($tbl), $existing_tables, true)) { $result['need_upgrade'] = true; $result['missing_tables'][] = $tbl; } } // 检查 V1.81 新增字段 $col_pay = DB::get_row("SHOW COLUMNS FROM `MN_config` LIKE 'pay_methods'"); if (!$col_pay) { $result['need_upgrade'] = true; $result['missing_columns'][] = 'MN_config.pay_methods'; } $col_php = DB::get_row("SHOW COLUMNS FROM `MN_bt` LIKE 'mrbts_php'"); if (!$col_php) { $result['need_upgrade'] = true; $result['missing_columns'][] = 'MN_bt.mrbts_php'; } // 检查 V1.84 新增字段(独立主页系统) $col_home = DB::get_row("SHOW COLUMNS FROM `MN_config` LIKE 'home_enable'"); if (!$col_home) { $result['need_upgrade'] = true; $result['missing_columns'][] = 'MN_config.home_enable'; } // 检查 V1.85 新增字段(对外 API 协议模式开关) $col_api_compat = DB::get_row("SHOW COLUMNS FROM `MN_config` LIKE 'api_compat'"); if (!$col_api_compat) { $result['need_upgrade'] = true; $result['missing_columns'][] = 'MN_config.api_compat'; } } echo Res(1, '升级检测完成', $result); break; case 'repair': include_once '../config.php'; if (!$dbconfig['user'] || !$dbconfig['pwd'] || !$dbconfig['dbname']) { exit(Res(0, '请先填写并保存数据库配置')); } require_once './db.class.php'; $cn = DB::connect($dbconfig['host'], $dbconfig['user'], $dbconfig['pwd'], $dbconfig['dbname'], $dbconfig['port']); if (!$cn) { exit(Res(0, '数据库连接失败:' . DB::connect_error())); } DB::query("set sql_mode = ''"); DB::query("set names utf8"); $r_t = 0; $r_e = 0; // 获取规范名→实际名映射(兼容跨系统迁移后大小写不一致) $tbl_map = table_case_map(mnbt_standard_tables()); // 1. 补齐缺失的表(跳过已存在的,不管大小写) $sql = file_get_contents("repair_tables.sql"); $sql = explode(';', $sql); for ($i = 0; $i < count($sql); $i++) { $q = trim($sql[$i]); if ($q === '') continue; // 提取表名,检查是否已存在 if (preg_match('/CREATE TABLE.*?`(\w+)`/', $q, $m)) { if (isset($tbl_map[$m[1]])) continue; // 表已存在(任意大小写),跳过 } if (DB::query($q)) { ++$r_t; } else { ++$r_e; } } // 2. 补齐字段(使用实际表名,仅添加缺失列) $actual_config = isset($tbl_map['MN_config']) ? $tbl_map['MN_config'] : 'MN_config'; $actual_zj = isset($tbl_map['MN_zj']) ? $tbl_map['MN_zj'] : 'MN_zj'; $actual_bt = isset($tbl_map['MN_bt']) ? $tbl_map['MN_bt'] : 'MN_bt'; $actual_dplan = isset($tbl_map['MN_docker_plan']) ? $tbl_map['MN_docker_plan'] : 'MN_docker_plan'; $actual_duser = isset($tbl_map['MN_docker_user']) ? $tbl_map['MN_docker_user'] : 'MN_docker_user'; $alter_sqls = mnbt_upgrade_columns($actual_config, $actual_zj, $actual_bt, $actual_dplan, $actual_duser); foreach ($alter_sqls as $table_name => $cols) { $existing_cols = mnbt_table_columns($table_name); if (empty($existing_cols)) continue; // 表不存在,repair_tables 已尝试创建 foreach ($cols as $col_name => $alter_sql) { if (!in_array(strtolower($col_name), $existing_cols, true)) { if (DB::query($alter_sql)) { ++$r_t; } else { ++$r_e; } } } } @file_put_contents("install.lock", '安装锁'); echo Res(1, "修复完成!成功{$r_t}项,失败{$r_e}项", array('tbl_map' => $tbl_map)); break; case 'install': $site_name = isset($_POST['site_name']) ? trim((string)$_POST['site_name']) : ''; $site_qq = isset($_POST['site_qq']) ? trim((string)$_POST['site_qq']) : ''; $site_gg = isset($_POST['site_gg']) ? trim((string)$_POST['site_gg']) : ''; $admin_user = isset($_POST['admin_user']) ? trim((string)$_POST['admin_user']) : ''; $admin_pwd = isset($_POST['admin_pwd']) ? (string)$_POST['admin_pwd'] : ''; if ($site_name === '' || $admin_user === '' || $admin_pwd === '') { exit(Res(0, '请填写站点名称、管理员账号与密码')); } if (mb_strlen($site_name) > 80) { exit(Res(0, '控制面板名称过长')); } if (mb_strlen($admin_user) < 3 || mb_strlen($admin_user) > 50) { exit(Res(0, '管理员账号长度需在 3~50 位')); } if (!preg_match('/^[a-zA-Z0-9_\x{4e00}-\x{9fa5}-]+$/u', $admin_user)) { exit(Res(0, '管理员账号含非法字符')); } if (strlen($admin_pwd) < 6 || strlen($admin_pwd) > 64) { exit(Res(0, '管理员密码长度需在 6~64 位')); } if ($site_qq !== '' && !preg_match('/^\d{5,15}$/', $site_qq)) { exit(Res(0, 'QQ 号格式不正确')); } if (mb_strlen($site_gg) > 2000) { exit(Res(0, '网站公告过长')); } include_once '../config.php'; if (!$dbconfig['user'] || !$dbconfig['pwd'] || !$dbconfig['dbname']) { exit(Res(0,'请先填写好数据库并保存后再安装!',null,1)); } require_once './db.class.php'; $cn = DB::connect($dbconfig['host'], $dbconfig['user'], $dbconfig['pwd'], $dbconfig['dbname'], $dbconfig['port']); if (!$cn) { exit(Res(0, '数据库错误:' . DB::connect_error(), null, 1)); } DB::query("set sql_mode = ''"); DB::query("set names utf8"); $install_mode = isset($_POST['install_mode']) ? (string)$_POST['install_mode'] : 'install'; $t = 0; $e = 0; $error = ''; $skip_sql = ($install_mode === 'skip'); if ($install_mode === 'upgrade') { // 获取规范名→实际名映射(含 V1.83 Docker 集成四表) $tbl_map = table_case_map(mnbt_standard_tables()); $actual_config = isset($tbl_map['MN_config']) ? $tbl_map['MN_config'] : 'MN_config'; $actual_zj = isset($tbl_map['MN_zj']) ? $tbl_map['MN_zj'] : 'MN_zj'; $actual_bt = isset($tbl_map['MN_bt']) ? $tbl_map['MN_bt'] : 'MN_bt'; $actual_dplan = isset($tbl_map['MN_docker_plan']) ? $tbl_map['MN_docker_plan'] : 'MN_docker_plan'; $actual_duser = isset($tbl_map['MN_docker_user']) ? $tbl_map['MN_docker_user'] : 'MN_docker_user'; // 1. 运行 V1.79→V1.81 升级脚本(脚本已幂等化,1.81 库上重跑安全) $upgrade_sql_file = __DIR__ . '/1.79To1.81.sql'; if (file_exists($upgrade_sql_file)) { $sql = file_get_contents($upgrade_sql_file); $sql = explode(';', $sql); for ($i = 0; $i < count($sql); $i++) { $q = trim($sql[$i]); if ($q === '') continue; if (DB::query($q)) { ++$t; } else { ++$e; $error .= DB::error() . '
'; } } } // 2. 补齐缺失的表(含 V1.83 Docker 四表,跳过已存在的) $sql = file_get_contents(__DIR__ . '/repair_tables.sql'); $sql = explode(';', $sql); for ($i = 0; $i < count($sql); $i++) { $q = trim($sql[$i]); if ($q === '') continue; if (preg_match('/CREATE TABLE.*?`(\w+)`/', $q, $m)) { if (isset($tbl_map[$m[1]])) continue; } if (DB::query($q)) { ++$t; } else { ++$e; $error .= DB::error() . '
'; } } // 3. 补齐缺失字段(V1.81 修复字段 + V1.83 Docker 配额字段 + V1.84 主页字段,判重后添加) $alter_sqls = mnbt_upgrade_columns($actual_config, $actual_zj, $actual_bt, $actual_dplan, $actual_duser); foreach ($alter_sqls as $table_name => $cols) { $existing_cols = mnbt_table_columns($table_name); if (empty($existing_cols)) continue; // 表不存在,第 2 步已尝试创建 foreach ($cols as $col_name => $alter_sql) { if (!in_array(strtolower($col_name), $existing_cols, true)) { if (DB::query($alter_sql)) { ++$t; } else { ++$e; $error .= DB::error() . '
'; } } } } } elseif (!$skip_sql) { $sql = file_get_contents("install.sql"); $sql = explode(';', $sql); for ($i = 0; $i < count($sql); $i++) { $q = trim($sql[$i]); if ($q === '') continue; if (DB::query($q)) { ++$t; } else { ++$e; $error .= DB::error() . '
'; } } if ($e != 0) { exit(Res(0, "安装失败!SQL成功{$t}句,失败{$e}句,请确保您的数据库版本在Mysql5.6(含)~5.7(含)之间,错误信息:" . $error)); } } else { $exists = table_exists_case('MN_config'); if (!$exists) { exit(Res(0, '未检测到已有数据表,无法跳过导入,请勾选强制重装或检查数据库')); } } date_default_timezone_set("PRC"); $date = date("Y-m-d"); $esc_user = DB::escape($admin_user); $esc_pwd = DB::escape($admin_pwd); $esc_name = DB::escape($site_name); $esc_qq = DB::escape($site_qq); $esc_gg = DB::escape($site_gg); $esc_date = DB::escape($date); $upd = DB::query("UPDATE `MN_config` SET `user`='{$esc_user}', `pwd`='{$esc_pwd}', `name`='{$esc_name}', `qqh`='{$esc_qq}', `gg`='{$esc_gg}', `date`='{$esc_date}' WHERE `id`='1'"); if (!$upd) { exit(Res(0, '站点配置写入失败:' . DB::error())); } // V1.85 迁移链基线播种:全新安装 / 覆盖升级已把库结构带到当前版本, // 据此把游标 MN_dbver 抬到 $WEBQB,之后在线更新只跑更高版本的增量、不重放历史迁移。 // skip 模式(只改配置不动表结构)库版本未知,故不播种;播种失败也不阻断安装。 if ($install_mode !== 'skip') { include_once __DIR__ . '/../MPHX/migrations.php'; if (function_exists('mnbt_migrations_seed')) { $seed_err = ''; mnbt_migrations_seed($dbconfig, (int)$WEBQB, $seed_err); } } @file_put_contents("install.lock", '安装锁'); if ($install_mode === 'upgrade') { exit(Res(1, '升级完成!已保留原有数据,成功更新至 ' . mnbt_version())); } if ($skip_sql) { exit(Res(1, '安装完成(保留原表并更新站点/管理员配置)')); } exit(Res(1, '安装成功!')); default: exit(Res(0, '不存在的action')); } exit(); function checkfunc($f, $m = false) { if (function_exists($f)) { return '可用'; } else { if ($m == false) { return '不支持'; } else { return '不支持'; } } } function checkclass($f, $m = false) { if (class_exists($f)) { return '可用'; } else { if ($m == false) { return '不支持'; } else { return '不支持'; } } } function mnqz() { global $mn_conf; $fh = file_get_contents($mn_conf['aet'] . "://" . $mn_conf['url'] . ":" . $mn_conf['port'] . "/" . $mn_conf['install_wj'] . "/xx.php"); $f = json_decode($fh, true); if ($f['code_qk']) { return '正常'; } else { return '不支持'; } } ?> MN宝塔主机系统

MN宝塔主机系统

<?php echo $conf['sitename']; ?>
欢迎使用由梦奈基于光年V3框架原创的MN宝塔主机系统(简称MNBT)!本系统免费发布于网络!
官网:mf.mengnai.top
未经作者同意严禁任何形式的二次开发及引用!
2023by:梦奈
系统版本:V1.6
您已经安装过,如需重新安装请从官网重新下载源码文件后再安装!
勾选则代表您同意遵守MN系统使用协议

开始安装

环境检查

10%
函数检测 需求 当前 用途
PHP 7.4 ~ 7.6 必须 ') && version_compare(PHP_VERSION, '7.7.0', '<'); echo $php_vs ? '' . PHP_VERSION . '' : '' . PHP_VERSION . ''; ?> PHP版本支持
curl_exec() 必须 抓取网页
file_get_contents() 必须 读取文件
MN更新支持 非必须 获取MN更新

<<上一步

数据库配置

30%

HTML; ?>

保存配置

50%
保存错误,请确保每项都不为空
<< 返回上一页
'; exit; } $posj = send_post(); if ($posj['code'] == '0') { echo '
' . $posj['msg'] . '
<< 返回上一页
'; } else { $config = " '{$db_host}', //数据库服务器 'port' => {$db_port}, //数据库端口 'user' => '{$db_user}', //数据库用户名 'pwd' => '{$db_pwd}', //数据库密码 'dbname' => '{$db_name}', //数据库名 ); ?>"; $sqwj = ""; if (!$con = DB::connect($db_host, $db_user, $db_pwd, $db_name, $db_port)) { if (DB::connect_errno() == 2002) echo '
连接数据库失败,数据库地址填写错误!
'; elseif (DB::connect_errno() == 1045) echo '
连接数据库失败,数据库用户名或密码填写错误!
'; elseif (DB::connect_errno() == 1049) echo '
连接数据库失败,数据库名不存在!
'; else echo '
连接数据库失败,[' . DB::connect_errno() . ']' . DB::connect_error() . '
'; } elseif (file_put_contents('../config.php', $config) && file_put_contents('../MPHX/SQ.php', $sqwj)) { echo '
数据库配置文件保存成功!
'; if (DB::query("select * from MN_config where 1") == FALSE) echo '

创建数据表>>

'; else echo '
系统检测到你已安装过MN宝塔主机系统
跳过安装
强制全新安装
'; } else echo '
保存失败,请确保网站根目录有写入权限
<< 返回上一页
'; } ?>

创建数据表

70%
请先填写好数据库并保存后再安装!
<< 返回上一页
'; } else { require './db.class.php'; $sql = file_get_contents("install.sql"); $sql = explode(';', $sql); $cn = DB::connect($dbconfig['host'], $dbconfig['user'], $dbconfig['pwd'], $dbconfig['dbname'], $dbconfig['port']); if (!$cn) die('err:' . DB::connect_error()); DB::query("set sql_mode = ''"); DB::query("set names utf8"); $t = 0; $e = 0; $error = ''; for ($i = 0; $i < count($sql); $i++) { $q = trim($sql[$i]); if ($q === '') continue; if (DB::query($q)) { ++$t; } else { ++$e; $error .= DB::error() . '
'; } } date_default_timezone_set("PRC"); $date = date("Y-m-d"); DB::query("update `MN_config` set `date` ='$date' where `id`='1'"); } $esew = 0; if ($e == 0) { echo '
安装成功!
SQL成功' . $t . '句/失败' . $e . '句

下一步>>

'; } else { echo '
安装成功!
SQL成功' . $t . '句/失败' . $esew . '句

下一步>>

'; } ?>

安装完成

100%
安装完成!管理账号和密码是:admin/123456

>>控制面板|>>后台管理
更多设置选项请登录后台管理进行修改。

如果你的空间不支持本地文件读写,请自行删除install文件夹!
'; unlink('index.php'); unlink('install.lock'); unlink('install.sql'); unlink('db.class.php'); @rmdir('../install/'); ?>

安装完成

100%
安装完成!管理账号和密码为原账号密码如果忘记请进入数据库MN_config表查看账号(user)密码(pwd)

>>控制面板|>>后台管理
更多设置选项请登录后台管理进行修改。

如果你的空间不支持本地文件读写,请自行删除install文件夹!
'; unlink('index.php'); unlink('install.lock'); unlink('install.sql'); unlink('db.class.php'); @rmdir('../install/'); ?>