현재 위치: > 최신 기사 목록> Multi-Result 세트가 없을 때 Next_result ()에게 전화 할 위험

Multi-Result 세트가 없을 때 Next_result ()에게 전화 할 위험

gitbox 2025-05-02

PHP를 사용하여 MySQL 데이터베이스를 조작 할 때 개발자는 MySQLI 확장을 사용하여 복잡한 쿼리를 처리 할 수 ​​있습니다. 특히 저장 프로 시저를 호출하거나 여러 SQL 문을 실행할 때 다음 _result () 기능이 특히 중요합니다. 이 기능은 처리에 사용됩니다. 즉, 여러 결과가 쿼리 (예 : 여러 Selects 또는 저장 프로 시저의 출력)에서 반환되면 Next_Result () 를 통해 트래버스 할 수 있습니다.

그러나 여러 결과 세트가없는 Next_result ()를 호출하는 것은 위험합니다.

next_result () 의 역할

다음과 같이 SQL을 실행할 때 :

 CALL get_user_and_orders(1);

이 저장 절차는 두 가지 결과 세트를 반환 할 수 있습니다.

  1. 첫 번째는 사용자 정보입니다.

  2. 두 번째는 사용자의 주문 정보입니다.

이 두 결과 세트를 올바르게 얻으려면 다음을 처리해야합니다.

 $mysqli = new mysqli("localhost", "user", "password", "database");

if ($mysqli->multi_query("CALL get_user_and_orders(1)")) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                print_r($row);
            }
            $result->free();
        }
    } while ($mysqli->next_result());
}

여기에서 next_result ()가 의미가 있습니다. 다음 결과 세트를 읽으려고합니다.

여러 결과 세트가 없으면 어떻게됩니까?

실행중인 SQL이 간단한 쿼리와 같은 여러 결과를 반환하지 않으면 다음과 같습니다.

 $mysqli->multi_query("SELECT * FROM users WHERE id = 1");

이때 Next_result ()를 호출합니다.

 $mysqli->next_result();

이것은 다음과 같은 위험을 초래할 수 있습니다.

1. 오류 또는 경고를 트리거합니다

next_result () 자체는 오류를 직접보고하지 않지만 ( 거짓을 반환), 현재 결과 세트를 올바르게 소비하지 않으면 (예 : store_result () 호출)이 호출되면 "sync in sync에서" 오류가 발생할 수 있습니다.

이는 MySQLI의 연결이 잘못된 상태에 있고 내부 PHP 논리는 현재 결과를 처리했는지 여부를 알지 못하기 때문입니다.

2. 자원 누출

현재 결과 세트를 명시 적으로 처리하지 않고 Next_Result () 로 직접 이동하지 않으면 MySQL 서버는 아직 이전 결과를 읽지 않았다고 생각하며 특히 연결 자원 누출을 쉽게 유발할 수있는 루프 또는 배치 호출에서 리소스를 유지합니다.

3. 코드 로직 오류

무의미한 next_result ()는 코드를 여러 결과가있을 것으로 예상되는 것처럼 보일 수 있지만 실제로 유지 보수 비용을 증가시키고 오도하는 논리적 오류입니다.

그것을 사용하는 올바른 방법

다음 _result ()를 사용해야합니다.

  • multi_query ()를 사용하거나 저장 프로 시저를 실행하십시오.

  • SQL이 여러 결과를 반환하는지 확인하십시오.

  • 이전 결과 세트는 next_result ()가 호출되기 전에 소비됩니다.

다음 논리를 캡슐화 할 수도 있습니다.

 if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            // 현재 결과 세트를 처리하십시오
            $result->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}

이 글은 다음 _result ()가 더 많은 결과 세트가있는 경우에만 더 안전합니다.

요약

여러 결과 세트가없는 Next_result ()를 호출하면 리소스의 미숙증, 동기화되지 않은 오류 및 논리적 혼란과 같은 문제가 쉽게 이어질 수 있습니다. 쿼리 구조를 이해하고 여러 결과 세트를 실제로 처리 해야하는지 확인하고 불필요한 호출을 피하십시오.

요컨대, Next_result () 는 다중 레지 포트 세트를 다루는 데 중요한 도구이지만 "올바른 사용"은 "더 많은 사용"보다 중요합니다.