<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>
Même si vous n'avez pas besoin de traiter un ensemble de résultats, appelez-le pour vous assurer que les données sont correctement publiées.
Coopérer avec next_result
Après avoir terminé la lecture d'un ensemble de résultats, Next_Result doit être appelé pour entrer le suivant, sinon les opérations suivantes seront bloquées.
Gestion des erreurs <br> Dans les procédures stockées complexes, il est recommandé d'ajouter des vérifications d'erreur à la boucle afin qu'elle puisse être interrompue dans le temps s'il y a un problème avec l'ensemble de résultats.
Lorsque vous travaillez avec les ensembles multi-résults de MySQL, MySQLI_STMT :: STORE_RESULT et MYSQLI_STMT :: Next_result sont une paire d'outils clés. Le premier est responsable de la mise en cache en toute sécurité de l'ensemble de résultats, tandis que le second est responsable de l'itération du prochain ensemble de résultats. L'utilisation des deux peut garantir que les scénarios de définition multi-résultats sont gérés de manière stable et correcte dans les applications PHP et éviter les erreurs de connexion courantes.
ARTICLE;
<span></span>
Étiquettes associées:
mysqli_stmt