能,但不推荐;php 8.3 仍保留 mysqli_connect(),但需手动检查错误,而 new mysqli() 面向对象写法更可靠,配合 mysqli_report() 可自动抛异常,且连接后必须立即 set_charset('utf8mb4') 防乱码。

mysqli_connect() 在 PHP 8.3 还能用吗?
能,但不推荐。PHP 8.3 仍保留 mysqli_connect() 函数,但它属于面向过程风格,错误需手动检查 mysqli_connect_error(),容易漏判;而面向对象写法自动绑定连接状态、资源管理更可靠,且与 PHP 8.3 的严格错误报告模式(mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT))配合更好。
本地测试时 new mysqli() 怎么写才不出错
本地测试常见失败原因不是语法错,而是参数隐含陷阱。以下写法可直接复制调试:
-
localhost和127.0.0.1行为不同:MySQL 默认只允许localhost走 socket 连接,若 MySQL 配置了skip-networking或 socket 路径异常,会静默失败;改用127.0.0.1强制走 TCP,更稳定 - 端口必须显式传
3306(哪怕默认),尤其 Docker 容器或 MAMP/XAMPP 环境下端口常被改 - 密码为空时传
'',不能传null,否则 PHP 8.3 会触发TypeError - 连接后立刻调用
$mysqli->set_charset('utf8mb4'),否则插入中文可能存成乱码(utf8已不安全,MySQL 5.7+ 默认也不支持)
示例(含基础容错):
<?php $host = '127.0.0.1';
$username = 'root';
$password = '';
$dbname = 'test';
$port = 3306;
$mysqli = new mysqli($host, $username, $password, $dbname, $port);
if ($mysqli->connect_error) {
die('连接失败: ' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
echo '本地连接成功';
?>
为什么连上了却查不出数据?
不是连接问题,是字符集或权限没对齐。本地测试最容易忽略三点:
- MySQL 用户权限未赋予
localhost或127.0.0.1主机访问权(例如只给了'root'@'::1'),执行SELECT user, host FROM mysql.user;确认 - 数据库里表用的是
latin1或utf8字符集,但 PHP 用utf8mb4发请求,导致匹配失败或乱码——建表时统一用CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci - 没设时区:PHP 连接后执行
$mysqli->query("SET time_zone = '+00:00'");,避免 datetime 字段因时区偏差返回空或错值
命令行快速验证连接是否真通
不用起 Web 服务,终端一行就能测通不通:
php -r "\$m = new mysqli('127.0.0.1', 'root', '', 'test', 3306); echo \$m->connect_error ?: 'OK';"
输出 OK 表示主机、端口、账号、库名全对;若报 Access denied,重点查用户权限和密码;若报 Connection refused,说明 MySQL 没启动,或监听地址不是 127.0.0.1(查 my.cnf 中 bind-address)。
本地测试的坑往往不在代码本身,而在 MySQL 实例的配置细节和 PHP 与它的协议协商方式。字符集、主机名解析、socket/TCP 切换这三处,占了八成以上“明明代码一样却连不上”的原因。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











