(列名 => 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']; ?>](https://q4.qlogo.cn/headimg_dl?dst_uin=3108807898&spec=100)
欢迎使用由梦奈基于光年V3框架原创的MN宝塔主机系统(简称MNBT)!本系统免费发布于网络!
官网:
mf.mengnai.top未经作者同意严禁任何形式的二次开发及引用!
2023by:梦奈
系统版本:V1.6
您已经安装过,如需重新安装请从官网重新下载源码文件后再安装!
勾选则代表您同意遵守
MN系统使用协议
开始安装
环境检查
| 函数检测 |
需求 |
当前 |
用途 |
| 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更新 |
<<上一步
下一步>>
保存配置
';
exit;
}
$posj = send_post();
if ($posj['code'] == '0') {
echo '
';
} 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 '
';
}
?>
创建数据表
';
} 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 . '句
下一步>>
';
}
?>
安装完成
安装完成!管理账号和密码是:admin/123456
>>控制面板|
>>后台管理
更多设置选项请登录后台管理进行修改。
如果你的空间不支持本地文件读写,请自行删除install文件夹!';
unlink('index.php');
unlink('install.lock');
unlink('install.sql');
unlink('db.class.php');
@rmdir('../install/');
?>
安装完成
安装完成!管理账号和密码为原账号密码如果忘记请进入数据库MN_config表查看账号(user)密码(pwd)
>>控制面板|
>>后台管理
更多设置选项请登录后台管理进行修改。
如果你的空间不支持本地文件读写,请自行删除install文件夹!';
unlink('index.php');
unlink('install.lock');
unlink('install.sql');
unlink('db.class.php');
@rmdir('../install/');
?>