很有没有写文章了。感觉也没啥好写的。博客偶尔出故障上来看看折腾下,故障拖久了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进行输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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一起输出看看,,很容易就发现了这句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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看看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
mysql> show tables; +------------------+ | 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关键字污染。
原因找到了:
因为我用的Arch,Arch特性是软件都是最新版本。结果我安装的就是:
Server version: 8.0.12 MySQL Community Server (GPL)
这个版本和前面的版本有很多变化。
估计是rank成了关键字
那么解决方法也简单,用
区别就行,把rank改成rank
.
所以解决方案:
进install/install.sql,修改bbs_forum表结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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; |
其实就是rank加了两个点…