mysqli构造函数第5个参数才是端口号且必须为整数,第4个参数是数据库名;需用'127.0.0.1'而非'localhost'确保走tcp并生效端口,拼接host如"localhost:3307"会被误解析为主机名导致连接失败。

mysqli构造函数第4个参数必须是整数端口号
PHP 8.3 里用 mysqli 连非标端口(比如 3307、4306),不能把端口拼在 host 后面(如 "localhost:3307"),那样会被当成主机名,连接直接失败。必须把端口作为独立参数传入,且类型必须是 int,不是字符串。
-
$host要写成'127.0.0.1',不能用'localhost'—— 后者在 Linux 下可能走 socket,绕过端口 - 第 4 个参数是数据库名,第 5 个才是端口;如果只传 4 个参数,第 4 个会被当数据库名,端口被忽略
- 如果同时要指定 socket 文件(如
/tmp/mysql.sock),就不能用第 5 个参数传端口,得换 PDO
连不上时先确认 MySQL 是否真在监听该端口
Connection refused 这类错误,90% 不是 PHP 写错了,而是 MySQL 根本没在那个端口上监听。别急着改代码,先验证服务状态:
- 查 MySQL 配置:
bind-address是否设为127.0.0.1或0.0.0.0(127.0.0.1才能响应127.0.0.1:3307) - 确认监听:运行
ss -tlnp | grep :3307(Linux)或netstat -ano | findstr :3307(Windows) - 检查用户授权:
'user'@'localhost'和'user'@'%'是两个不同账号,前者走 socket,后者才走 TCP + 端口
PDO 比 mysqli 更适合端口+字符集混合配置
如果你还要显式指定 charset=utf8mb4,PDO 的 DSN 写法更直观、不易出错。mysqli 虽然也能调 $conn->set_charset('utf8mb4'),但那是连接后动作,而 DSN 里写死更稳妥。
- DSN 中
port=必须紧接在host=后、dbname=前,顺序错就无效 - 不要用 URL 风格:
mysql://user:pass@127.0.0.1:3307/db—— PDO 不认这种写法 - 错误信息里带
Connection refused或Unknown MySQL server host,基本就是 DNS 或端口不通,不是密码错
PHP 8.3 下别碰 mysql_* 函数,也别信“启用扩展”就能复活
mysql_connect() 在 PHP 8.3 已彻底移除,不是 ini 配置能打开的,也不是装个扩展能救回来的。报 Fatal error: Uncaught Error: Call to undefined function mysql_connect() 就说明你还在用老教程代码。
- mysqli 和 PDO 都原生支持 PHP 8.3,只要编译时没禁掉(默认都启用)
- 面向对象写法比过程式更稳:漏判
mysqli_connect()返回值会导致后续所有mysqli_query()报 Warning - 如果项目已用 PDO,硬切 mysqli 不仅没必要,还容易因字符集、异常模式不一致埋坑
实际部署时最容易被忽略的是:MySQL 的 bind-address 和用户授权范围必须匹配 PHP 用的 host 地址。写 127.0.0.1 却授权 'user'@'localhost',或者反过来,都会静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











