在 PHP 中使用 MySQLi 执行数据库查询后,我们通常希望能高效、方便地获取所有的查询结果。在面向对象的 MySQLi 使用方式中,mysqli_result::fetch_all 是一种非常简洁的方法,可以一次性获取所有结果并以数组形式返回。本文将详细介绍如何使用 fetch_all 方法,并分析其使用场景与注意事项。
mysqli_result::fetch_all 是 mysqli_result 类中的一个方法,用于一次性将查询结果集中的所有行取出。其返回的是一个二维数组,每一行代表一个查询结果中的记录。
语法如下:
<span><span><span class="hljs-keyword">array</span></span><span> mysqli_result::</span><span><span class="hljs-title function_ invoke__">fetch_all</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$mode</span></span><span> = MYSQLI_NUM)
</span></span>
$mode 参数用于定义返回数组的格式,常用的有:
MYSQLI_NUM:返回数字索引数组。
MYSQLI_ASSOC:返回关联索引数组(字段名作为键)。
MYSQLI_BOTH:同时返回数字和关联索引。
下面我们通过一个完整的示例演示 fetch_all 的使用过程。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 数据库连接配置</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">"localhost"</span></span><span>;
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-string">"root"</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$database</span></span><span> = </span><span><span class="hljs-string">"test_db"</span></span><span>;
</span><span><span class="hljs-comment">// 创建连接</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$database</span></span><span>);
</span><span><span class="hljs-comment">// 检查连接是否成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"连接失败: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// 查询语句</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT id, name, email FROM users"</span></span><span>;
</span><span><span class="hljs-comment">// 执行查询</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-comment">// 检查查询是否成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"查询失败: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error);
}
</span><span><span class="hljs-comment">// 使用 fetch_all 获取所有结果(关联数组方式)</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_all</span></span><span>(MYSQLI_ASSOC);
</span><span><span class="hljs-comment">// 输出结果</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] . </span><span><span class="hljs-string">"<br>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Name: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>] . </span><span><span class="hljs-string">"<br>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Email: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'email'</span></span><span>] . </span><span><span class="hljs-string">"<br><br>"</span></span><span>;
}
</span><span><span class="hljs-comment">// 释放结果集</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">free</span></span><span>();
</span><span><span class="hljs-comment">// 关闭连接</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
简洁:相比 while ($row = $result->fetch_assoc()) 的传统写法,代码更少、更清晰。
效率:一次性将所有数据加载到内存中,适合处理小到中等规模的数据集。
灵活性:支持多种数组格式(数字索引、关联索引或两者兼有)。
数据量大时慎用:因为 fetch_all 会一次性将所有数据加载到内存中,当数据量过大时可能导致内存溢出。
MySQL Native Driver(mysqlnd)要求:fetch_all 方法需要启用 mysqlnd(MySQL 原生驱动)。在一些旧的 PHP 配置中,如果未启用 mysqlnd,可能会导致此方法不可用。
错误处理:建议始终检查查询结果是否为 false,以便及时捕捉 SQL 执行错误。
通过 mysqli_result::fetch_all,PHP 开发者可以更加高效地从数据库中获取完整的查询结果。虽然这种方式简洁方便,但在使用过程中仍需根据实际数据量和系统资源做出合理选择。掌握好它的使用场景,将有助于提升你的数据库操作效率和代码可读性。