宝塔php站点连不上数据库主因是三件事未配对:数据库用户权限须设为localhost而非%,php连接参数需指定charset=utf8mb4且hostname填localhost,3306端口须在宝塔安全组和系统防火墙同时放行。

宝塔面板里 PHP 站点连不上数据库,90% 是因为没配对三件事:数据库用户权限、PHP 配置里的连接参数、服务器端口与防火墙放行。不是“装了 MySQL 就自动能连”,必须手动对齐。
数据库创建时字符集和排序规则必须选 utf8mb4
MySQL 默认字符集可能是 latin1 或 utf8(实际只支持 3 字节),但现代 PHP 项目(尤其是含 emoji、中文生僻字、微信昵称)必须用 utf8mb4,否则插入数据报错或乱码,且无法回退修复。
- 在宝塔【数据库】→【添加数据库】时,字符集务必选
utf8mb4,排序规则选utf8mb4_unicode_ci(不是utf8_general_ci) - 如果已建库但选错了,不能直接改字符集——需导出数据 → 删除库 → 重建为
utf8mb4→ 导入,否则表结构仍残留旧编码 - PHP 连接时也要显式指定:
charset=utf8mb4(如 PDO DSN 中加;charset=utf8mb4,ThinkPHP 的charset配置项填utf8mb4)
PHP 配置文件里 hostname 别写 127.0.0.1,写 localhost
看似一样,但在宝塔环境下,127.0.0.1 走 TCP/IP 连接,而 localhost 会优先走 Unix socket(更快更稳定),且部分宝塔 PHP 版本对 127.0.0.1 有 DNS 解析缓存 bug,导致连接超时。
- 所有 PHP 项目的数据库配置中,
hostname统一填localhost -
hostport只在需要指定非默认端口时才填;MySQL 默认是3306,不填即使用默认值 - 若项目强制要求 IP(如某些 SaaS SDK),则必须确认宝塔 MySQL 是否监听了
0.0.0.0:3306(默认只监听127.0.0.1:3306),需修改 MySQL 配置文件/etc/my.cnf中的bind-address为0.0.0.0并重启
数据库用户权限必须绑定到 localhost,不能留空或填 %
宝塔创建数据库时,默认生成的用户主机名是 %(允许任意 IP 连接),但 PHP-FPM 进程是从本地 socket 发起连接,MySQL 认为来源是 localhost,而非 % 所匹配的网络地址,结果就是“用户名密码正确却拒接连接”。
- 进宝塔【数据库】→ 点对应库右侧【管理】→ phpMyAdmin → 顶部【用户】→ 找到该库用户 → 点【编辑权限】→ 把主机从
%改成localhost - 如果已有用户主机是
%,不要删重加,直接编辑即可;改完点【执行】保存 - 验证方式:在宝塔终端执行
mysql -u 用户名 -p -h localhost,能登录即说明权限生效
3306 端口必须在宝塔安全组和系统防火墙里同时放行
宝塔面板的「安全」页面里开放的端口,只是宝塔自己管的防火墙规则;Linux 系统级防火墙(如 firewalld 或 ufw)可能仍拦截 3306,尤其当项目需从外部(如本地开发机、另一台服务器)直连数据库时。
- 在宝塔【安全】页面,确认已添加放行规则:
3306(TCP) - 再 SSH 登录服务器,执行:
firewall-cmd --list-ports(CentOS)或ufw status(Ubuntu),看 3306 是否在列表中 - 若没有,运行:
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload或ufw allow 3306 - 注意:仅开放 3306 不代表 MySQL 就能被外网访问——前提是 MySQL 用户主机名设为
%且bind-address已放开,二者缺一不可
最容易被忽略的是用户主机名和连接方式的耦合关系:localhost ≠ 127.0.0.1,在宝塔这个上下文里,它们触发的是完全不同的 MySQL 认证路径。调不通时,先查 phpMyAdmin 能否用同一账号登录,再查终端能否 mysql -h localhost -u xxx -p,比瞎改代码快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











