连不上数据库八成是环境配置问题而非代码错误;需验证pdo_mysql扩展是否启用、pdo异常模式是否开启、mysql用户权限是否匹配'localhost'主机名,三者缺一不可。

连不上数据库,八成不是代码写错了,而是 php.ini 没配对、扩展没加载、或者 MySQL 用户权限根本没开对 localhost 访问。
检查 pdo_mysql 扩展是否真启用
很多人在 phpStudy 或 XAMPP 里点“启动 Apache”,就以为 PDO 能用了——其实 pdo 和 pdo_mysql 是两个独立扩展,缺一不可。不验证就写连接代码,等于闭眼开车。
- 新建
phpinfo.php,内容为<?php phpinfo(); ?>,访问 http://localhost/phpinfo.php - 页面内搜索
pdo和pdo_mysql,两处都必须显示enabled - Windows 下打开
php.ini,确认这两行没被注释:extension=php_pdo.dll和extension=php_pdo_mysql.dll - Linux/macOS 运行
php -m | grep pdo,输出应包含pdo和pdo_mysql
PDO 连接必须设 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
默认情况下 new PDO() 出错只抛 Fatal error,不告诉你错在哪。你看到的只是白屏或 500 错误,根本没法 debug。
- 错误写法:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); - 正确写法:显式传入
$options数组,强制开启异常模式 $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $user, $pass, $options);- 不加这行,
SQLSTATE[HY000] [1045]这类关键错误信息你永远看不到
MySQL 用户权限是 'user'@'host' 二元组,不是用户名就够了
你用 root 登录命令行能进,不代表 PHP 脚本能连上。MySQL 的用户账号由用户名 + 主机名共同组成,'myapp'@'localhost' 和 'myapp'@'127.0.0.1' 是两个完全不同的账号。
- 登录 MySQL 后执行:
SELECT User, Host FROM mysql.user;看你用的账号是否匹配localhost - 如果只看到
'myapp'@'127.0.0.1',但 PHP 连的是localhost,那就必然失败 - 临时解决(仅开发):
CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON test.* TO 'myapp'@'localhost'; FLUSH PRIVILEGES; - 别用
root写 PHP 连接代码,线上环境会被直接拒审
mysqli_connect() 失败后必须调用 mysqli_connect_error()
和 PDO 不同,mysqli_connect() 默认返回 false,但不会自动报错。你不主动查,就只能靠猜。
- 错误写法:
$conn = mysqli_connect($host, $user, $pass, $db); if (!$conn) die('连接失败');—— “失败”二字毫无信息量 - 正确写法:
if (!$conn) { die('连接失败: ' . mysqli_connect_error() . ' (' . mysqli_connect_errno() . ')'); } - 常见错误码:
2002表示 MySQL 服务没起来或端口被占;1045是账号密码或权限问题;1049是库不存在 - 注意:
mysqli_connect_error()只在连接失败时有效,后续查询出错要用$conn->error
真正卡住人的从来不是语法,而是扩展状态、错误模式、权限粒度这三个看不见的环节。少验证其中任何一环,代码写得再漂亮也跑不起来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











