船说 CMS 数据库报错如何修复
学完这篇,你能独立定位并修复船说 CMS 最常见的几类数据库报错,不用再对着白屏干着急。
船说 CMS 跑在 ThinkPHP 上,绝大多数「数据库报错」其实就三类:连不上、表不对、编码/模式不兼容。下面按排查顺序来。
第一步:把报错原文找出来,别靠猜
这一步的目标是拿到完整错误信息——没有它,后面全是瞎试。
如果页面直接显示报错(白屏 + 一堆英文),先记下错误码,常见的有 1045、1049、1146、2002。如果页面只显示「系统错误」之类的模糊提示,去网站根目录打开 application/config.php,把 'app_debug' => false 改成 true,保存后刷新页面,详细报错就会显示出来。
同时去 runtime/log/ 目录,里面按日期命名,比如 20240612.log,用记事本打开,搜索 SQLSTATE 或 Error,能看到带 SQL 语句的完整记录。
注意:修完问题后记得把
app_debug改回false,开着它等于把数据库结构暴露给所有人。
第二步:核对数据库连接配置
这一步解决的是 1045、1049、2002 这类「连不上」的报错,改完就能正常连库。
用记事本或 VS Code 打开 application/database.php(部分版本在 config/database.php),重点看四项:
'hostname' => '127.0.0.1',
'database' => 'chuanshuo',
'username' => 'root',
'password' => '你的密码',
'hostport' => '3306',
1045 Access denied→ 用户名或密码错了。用 phpMyAdmin 或命令行mysql -uroot -p验一遍,能登进去就用同样的账号密码。1049 Unknown database→ 库名写错了,或者数据库根本没建。登录 phpMyAdmin,点左上角「新建」,数据库名填chuanshuo,排序规则选utf8mb4_general_ci,点「创建」。2002 Connection refused→ MySQL 没启动,或端口不对。Windows 下按Win+R输入services.msc,找到MySQL80服务,右键「启动」。- 报
could not find driver→ PHP 的 pdo_mysql 扩展没开。打开php.ini,把;extension=pdo_mysql前面的分号删掉,重启 Apache/Nginx。
注意:
hostname建议写127.0.0.1而不是localhost,后者在部分环境下会走 socket 连接,容易报 2002。
第三步:处理「表不存在」和字段错误
这一步解决 1146、1054 这类报错,通常发生在刚部署或升级之后。
1146 Table 'xxx.xxx' doesn't exist 意思是数据表丢了。船说 CMS 的安装包里一般带一个 .sql 文件(如 chuanshuo.sql 或 install/data/install.sql)。
用 phpMyAdmin 导入:左侧点中你的数据库 → 顶部点「导入」选项卡 → 点「选择文件」按钮选中 sql 文件 → 下方「字符集」选 utf-8 → 点右下角「执行」。
用 Navicat 的话:右键数据库 → 「运行 SQL 文件」 → 选中 sql 文件 → 编码选 65001 (UTF-8) → 点「开始」。
如果只是升级后少了某几个字段,别全库导入(会覆盖数据),对照新版安装包的 sql 文件,把缺失的那几条 ALTER TABLE 语句单独复制到 phpMyAdmin 的「SQL」选项卡里执行。
第四步:清缓存,最容易被忽略的一步
改完配置还报同样的错,八成是旧缓存没清。
进入网站根目录的 runtime 文件夹,删除 cache、temp、log 三个子目录里面的全部内容(目录本身保留)。如果权限允许,直接把 runtime 整个删掉也行,程序会自动重建。
注意:Linux 服务器上删完要确认
runtime目录权限是 755、属主是 web 用户(如www-data),否则程序写不进缓存,会报新的错。
第五步:MySQL 5.7 的 ONLY_FULL_GROUP_BY 报错
如果你看到 1055 ... which is not in GROUP BY clause,这是 MySQL 5.7 默认开了严格模式。
编辑 MySQL 配置文件:Windows 是 my.ini,Linux 是 /etc/my.cnf,在 [mysqld] 段落下面加一行:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
保存后重启 MySQL 服务(Windows 在 services.msc 里重启 MySQL80,Linux 执行 systemctl restart mysqld)。
注意:改配置前先复制一份原文件备份,写错一个字符 MySQL 就起不来了。
小结
- 先拿完整报错:开
app_debug、看runtime/log/里的日志文件。 - 连不上查
application/database.php的账号密码库名端口,外加 pdo_mysql 扩展。 - 表不存在就导入 sql 文件,字符集选 utf-8,别在已有数据上全量覆盖。
- 改完配置必须清
runtime缓存,否则改动不生效。 - MySQL 5.7 的 1055 报错改
my.ini/my.cnf的sql_mode后重启服务。
原文链接:https://www.gj0.com/thread-176.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。