현재 위치: > 최신 기사 목록> 다음 _result () 및 다중 자극 처리를 일반 함수로 캡슐화하는 방법

다음 _result () 및 다중 자극 처리를 일반 함수로 캡슐화하는 방법

gitbox 2025-05-02

실제 개발에서 특히 MySQL 다중 쿼리 기능을 사용할 때 여러 결과 세트를 처리 해야하는 상황이 종종 발생합니다. 통합 처리 방법이없는 경우, 매번 Next_result ()store_result ()를 수동으로 호출하는 것은 귀찮은 일뿐 만 아니라 오류가 발생하기 쉽습니다.
코드를보다 우아하고 강력하게 만들기 위해 일반적인 기능을 캡슐화하고 모든 결과 세트를 자동으로 처리 할 수 ​​있습니다. 다음으로, 나는 그것을 단계별로 수행하는 방법을 당신을 안내 할 것입니다.

next_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();
?>

주목해야 할 것

  1. 결과 세트 리소스를 제 시간에 해제하십시오 . 메모리 누출을 피하려면 $ result-> free ()를 호출하는 것이 매우 중요합니다.

  2. 오류 감지 : Multi_Query () 또는 특정 Round of Store_Result () 오류가 발생하면 후속 작업에서 추가 오류를 피하기 위해 예외를 제 시간에 잡아야합니다.

  3. 결과 세트없이 작업에 적응 : 업데이트 , 삽입 , 삭제 및 기타 문은 결과 세트를 반환하지 않으며 처리 중에 특별 판단이 필요합니다.

결론

여러 결과 세트를 캡슐화하고 처리함으로써 코드를 더 간결하게 만들뿐만 아니라 MySQL 연결 혼란의 문제를 효과적으로 피합니다. 프로젝트가 여러 SQL 쿼리를 자주 처리 해야하는 경우 표준화 된 캡슐화에 유사한 방법을 사용하는 것이 좋습니다.

다중 쿼리와 결합 된 트랜잭션과 같은 다중 쿼리의 고급 사용 또는 대규모 프로젝트에서 이러한 캡슐화를 통합하는 방법에 대해 더 알고 싶다면 웹 사이트 ( https://gitbox.net) 를 계속 팔로우 할 수 있습니다! ??