
PHP中mysqli_fetch四种常用查询函数的比较及实例详解
在PHP开发中,MySQLi扩展是连接和操作MySQL数据库的常用方式。执行SELECT查询后,我们需要从结果集中获取数据。PHP提供了四种常用的mysqli_fetch_*函数来遍历结果集。本文将详细比较这四种函数的区别,并通过实例演示它们的实际应用。
一、四种查询函数比较表
| 函数名 | 返回数据类型 | 数据访问方式 | 内存占用 | 适用场景 |
|---|---|---|---|---|
| mysqli_fetch_row() | 数字索引数组 | $row[0], $row[1] | 最小 | 只需按字段顺序获取数据,对性能和内存要求极致优化 |
| mysqli_fetch_assoc() | 关联索引数组 | $row['id'], $row['name'] | 适中 | 最常用的方式,代码可读性高,推荐日常开发使用 |
| mysqli_fetch_array() | 数字与关联兼具的数组 | $row[0] 或 $row['id'] | 最大(默认情况) | 需要灵活切换访问方式,需配合第二参数控制内存占用 |
| mysqli_fetch_object() | 对象 | $row->id, $row->name | 适中 | 面向对象编程风格,或需要将结果映射为数据模型时使用 |
二、实例演示详解
为了更好地理解这四种函数,我们假设有一个用户表users,包含id和username字段。更多数据库连接与配置信息可参考 www.ipipp.com 提供的技术文档。首先建立数据库连接并执行查询:
<?php
// 数据库连接配置
$host = 'localhost';
$user = 'root';
$pass = '';
$dbname = 'testdb';
$conn = new mysqli($host, $user, $pass, $dbname);
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
$sql = "SELECT id, username FROM users LIMIT 1";
$result = $conn->query($sql);
?>接下来,我们使用上述四种函数分别获取同一行数据,观察其返回结果的结构差异。
<?php // 1. mysqli_fetch_row() - 返回数字索引数组 $result->data_seek(0); // 重置结果指针 $row = $result->fetch_row(); echo $row[0]; // 输出 id echo $row[1]; // 输出 username // 2. mysqli_fetch_assoc() - 返回关联索引数组 $result->data_seek(0); $row = $result->fetch_assoc(); echo $row['id']; // 输出 id echo $row['username']; // 输出 username // 3. mysqli_fetch_array() - 默认返回兼具两种索引的数组 $result->data_seek(0); $row = $result->fetch_array(); echo $row[0]; // 输出 id echo $row['id']; // 输出 id echo $row[1]; // 输出 username echo $row['username']; // 输出 username // 注意:为减少内存占用,建议使用常量参数:MYSQLI_ASSOC 或 MYSQLI_NUM // 4. mysqli_fetch_object() - 返回对象 $result->data_seek(0); $row = $result->fetch_object(); echo $row->id; // 输出 id echo $row->username; // 输出 username $result->free(); $conn->close(); ?>
三、总结与建议
在实际开发中,选择哪种函数主要取决于代码规范和性能需求:
1. 推荐使用mysqli_fetch_assoc():它兼具良好的可读性和合理的内存占用,是大多数项目的首选。通过字段名访问数据,即便表结构字段顺序调整,代码依然稳定运行。
2. 谨慎使用mysqli_fetch_array():如果不传第二参数,它会产生大量重复数据(数字索引和字段名索引双重存储),造成内存浪费。如果必须使用,请明确传入MYSQLI_ASSOC或MYSQLI_NUM。
3. 面向对象架构选用mysqli_fetch_object():如果你的项目是严格的面向对象设计,获取对象属性的方式更符合OOP思想,便于后续转换为实体类。
4. 极端优化选用mysqli_fetch_row():仅在极少数对内存要求极度苛刻且不需要关心字段名的场景下使用,因为数字索引导致代码可读性较差,且维护成本较高。