php连不上数据库90%是扩展未启用、mysql服务未运行或连接参数错误;需确认php.ini中启用pdo和pdo_mysql扩展、mysql服务已启动且端口可达、dsn中host/port/charset等参数准确无误。

PHP 连不上数据库,90% 是扩展没启用、服务没启动、或连接参数写错 —— 不是代码问题,先排查这三处。
php.ini 里必须启用 PDO 和 MySQL 扩展
PHP 默认不加载数据库驱动,哪怕你装了 MySQL,mysqli_connect() 或 PDO::__construct() 也会直接报 “Class not found” 或 “Call to undefined function”。
打开你的 php.ini(不是 php.ini-development),确认以下几行已取消注释且路径正确:
-
extension=php_pdo.dll(Windows)或extension=pdo.so(Linux/macOS) -
extension=php_pdo_mysql.dll(Windows)或extension=pdo_mysql.so(Linux/macOS) - 如果用
mysqli,还要加extension=php_mysqli.dll或extension=mysqli.so
改完后重启 Web 服务(Apache/Nginx)或 PHP-FPM,用 php -m | grep pdo 检查是否生效。Windows 下常见错误是扩展文件名写成 php_pdo_mysql.dll,但实际目录里是 php_pdo_mysql.dll —— 注意大小写和下划线。
MySQL/MariaDB 服务必须运行且端口可访问
PHP 连接失败时,先别动代码,用命令行验证数据库本身是否就绪:
- 执行
mysql -u root -p,能进mysql>提示符,说明服务在跑、密码对、本地 socket 正常 - 如果提示
Can't connect to local MySQL server through socket,说明服务根本没启动:sudo systemctl start mariadb(Linux)或检查 Windows 服务里MariaDB/MySQL80是否为“正在运行” - 远程连接失败?默认 MySQL/MariaDB 绑定
127.0.0.1,需改my.cnf中的bind-address = 0.0.0.0并开放防火墙端口(如3306)
注意:MariaDB 10.4+ 和 MySQL 8.0+ 默认用 caching_sha2_password 认证插件,PHP 7.4 以前版本不兼容 —— 连接时会卡住或报 Authentication plugin 'caching_sha2_password' cannot be loaded。解决方法是在 MySQL 里执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
PHP 连接代码里的 host、port、socket 要匹配实际部署方式
本地开发最常踩的坑是混淆 TCP 连接和 Unix socket 连接:
- 用
localhost当host,PHP 会尝试走 Unix socket(Linux/macOS)或命名管道(Windows),此时port参数会被忽略 - 想强制走 TCP,必须写
127.0.0.1代替localhost - Nginx + PHP-FPM 场景下,若 MySQL 在容器或远程机器上,
host必须填 IP,不能填localhost(那会指向容器自己) - Unix socket 路径要和 MySQL 配置一致,常见路径:
/var/run/mysqld/mysqld.sock(Debian/Ubuntu)、/var/lib/mysql/mysql.sock(CentOS/RHEL)、C:/xampp/mysql/data/mysql.sock(XAMPP)
一个最小可用测试脚本:
<?php <br>$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8mb4";<br>try {<br> $pdo = new PDO($dsn, "root", "your_password");<br> echo "Connected successfully";<br>} catch (PDOException $e) {<br> echo "Connection failed: " . $e->getMessage();<br>}如果报 Connection refused,就是服务没起来;报 Access denied,优先查用户权限和认证插件。
Windows 下 Apache + PHP 的 DLL 依赖容易缺失
PHP 8.x 在 Windows 上依赖 Visual C++ 运行库,尤其使用 MySQL 扩展时,php_pdo_mysql.dll 会间接调用 libmysql.dll 或 mysqlclient.dll —— 缺少任一,php -v 就会报错或直接崩溃。
- 必须安装
Visual C++ Redistributable for Visual Studio 2015–2022 x64(即使你用的是 PHP x86 版,也建议装 x64 版,避免 DLL 冲突) - 确认
php.ini中extension_dir指向正确的目录,比如C:\php80\ext,且该目录下确实存在php_pdo_mysql.dll - Apache 启动时报
Cannot load D:/php80/php8apache2_4.dll into server?检查 PHP 下载包是否选了Thread Safe版本(Apache 必须用 TS 版)
真正麻烦的点往往不在配置本身,而在不同组件间的隐式依赖:MySQL 版本、PHP 构建时的编译器、VC 运行库版本、甚至 PATH 环境变量里混入了旧版 MySQL 的 bin 目录 —— 这些都会让错误信息变得模糊。动手前,先用 php --ri pdo_mysql 看扩展是否加载成功,比反复改连接字符串更省时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











