
php mysqli_connect() 返回 false 怎么办
直接看返回值和 mysqli_connect_error(),别只盯着“连不上”干猜。绝大多数情况是参数错、服务没起、权限没开这三类。
-
mysqli_connect()的第 4 个参数(数据库名)为空或不存在时也会返回 false,不是只在连接阶段失败 - 如果用的是 localhost,MySQL 默认走 socket 文件(如
/var/run/mysqld/mysqld.sock),但 PHP 可能找不到它;换成127.0.0.1强制走 TCP,能快速区分是权限问题还是 socket 路径问题 - 注意 MySQL 8.0+ 默认认证插件是
caching_sha2_password,而老版本 PHP(
pdo 连接报 “SQLSTATE[HY000] [2002] Connection refused”
这个错误明确指向网络层不通,和账号密码无关。先确认 MySQL 服务状态和监听配置。
- 运行
systemctl status mysql(或mysqld)看服务是否 active;Debian/Ubuntu 上可能是mysql.service,CentOS 8+ 可能是mysqld.service - 检查
my.cnf里有没有bind-address = 127.0.0.1或skip-networking—— 后者会直接禁用 TCP 连接,PDO 就必然失败 - 如果 PHP 和 MySQL 不在同一台机器,防火墙(
ufw/firewalld)和云服务器安全组必须放行 3306 端口;本地测试时也建议暂时关掉防火墙排除干扰
连接成功但查不到数据,mysqli_query() 返回 false
这不是连接问题,是语句执行失败。很多人误以为“能连上=能干活”,其实每一步都可能断。
- 执行查询前务必检查
mysqli_query()返回值:false 表示 SQL 有语法错误、表不存在、字段名写错、权限不足等 - 立刻跟一句
mysqli_error($link),它比mysqli_connect_error()更具体,比如会告诉你 “Unknown column 'user_nam' in 'field list'” - 注意字符集:如果建表时用
utf8mb4,但连接时没设SET NAMES utf8mb4或没在 DSN 里加;charset=utf8mb4,某些含 emoji 的查询会静默失败
PHP-FPM 下连接池耗尽导致间歇性失败
高并发场景下,mysqli 每次 new 一个连接不释放,或 PDO 没设 PDO::ATTR_PERSISTENT => true,会导致连接数暴涨,MySQL 报 Too many connections。
立即学习“PHP免费学习笔记(深入)”;
- 查当前连接数:
SHOW STATUS LIKE 'Threads_connected';,再对比 MySQL 配置里的max_connections(默认通常 151) - 短生命周期脚本(如 Web 请求)不推荐用持久连接,容易因进程复用导致事务残留或连接状态混乱;真要用,必须确保每次请求结束前显式 commit/rollback 并 close
- 更稳妥的做法是控制连接生命周期:用完立刻
mysqli_close($link),或者用 try/finally 包裹;PDO 则依赖 GC,但大流量下仍建议主动$pdo = null;
真正麻烦的不是连不上,而是“有时候连得上,有时候不行”,这种大概率是连接复用、超时设置、DNS 缓存或负载均衡转发策略导致的——得盯住 MySQL 的 show processlist 和 PHP 错误日志里的毫秒级时间戳才能定位。











