休止千鹤 | 我依旧是一名平凡的学生
本文章是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