<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 本文与 PHP 代码本身无关,仅作为演示文章输出</span></span><span>
</span><span><span class="hljs-comment">// 使用水平线分隔非正文和正文</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> <span class="hljs-string"><<<ARTICLE
----------------------------------------
# 如何将 mysqli_stmt::store_result 和 mysqli_stmt::next_result 配合使用?
在使用 PHP 的 MySQLi 扩展进行数据库操作时,如果涉及到**多结果集**(multi-result sets),就需要特别注意结果集的存储与切换。此时,`mysqli_stmt::store_result` 和 `mysqli_stmt::next_result` 两个方法往往需要配合使用,才能确保数据能够被正确读取,并且连接状态不会出错。
## 1. 背景知识
当我们在 MySQL 中执行一条可以返回多个结果集的语句(例如调用存储过程,或使用多条 `SELECT` 语句拼接),PHP 的 MySQLi 扩展会依次接收这些结果集。此时如果没有正确处理,就可能出现 **"Commands out of sync"** 的错误。
- **`mysqli_stmt::store_result`**
用于将当前结果集从 MySQL 服务器缓冲到客户端,以便后续能够安全读取和遍历数据。
- **`mysqli_stmt::next_result`**
用于移动到下一个结果集。如果有多个结果集未被处理而直接关闭连接,往往会引发错误。
## 2. 使用场景
- 调用返回多个 `SELECT` 的存储过程。
- 一次执行多条 SQL 语句时需要逐一遍历结果。
- 保证结果集被完全处理,从而避免连接状态异常。
## 3. 示例代码
```php
<?php
</span></span><span><span class="hljs-subst">$mysqli</span></span><span> = new mysqli("localhost", "user", "password", "testdb");
if (</span><span><span class="hljs-subst">$mysqli</span></span><span>->connect_errno) {
die("连接失败: " . </span><span><span class="hljs-subst">$mysqli</span></span><span>->connect_error);
}
// 假设 test_procedure 返回两个结果集
</span><span><span class="hljs-subst">$stmt</span></span><span> = </span><span><span class="hljs-subst">$mysqli</span></span><span>->prepare("CALL test_procedure()");
</span><span><span class="hljs-subst">$stmt</span></span><span>->execute();
// 循环处理多个结果集
do {
// 将当前结果集缓冲到客户端
if (</span><span><span class="hljs-subst">$stmt</span></span><span>->store_result()) {
while (</span><span><span class="hljs-subst">$row</span></span><span> = </span><span><span class="hljs-subst">$stmt</span></span><span>->fetch()) {
// 在这里处理数据
var_dump(</span><span><span class="hljs-subst">$row</span></span><span>);
}
}
// 移动到下一个结果集
} while (</span><span><span class="hljs-subst">$stmt</span></span><span>->next_result());
</span><span><span class="hljs-subst">$stmt</span></span><span>->close();
</span><span><span class="hljs-subst">$mysqli</span></span><span>->close();
</span></span>
Auch wenn Sie keine Ergebnismenge verarbeiten müssen, rufen Sie es an, um sicherzustellen, dass die Daten korrekt veröffentlicht werden.
Kooperieren Sie mit Next_Result
Nach Abschluss der Lektüre eines Ergebnissatzes muss Next_Result aufgerufen werden, um den nächsten einzutreten, andernfalls werden nachfolgende Operationen blockiert.
Fehlerhandhabung <br> Bei komplexen gespeicherten Verfahren wird empfohlen, der Schleife Fehlerprüfungen hinzuzufügen, damit sie rechtzeitig abgebrochen werden kann, wenn ein Problem mit dem Ergebnissatz vorliegt.
MySQLI_STMT :: Store_Result und MySQLi_stmt :: Next_Result sind ein Paar wichtiger Tools. Ersteres ist dafür verantwortlich, das Ergebnissatz sicher zwischenzuspeichern, während letzteres für die Iterierung des nächsten Ergebnissatzes verantwortlich ist. Die Verwendung von beiden kann sicherstellen, dass in PHP-Anwendungen stabil und korrekt behandelte Szenarien mit mehreren Result-Szenarien behandelt werden und häufige Verbindungsfehler vermeiden.
ARTIKEL;
<span></span>
Verwandte Tags:
mysqli_stmt