php 8.5.5 连接 mysql 失败需按服务状态→扩展启用→连接参数→用户权限→认证插件顺序排查,localhost 与 127.0.0.1 因 socket/tcp 路径差异常致连通性问题,密码含特殊字符时 pdo 的 dsn 必须 urlencode。

PHP 本身不连接 phpMyAdmin,而是直接连接 MySQL(或 MariaDB)服务器;phpMyAdmin 只是一个用 PHP 写的数据库管理界面,它自己也靠 mysqli 或 PDO 连数据库。所以你真正要做的,是让 PHP 8.5.5 正确连接到你的 MySQL 实例——和 phpMyAdmin 用的是同一个库、同一套凭据。
PHP 8.5.5 默认不加载 mysql 扩展,必须用 mysqli 或 PDO
PHP 8.5.5 已彻底移除旧的 mysql_* 函数(如 mysql_connect),这些函数早在 PHP 7.0 就被废弃,现在调用会直接报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
- 必须使用
mysqli(面向对象或过程式)或PDO扩展 - 确认扩展已启用:在
php.ini中检查是否有extension=mysqli和/或extension=pdo_mysql,且前面没有分号 - 重启 Web 服务(如 Apache/Nginx)或 PHP-FPM 后,运行
php -m | grep -i mysql验证
mysqli 连接写法要注意 host 和 socket 路径差异
很多本地开发环境(如 XAMPP、MAMP、phpStudy)默认 MySQL 监听的是 Unix socket 而非 TCP 的 localhost:3306,但 mysqli 对 localhost 有特殊处理:它会自动尝试 socket 连接,而 127.0.0.1 强制走 TCP。这会导致“连接被拒绝”却查不出原因。
- 如果报错
Connection refused或Can't connect to local MySQL server,优先试$servername = '127.0.0.1' - 若用 socket(如 macOS MAMP 默认路径
/Applications/MAMP/tmp/mysql/mysql.sock),需显式指定:new mysqli('localhost', $user, $pass, $db, 0, '/path/to/mysql.sock') - 端口不是 3306?记得传第 5 个参数:
new mysqli($host, $user, $pass, $db, 3307)
密码为空或含特殊字符时,PDO 的 DSN 必须 urlencode
用 PDO 连接时,如果密码含 @、/、:、? 等字符,不编码会导致 DSN 解析失败,错误信息常为 SQLSTATE[HY000] [1045] Access denied for user,但实际是凭据根本没被正确读取。
- 正确做法:
$password = rawurlencode('p@ss/w0rd');,再拼进 DSN:"mysql:host=localhost;dbname=test;charset=utf8mb4" - charset 推荐显式指定
utf8mb4,避免 emoji 或四字节字符乱码 - 连接后立刻执行:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,否则错误静默失败
phpMyAdmin 的配置不影响你的 PHP 代码,但可反向验证凭据
如果你能正常登录 phpMyAdmin,说明用户名、密码、host、端口、权限都对——直接复用它的配置即可。不要去改 config.inc.php 里的 $cfg['Servers'][$i]['host'] 来“适配 PHP”,那是给 phpMyAdmin 自己用的。
- 打开 phpMyAdmin → 点右上角“用户账户” → 查看对应用户的“主机”字段(比如
localhost、127.0.0.1或%),这个就是你 PHP 里$servername的值 - 注意权限:该用户必须有目标数据库的
SELECT、INSERT等对应权限,仅USAGE不够 - phpMyAdmin 默认用
root,但生产环境严禁 PHP 代码用 root,应单独建受限用户
最易被忽略的一点:PHP 8.5.5 默认禁用 mysqlnd 的旧式认证插件兼容(如 caching_sha2_password),MySQL 8.0+ 新建用户默认用这个。连不上时,要么把 MySQL 用户改回 mysql_native_password,要么在 PHP 连接前加 mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 5); 并确保 ext/mysqli 编译时启用了 mysqlnd。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











