php连接数据库需先排查权限、扩展缺失、错误静默三类高频故障:确认php.ini中pdo和pdo_mysql已启用,pdo连接须设置pdo::attr_errmode => pdo::errmode_exception,mysql用户需匹配'username'@'localhost'权限,mysqli_connect()失败后须调用mysqli_connect_error()获取具体原因。

PHP连接数据库不是选“MySQLi还是PDO”的问题,而是得先避开权限、扩展缺失、错误静默这三类高频故障点。PDO是当前推荐路径,但直接照抄连接代码却连不上,大概率卡在底层配置上。
检查 mysqli 或 pdo 扩展是否已启用
很多新手在 phpStudy/XAMPP 里点了“启动”,就默认所有扩展都就绪——其实不是。PDO 和 MySQLi 是两个独立扩展,可能只启了一个,或干脆都没加载。
- 新建
phpinfo.php文件,内容为<?php phpinfo(); ?>,访问http://localhost/phpinfo.php - 搜索
pdo和mysqli,确认两处都显示“enabled”;若只有其中一项,说明另一项未启用 - Windows 下打开
php.ini,取消注释(删掉分号):extension=php_pdo.dll和extension=php_pdo_mysql.dll(注意不是php_mysqli.dll) - Linux/macOS 用户需确认
pdo和pdo_mysql在php -m输出中存在
PDO 连接时常见的致命错误信息
连接失败时,PDO 默认会静默失败,不报错也不提示原因。必须显式开启异常模式,否则 new PDO(...) 报错后程序直接终止,你根本看不到错在哪。
- 错误写法:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);—— 出错时只抛出Fatal error,无具体信息 - 正确写法:加
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION配置项 - 完整示例:
$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] Access denied for user...表示账号密码错或权限不足;SQLSTATE[HY000] [2002] Connection refused表示 MySQL 服务没起来或端口被占
MySQL 用户权限配置不当导致连接被拒
开发时习惯用 root 登录,但线上环境绝不能这么干。更关键的是:本地测试用的用户,未必有从 localhost 连接的权限——MySQL 的用户是 'user'@'host' 二元组,'myapp'@'127.0.0.1' 和 'myapp'@'localhost' 是两个不同账号。
- 登录 MySQL 后执行:
SELECT User, Host FROM mysql.user;看你用的用户名是否对应localhost(不是127.0.0.1) - 若只看到
'myapp'@'127.0.0.1',而 PHP 连接字符串写的是host=localhost,就会拒绝——因为 MySQL 认为这是两个 host - 临时解决:把连接串改成
host=127.0.0.1;长期方案:运行CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'xxx'; GRANT SELECT,INSERT,UPDATE ON test.* TO 'myapp'@'localhost'; FLUSH PRIVILEGES; - 切记:应用账号不要给
DROP、CREATE DATABASE、FILE等高危权限
mysqli_connect() 返回 false 却没提示原因
面向过程的 mysqli_connect() 不抛异常,只返回 false。如果没手动检查并输出错误,你会以为“代码没运行”,其实是连接失败后直接跳过了后续逻辑。
- 错误写法:
$conn = mysqli_connect("localhost", "u", "p", "db"); if (!$conn) { echo "连接失败"; }—— 只说失败,不说为什么 - 正确写法:用
mysqli_connect_error()拿到真实错误描述:if (!$conn) { die("连接失败: " . mysqli_connect_error()); } - 注意:
mysqli_connect_error()必须紧跟在mysqli_connect()之后调用,中间插了其他 mysqli 操作会覆盖该错误信息 - 如果用的是面向对象风格(
new mysqli(...)),记得检查$conn->connect_error属性,而不是mysqli_connect_error()
真正卡住人的往往不是语法,而是 MySQL 用户权限映射、PHP 扩展状态、错误报告开关这三个交叉点。连不上时,先看 phpinfo() 有没有扩展,再看 new PDO 是否开了异常模式,最后确认 MySQL 里那个 'user'@'host' 是不是真存在且有权限——顺序错了,查一整天也白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











