#> RESTKHZ _

休止千鹤 | 我依旧是一名平凡的学生

xiuno 出现Server Response Empty! 错误 捉虫记

  休止千鹤  |    04/01/2021

本文章是2018年写的,觉得挺有趣就从备份里翻来了
当时在用Xiuno搭建论坛.物是人非.因为某些原因,xiuno就这样默默消失了.
而我当时正好在实习.遇到这个问题顺手写了调试记录.

正文

很有没有写文章了。感觉也没啥好写的。博客偶尔出故障上来看看折腾下,故障拖久了bai度居然还把我删了。 最近在布置论坛的问题。在服务器上布置的很好,一点问题都没有。xiuno4就跑起来了。 但是这几天我想在自己的Manjaro上(打肿脸充Arch其实这是祸根
部署xiunobbs,在设置数据库时却遇到了Server Response Empty! 报错诶这就很讨厌……但是貌似不止我一个人这么倒霉,去搜了一下。别人建议换服务商,,诶大兄弟我自己开发环境您要我换电脑?好吧,开始干活。

等不及的,请直接去最后看解决方案.

正文开始

机器也没有xdebug。手动进去,进install/index.php打断点。发现install_sql_file()这里断了。跟进去,这个函数是拆分install.sql导入数据库建立表结构的。

function install_sql_file($sqlfile) {
    global $errno, $errstr;
    $s = file_get_contents($sqlfile);
    $s = str_replace(";\r\n", ";\n", $s);
    //$s = preg_replace('/#(.*?)\r\n/i', "", $s);
    $arr = explode(";\n", $s);
    foreach ($arr as $sql) {
        $sql = trim($sql);
        if(empty($sql)) continue;
        $arr = explode(";\n", $s);
        db_exec($sql) === FALSE AND message(-1, "sql: $sql, errno: $errno, errstr: $errstr");
    }
}

手打断点。

db_exec($sql) === FALSE AND message(-1, "sql: $sql, errno: $errno, errstr: $errstr");

到了这句。

很明显,只有db_exec返回bool(false)才会触发。于是我试了一下子,诶?返回的int(0)然而不能触发。折腾了半天,突然想起这是一个循环。

跟进db_exec函数,看看它怎么写的:

// 如果为 INSERT 或者 REPLACE,则返回 mysql_insert_id();
// 如果为 UPDATE 或者 DELETE,则返回 mysql_affected_rows();
// 对于非自增的表,INSERT 后,返回的一直是 0
// 判断是否执行成功: mysql_exec() === FALSE
function db_exec($sql, $d = NULL) {
    $db = $_SERVER['db'];
    $d = $d ? $d : $db;
    if(!$d) return FALSE
    DEBUG AND xn_log($sql, 'db_exec')
    $n = $d->exec($sql)
    db_errno_errstr($n, $d, $sql);
    return $n;
}

哦?继续打断点,当即对$n进行输出。

nt(0)
int(0)
string(1) "1"
int(0)
int(0)
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
string(1) "0"
int(0)
bool(false)

最后一个……我,看见你了。鬼头鬼脑的东西。

这里的false触发了message函数,然而message函数在参数为-1情况下会exit。然而并没有$errno, $errstr。所以返回empty。

这很可能是出错但是没有返回任何错误信息!!

带着返回值和$sql一起输出看看,,很容易就发现了这句:

CREATE TABLE bbs_forum (               
  fid int(11) unsigned NOT NULL auto_increment,      # fid
 # fup int(11) unsigned NOT NULL auto_increment, # 上一级版块,二级版块作为插件
  name char(16) NOT NULL default '',         # 版块名称
  rank tinyint(3) unsigned NOT NULL default '0',    # 显示,倒序,数字越大越靠前
  threads mediumint(8) unsigned NOT NULL default '0',   # 主题数
  todayposts mediumint(8) unsigned NOT NULL default '0',# 今日发帖,计划任务每日凌晨0点清空为0,
  todaythreads mediumint(8) unsigned NOT NULL default '0',# 今日发主题,计划任务每日凌晨0点清空为0
  brief text NOT NULL,                 # 版块简介 允许HTML
  announcement text NOT NULL,              # 版块公告 允许HTML
  accesson int(11) unsigned NOT NULL default '0',   # 是否开启权限控制
  orderby tinyint(11) NOT NULL default '0',      # 默认列表排序,0: 顶贴时间 last_date, 1: 发帖时间 tid
  create_date int(11) unsigned NOT NULL default '0',    # 板块创建时间
  icon int(11) unsigned NOT NULL default '0',       # 板块是否有 icon,存放最后更新时间
  moduids char(120) NOT NULL default '',     # 每个版块有多个版主,最多10个: 10*12 = 120,删除用户的时候,如果是版主,则调整后再删除。逗号分隔
  seo_title char(64) NOT NULL default '',        # SEO 标题,如果设置会代替版块名称
  seo_keywords char(64) NOT NULL default '',     # SEO keyword
  PRIMARY KEY (fid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

这里反回错误。明显,建立表bbs_forum失败了。赶快去mysql看看。

+------------------+
| Tables_in_xiuno  |
+------------------+
| bbs_attach       |
| bbs_cache        |
| bbs_forum_access |
| bbs_group        |
| bbs_kv           |
| bbs_modlog       |
| bbs_mypost       |
| bbs_mythread     |
| bbs_post         |
| bbs_queue        |
| bbs_session      |
| bbs_session_data |
| bbs_table_day    |
| bbs_thread       |
| bbs_thread_top   |
| bbs_user         |
+------------------+

果然这样! 没有bbs_forum!!

于是拖进mysql执行试试。

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘rank tinyint(3) unsigned NOT NULL default ‘0’,

threads mediumint(8) unsigned N’ at line 5

发现错误。rank关键字污染。

原因找到了:

因为我用的Manjaro是Arch源,Arch源特性是软件都是新版本。结果我安装的就是:Server version: 8.0.12 MySQL Community Server (GPL)

这个版本和前面的版本有很多变化。

估计是rank成了关键字

那么解决方法也简单,用``区别就行,把rank改成`rank`.

解决方案

进install/install.sql,修改bbs_forum表结构如下:
<pre class="lang:mysql decode:true ">CREATE TABLE bbs_forum (                
  fid int(11) unsigned NOT NULL auto_increment,        # fid
 # fup int(11) unsigned NOT NULL auto_increment,    # 上一级版块,二级版块作为插件
  name char(16) NOT NULL default '',            # 版块名称
  `rank` tinyint(3) unsigned NOT NULL default '0',    # 显示,倒序,数字越大越靠前
  threads mediumint(8) unsigned NOT NULL default '0',    # 主题数
  todayposts mediumint(8) unsigned NOT NULL default '0',# 今日发帖,计划任务每日凌晨0点清空为0,
  todaythreads mediumint(8) unsigned NOT NULL default '0',# 今日发主题,计划任务每日凌晨0点清空为0
  brief text NOT NULL,                    # 版块简介 允许HTML
  announcement text NOT NULL,                # 版块公告 允许HTML
  accesson int(11) unsigned NOT NULL default '0',    # 是否开启权限控制
  orderby tinyint(11) NOT NULL default '0',        # 默认列表排序,0: 顶贴时间 last_date, 1: 发帖时间 tid
  create_date int(11) unsigned NOT NULL default '0',    # 板块创建时间
  icon int(11) unsigned NOT NULL default '0',        # 板块是否有 icon,存放最后更新时间
  moduids char(120) NOT NULL default '',        # 每个版块有多个版主,最多10个: 10*12 = 120,删除用户的时候,如果是版主,则调整后再删除。逗号分隔
  seo_title char(64) NOT NULL default '',        # SEO 标题,如果设置会代替版块名称
  seo_keywords char(64) NOT NULL default '',        # SEO keyword
  PRIMARY KEY (fid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;</pre>
其实就是rank加了两个点...

原文名xiunoBBS出现 Server Response Empty! 错误捉虫记标题改了改


Views:

 Comments


Deftercanda:

很棒的解决方案,学到了(可能真的只加了两个点/doge

 Reply