最简可用mysqli面向对象连接代码为:$conn = new mysqli("localhost", "root", "pass", "testdb"); if ($conn->connect_error) die("连接失败: " . $conn->connect_error);。关键需检查connect_error而非布尔判断,建议显式关闭连接。

mysqli 是 PHP 连接 MySQL 的事实标准,mysql_* 函数早已被彻底移除(PHP 7.0+ 不再支持),PDO 虽然通用,但若只用 MySQL,mysqli 更轻量、更直接、对 MySQL 特性支持更原生。
怎么写一个最简可用的 mysqli 连接代码
不是“先学语法再连”,而是先让连接跑起来,再补细节。
最简面向对象写法:
$conn = new mysqli("localhost", "root", "pass", "testdb", 3306);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
关键点:
-
new mysqli()构造函数的 5 个参数顺序固定:主机、用户、密码、库名、端口(端口可省略,默认 3306) - 必须检查
$conn->connect_error—— 连接失败时$conn对象仍存在,但后续调用会报错,不能靠if (!$conn)判断 - 不显式关闭连接也不会立即出错,但长连接或高并发下会耗尽 MySQL 的
max_connections,建议在脚本末尾加$conn->close()
为什么 new mysqli() 失败却没报错?
常见现象:页面空白,或报 Fatal error: Uncaught mysqli_sql_exception,但没看到你写的 die()。
原因通常是:mysqli 扩展未启用,或配置了错误的错误报告模式。
检查和修复步骤:
- 运行
php -m | grep mysqli确认扩展已加载;若无输出,需在php.ini中取消extension=mysqli的注释并重启 Web 服务 - 默认情况下,
mysqli在连接失败时抛出异常(mysqli_sql_exception),而非返回错误字符串 —— 这是因为mysqli_report默认启用了MYSQLI_REPORT_STRICT - 如想用传统
if ($conn->connect_error)方式,可在连接前关闭严格模式:mysqli_report(MYSQLI_REPORT_OFF); - 更推荐保留严格模式,用
try/catch捕获:try { $conn = new mysqli(...); } catch (mysqli_sql_exception $e) { die("DB error: " . $e->getMessage()); }
mysqli 持久连接怎么写?有什么坑?
持久连接不是“多加个参数”就完事,它改变的是连接生命周期管理逻辑。
写法很简单:把主机名改成 "p:localhost" —— 注意开头的 p: 前缀:
$conn = new mysqli("p:localhost", "user", "pass", "db");
但要注意:
- 持久连接不会在脚本结束时自动释放,而是归还给连接池复用;这意味着事务、临时表、用户变量、锁等状态可能残留
-
mysqli内部会在连接复用前调用mysql_change_user()清理,但这个过程有开销,且无法 100% 覆盖所有边缘状态(比如未释放的GET_LOCK()) - 如果业务中大量使用
SET @var = ...或CREATE TEMPORARY TABLE,又没主动清理,持久连接可能引发数据错乱或锁等待 - 开发环境慎用;生产环境用之前,务必确认所有 SQL 路径都做了显式清理(如
$conn->rollback()、$conn->query("DROP TEMPORARY TABLE IF EXISTS ..."))
查询结果怎么取?fetch_assoc 和 fetch_array 有什么区别?
别再用 mysql_fetch_array() 那套老逻辑 —— mysqli 的结果集是独立对象,必须先执行查询再获取。
正确流程:
$result = $conn->query("SELECT id, name FROM users");
if ($result) {
while ($row = $result->fetch_assoc()) {
echo $row["id"] . ": " . $row["name"] . "\n";
}
$result->free(); // 推荐显式释放结果内存
}
差异说明:
-
fetch_assoc()只返回关联数组(键为字段名),语义清晰,性能略优 -
fetch_array()默认同时返回数字索引 + 关联索引(等价于MYSQLI_BOTH),容易混淆,且占用双倍内存;如需数字索引,明确传参:$row = $result->fetch_array(MYSQLI_NUM) -
fetch_row()和fetch_object()各有适用场景,但除非有强需求(如 ORM 映射),fetch_assoc()是最安全、最易读的选择 - 忘记调用
$result->free()不会立刻崩溃,但在循环大量查询时可能导致内存缓慢增长
实际项目里最容易被忽略的,是连接失败时的错误捕获方式和结果集释放时机 —— 它们不导致语法错误,却在高负载或异常路径下悄悄引发超时、内存泄漏或数据污染。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











