실제 개발에서 특히 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 "1. " . ($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 () 또는 특정 Round of Store_Result () 오류가 발생하면 후속 작업에서 추가 오류를 피하기 위해 예외를 제 시간에 잡아야합니다.
결과 세트없이 작업에 적응 : 업데이트 , 삽입 , 삭제 및 기타 문은 결과 세트를 반환하지 않으며 처리 중에 특별 판단이 필요합니다.
여러 결과 세트를 캡슐화하고 처리함으로써 코드를 더 간결하게 만들뿐만 아니라 MySQL 연결 혼란의 문제를 효과적으로 피합니다. 프로젝트가 여러 SQL 쿼리를 자주 처리 해야하는 경우 표준화 된 캡슐화에 유사한 방법을 사용하는 것이 좋습니다.
다중 쿼리와 결합 된 트랜잭션과 같은 다중 쿼리의 고급 사용 또는 대규모 프로젝트에서 이러한 캡슐화를 통합하는 방법에 대해 더 알고 싶다면 웹 사이트 ( https://gitbox.net) 를 계속 팔로우 할 수 있습니다! ??