php连接mysql不报错的关键是让错误可捕获、可定位、可修复:mysqli_connect()失败返回false但不报错,需立即用mysqli_connect_error()获取原因;pdo需显式启用pdo::errmode_exception才抛异常;务必检查扩展启用、host与权限匹配、字符集及socket/tcp差异。

PHP连接MySQL不报错,关键不是“让错误消失”,而是让错误可捕获、可定位、可修复。默认情况下,mysqli_connect() 和 PDO 构造函数失败时都可能静默返回 false 或抛出未捕获异常,导致你误以为“连上了”,结果后续查询全失败或存乱码。
mysqli_connect() 连接后必须手动判错
它不会自动抛异常,返回 false 就代表失败,但不告诉你为什么。不检查就直接用,后面所有 mysqli_query() 都会报 Warning: mysqli_query(): Couldn't fetch mysqli 这类二次错误,掩盖了根源。
- 必须在调用后立刻检查:
if (!$conn = mysqli_connect(...)) { die('连接失败: ' . mysqli_connect_error()); } - 第5个参数(端口)不能省略在非标环境:Docker 里 MySQL 映射到
3307,但代码还写默认3306,就会报Connection refused -
mysqli_set_charset($conn, 'utf8mb4')必须在连接成功后立即执行;只设charset=utf8mb4在 DSN 里对mysqli_connect()无效 - 别把密码写死在代码里——开发阶段可以,上线后必须从
$_ENV或配置文件读,否则错误页面可能泄露凭据
PDO 构造函数默认不报错,得开异常模式
PDO 默认用 PDO::ERRMODE_SILENT,连接失败只返回 false,new PDO(...) 抛出的 PDOException 只有在 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 开启后才生效。不开它,等于关掉所有错误提示开关。
- DSN 中的
charset=utf8mb4是硬性要求,漏写会导致 emoji 存成???,且无法靠setCharset()补救 - Unix socket 场景(如 MAMP、某些云数据库)要用
mysql:unix_socket=/tmp/mysql.sock;dbname=xxx,不能写host=localhost - MySQL 8+ 默认认证插件是
caching_sha2_password,PHP 7.4 以下版本的 PDO 驱动不兼容,会卡在SQLSTATE[HY000] [2054]—— 必须建用户时指定IDENTIFIED WITH mysql_native_password
localhost 和 127.0.0.1 不等价,连不上先换一个试试
在 Linux/macOS 上,localhost 会让 PHP 强制走 Unix socket 文件(如 /var/run/mysqld/mysqld.sock),而 127.0.0.1 走 TCP/IP。如果 MySQL 配置了 bind-address = 127.0.0.1 却禁用了 socket,或者 socket 路径不对,localhost 就必然失败,但 127.0.0.1 可能通。
- 本地开发建议统一用
127.0.0.1,避免环境差异 - Docker 容器间连接必须用服务名(如
mysql)或宿主机 IP(host.docker.internal),不能用localhost -
Access denied for user 'xxx'@'localhost'很可能是因为你用127.0.0.1连,但 MySQL 里只建了'xxx'@'localhost'用户——这两者在 MySQL 权限系统里是两个不同账号
扩展没启用是硬伤,phpinfo() 是第一排查工具
报 Fatal error: Uncaught Error: Call to undefined function mysqli_connect() 或 Class 'PDO' not found,说明 PHP 根本没加载对应扩展,再怎么改代码都没用。
- 确认
php.ini里已取消注释:extension=mysqli和extension=pdo_mysql - CLI 和 Web 服务器(如 Apache/Nginx + php-fpm)可能用不同
php.ini,都要检查;运行php --ini和phpinfo()对照路径 - 改完
php.ini必须重启 Web 服务或 php-fpm,否则配置不生效 - Linux 下常见路径是
/etc/php/8.2/apache2/php.ini或/etc/php/8.2/cli/php.ini,Windows 下多在 PHP 安装目录
真正难调试的从来不是语法,而是 MySQL 的权限模型、socket/TCP 差异、字符集初始化时机、以及扩展加载状态这些“看不见”的环节。每次连不上,先跑一遍 phpinfo() 看扩展、再用命令行 mysql -h 127.0.0.1 -u xxx -p 验证凭据和服务可达性,比反复改 PHP 代码快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











