実際の開発では、特にMySQLマルチクエリ関数を使用する場合、複数の結果セットを処理する必要がある状況に遭遇することがよくあります。統一された処理方法がない場合、 next_result()とstore_result()を手動で呼び出すことは、毎回厄介であるだけでなく、エラーになりやすくなります。
コードをよりエレガントで堅牢にするために、一般的な関数をカプセル化し、すべての結果セットを自動的に処理できます。次に、ステップバイステップでそれを行う方法をご覧ください。
複数のクエリにMySQLIを使用する場合(つまり、複数のSQLステートメントを一度に送信)、各ステートメントは結果セットに対応します。 next_result()を使用してmysqliオブジェクトを次の結果セットに移動し、 store_result()は現在の結果セットからデータを抽出する責任があります。
これらの結果セットが正しく処理されていない場合、接続の例外を引き起こすか、次のクエリが失敗します。したがって、すべての結果セットを完全にクリーンアップすることが非常に重要です。
以下は、すべての結果セットを処理し、すべてのデータの配列を返す関数をカプセル化する方法を示す例を示します。
<?php
/**
* 複数のクエリを実行し、すべての結果セットを処理します
*
* @param mysqli $mysqli MySQLiオブジェクトを接続します
* @param string $multiQuery 実行する複数のアイテムSQLクエリステートメント(セミコロンで分離します)
* @return array すべての結果セットデータを含む配列を返します
*/
function executeMultiQuery(mysqli $mysqli, string $multiQuery): array
{
$allResults = [];
if ($mysqli->multi_query($multiQuery)) {
do {
if ($result = $mysqli->store_result()) {
$data = [];
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
$allResults[] = $data;
$result->free();
} else {
// 現在の結果は、結果が設定されていない場合があります,例えばUPDATEまたはINSERT
if ($mysqli->errno) {
throw new Exception("MySQL間違い:" . $mysqli->error);
}
$allResults[] = null;
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
throw new Exception("複数のクエリに失敗しました:" . $mysqli->error);
}
return $allResults;
}
// 使用の例
$mysqli = new mysqli('localhost', 'root', 'password', 'testdb');
if ($mysqli->connect_errno) {
die("接続に失敗しました:" . $mysqli->connect_error);
}
try {
$sql = "
SELECT * FROM users;
SELECT * FROM orders;
UPDATE products SET stock = stock - 1 WHERE id = 5;
";
$results = executeMultiQuery($mysqli, $sql);
// すべてのクエリ結果を出力します
foreach ($results as $index => $resultSet) {
echo "第 " . ($index + 1) . " 結果セット:<br>";
if (is_array($resultSet)) {
foreach ($resultSet as $row) {
echo htmlspecialchars(json_encode($row)) . "<br>";
}
} else {
echo "(返品結果はありません,例えばUPDATEまたはINSERT声明)<br>";
}
echo "<hr>";
}
} catch (Exception $e) {
echo "发生間違い:" . $e->getMessage();
}
$mysqli->close();
?>
結果セットリソースを時間内にリリースします。メモリリークを回避するには、 $ result-> free()を呼び出すことが非常に重要です。
エラーの検出: Multi_Query()またはStore_Result()の特定のラウンドが発生した場合、後続の操作でさらなるエラーを回避するために、例外を時間内に把握する必要があります。
結果セットなしで操作に適応する:更新、挿入、削除およびその他のステートメントは結果セットを返さず、処理中に特別な判断が必要です。
複数の結果セットをカプセル化および処理することにより、コードをより簡潔にするだけでなく、MySQL接続カオスの問題を効果的に回避します。プロジェクトが複数のSQLクエリを頻繁に処理する必要がある場合は、標準化されたカプセル化に同様の方法を使用することを強くお勧めします。
マルチQueriesと組み合わせたトランザクションなど、マルチカーリーの高度な使用について詳しく知りたい場合、またはそのようなカプセルを大規模プロジェクトに統合する方法など、ウェブサイトhttps://gitbox.net ! ??