データベース操作にPHPを使用する場合、特に複数のSQLクエリを実行する場合、 next_result()メソッドが必要になることがよくあります。 next_result()の目的は、オブジェクトを次のクエリの結果セットに切り替えることです。しかし、問題は次のとおりです。
next_result()はブール値を返します。
return true :次の結果セットが次の結果セットに正常に切り替えられるか、次の結果セットが空であることを示します(たとえば、行を返さないステートメントを更新します)。
falseを返す:結果セットがなく、切り替えプロセス中にエラーが発生したことを意味します。
したがって、判断する最も直接的な方法は、next_result()の返品値を確認することです。
簡単な例を見てみましょう。
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
// 複数のクエリを実行します
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// 現在の結果セットを処理します
while ($row = $result->fetch_assoc()) {
echo "データ行:" . json_encode($row) . "<br>";
}
$result->free();
} else {
// 現在の声明はそうではありません SELECT のようなクエリ,多分 UPDATE、INSERT 待って
if ($mysqli->errno) {
echo "結果セットの保存に失敗しました,間違い:" . $mysqli->error . "<br>";
}
}
// 次の結果セットに切り替えてみてください
if ($mysqli->more_results()) {
if (!$mysqli->next_result()) {
echo "次の結果セットに切り替えると失敗しました,間違い:" . $mysqli->error . "<br>";
break;
}
} else {
// これ以上の結果セットはありません
break;
}
} while (true);
} else {
echo "複数のクエリを実行します失败,間違い:" . $mysqli->error;
}
$mysqli->close();
?>
エラー検出の欠落を避けるために、 next_result()を呼び出す直後に$ mysqli-> errnoが0かどうかを確認することをお勧めします。 0ではない場合、 next_result()がtrueを返しますが、構文エラーなどのプロセス中にエラーが発生したことを意味します。
より厳格なバージョンは次のように書くことができます:
if ($mysqli->more_results()) {
if (!$mysqli->next_result()) {
// 发生了切换間違い
error_log("結果セットの切り替えに失敗しました:" . $mysqli->error);
break;
} elseif ($mysqli->errno) {
// next_result() 戻る true,但实际出现了間違い
error_log("結果セットの切り替え中に例外が発生しました:" . $mysqli->error);
break;
}
}
next_result()が成功したかどうかを判断するには、次のことをする必要があります。
next_result()の返品値がtrueかどうかを確認してください。
$ mysqli-> errnoが0であるかどうかを確認してください。
適切なタイミングでmore_results()を使用して、next_result()を呼び出す必要があるかどうかを判断します。
複数のクエリは非常に強力ですが、エラーを処理するときは注意する必要があります。それ以外の場合は、隠されたバグが発生する傾向があります。
Multi_Query()およびnext_result()の詳細について詳しく知りたい場合は、公式ドキュメントを参照できます(サンプルURL、ドメイン名はgitbox.netに置き換えられました)。