new mysqli() 必须传入主机、用户名、密码、数据库名四个参数,端口和socket可选;连接失败不抛异常,需立即检查$mysqli->connect_errno或$mysqli->connect_error;建议开启mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)并调用set_charset('utf8mb4')确保字符集正确。

new mysqli() 的基本用法和必需参数
PHP 7.4 中 new mysqli() 创建连接对象,必须传入至少四个参数:主机、用户名、密码、数据库名(可为空),否则会报错或静默失败。漏掉数据库名不等于“不选库”,而是连接后默认无当前数据库上下文,后续 query() 执行 SQL 时若没用 database.table 全限定名,会触发 mysqli_error(): No database selected。
- 最简可用写法:
$db = new mysqli('localhost', 'root', 'pass', 'myapp'); - 端口和 socket 可选:第 5 个参数是端口(如
3306),第 6 个是 socket 路径(如/var/run/mysqld/mysqld.sock),不填则走默认值 - 连接失败时
new mysqli()不抛异常,而是返回 false,需手动检查:if (!$db || $db->connect_error) { die('Connect failed: ' . $db->connect_error); }
为什么 new mysqli() 有时返回 false 却没报错信息
常见原因是 MySQL 服务未运行、用户权限不足、或 PHP 没启用 mysqli 扩展(PHP 7.4 默认启用,但某些精简镜像可能禁用)。$db->connect_error 是字符串,而 $db->connect_errno 是整数错误码,两者必须在 new mysqli() 后立刻读取——一旦执行了任何其他 mysqli 操作(比如 ping() 或 query()),这个错误状态就会被覆盖。
- 正确检查顺序:
$db = new mysqli(...); if ($db->connect_errno) { echo $db->connect_error; } - 不要写成:
if (!new mysqli(...)) { ... }—— 这样无法拿到错误信息 - 本地开发常用
127.0.0.1替代localhost,避免 Unix socket 导致的权限或路径问题
如何让 new mysqli() 在失败时自动抛出异常
PHP 7.4 支持设置 mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5) 等选项,但异常模式需在创建前全局开启:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);。开启后,所有 mysqli 操作(包括 new mysqli())失败都会抛出 mysqli_sql_exception,无需手动判断 connect_error。
- 放在脚本开头即可:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $db = new mysqli(...); - 注意:该设置影响整个脚本中所有 mysqli 实例,不是单个对象的属性
- 如果项目混用 PDO 和 mysqli,PDO 不受此影响;但若已有旧代码依赖
connect_error判断,开启后会中断逻辑
连接成功后立即验证字符集是否生效
new mysqli() 不自动设置 UTF-8,即使 MySQL 服务端默认是 utf8mb4,PHP 客户端仍可能以 latin1 通信,导致中文存取乱码。必须显式调用 set_charset('utf8mb4'),且必须在连接成功后、任何查询前执行。
立即学习“PHP免费学习笔记(深入)”;
- 推荐写法:
$db = new mysqli(...); $db->set_charset('utf8mb4'); - 不能写成:
new mysqli(...)->set_charset('utf8mb4')—— 链式调用在构造失败时会报致命错误 - 验证方式:
var_dump($db->character_set_name());应输出utf8mb4 - MySQL 8.0+ 默认认证插件是
caching_sha2_password,PHP 7.4 原生支持,但老版本 MySQL 用户若用mysql_native_password更稳妥



















