현재 위치: > 최신 기사 목록> mysqli_stmt :: free_result 이유를 고정하고 "결과 세트 없음"오류에 대한 수정

mysqli_stmt :: free_result 이유를 고정하고 "결과 세트 없음"오류에 대한 수정

gitbox 2025-06-07

PHP에서 데이터베이스 작업에 MySQLI 확장을 사용할 때는 종종 메모리 누출을 피하기 위해 실행 결과 세트를 제거하기 위해 MySQLI_STMT :: FREE_RESULT ()를 사용해야합니다. 그러나 실제 개발에서는 mysqli_stmt :: free_result 오류 "결과 세트 없음"의 문제가 발생할 수 있습니다. 이 기사는이 문제의 일반적인 원인과 해당 솔루션을 자세히 분석합니다.

mysqli_stmt :: free_result 란 무엇입니까?

mysqli_stmt :: free_result ()는 쿼리 결과 세트를 해제하는 MySQLI 확장 방법의 메소드입니다. 일반적으로 선택 쿼리를 실행 한 후 결과 세트가 더 이상 필요하지 않은 경우이 방법을 호출하면 메모리를 확보하고 리소스 소비를 줄일 수 있습니다.

예를 들어:

 $stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$stmt->store_result();  // 저장 결과
// 현재 데이터 처리를 수행 할 수 있습니다...
$stmt->free_result();  // 결과 세트를 릴리스하십시오

오류 설명 : "결과 세트 없음"

"결과 세트 없음"오류는 일반적으로 free_result () 가 호출되거나 프로그램이 쿼리 작업을 수행하지 않거나 쿼리가 결과 세트를 반환하지 않을 때 발생합니다. 구체적으로, 오류는 다음을 의미합니다. free_result () 메소드는 존재하지 않는 결과 세트를 자유롭게하려고합니다.

일반적인 원인 분석

  1. 쿼리 유형 불일치 :
    비 선택 유형의 쿼리가 실행되면 (예 : 삽입, 업데이트, 삭제 등)이 쿼리는 결과 세트를 생성하지 않으므로 free_result () 호출하면이 오류가 발생합니다.

    해결책 :
    select 쿼리 이후에만 free_result ()가 호출되는지 확인하십시오.

     $stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
    $stmt->bind_param("ss", $name, $email);
    $stmt->execute();
    // 전화하지 마십시오 free_result(),결과 세트가 없기 때문입니다
    
  2. store_result () 또는 bind_result ()가 호출되지 않습니다 .
    선택 쿼리가 실행되면 store_result () 또는 bind_result ()가 호출 된 경우에만 결과 세트가 생성됩니다. free_result () 가 결과 세트를 생성하지 않고 호출되면 오류 가보고됩니다.

    해결책 :
    free_result ()를 호출하기 전에 store_result () 또는 bind_result ()가 호출되었는지 확인하십시오.

     $stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $stmt->store_result();  // 결과 세트가 저장되어 있는지 확인하십시오
    $stmt->free_result();   // 이제 안전합니다
    
  3. 쿼리는 성공적으로 실행되지 않았습니다 .
    어떤 이유로 SQL 쿼리가 성공적으로 실행되지 않으면 (예 : 구문 오류, 연결 문제 등) 반환 할 결과 설정이 없으며 free_result ()를 호출 할 때 오류 가보고됩니다.

    해결책 :
    SQL 쿼리가 성공적으로 실행되었는지 확인한 다음 free_result ()를 호출하십시오. 이 문제는 쿼리가 성공적으로 실행되었는지 확인하여 피할 수 있습니다.

     $stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
    if ($stmt === false) {
        die('MySQL prepare failed: ' . $mysqli->error);
    }
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    if ($stmt->affected_rows > 0) {
        $stmt->store_result();
        $stmt->free_result();
    }
    
  4. 사전 진술 :
    쿼리를 실행하고 결과를 저장하기 전에 쿼리 명령문이 사전에 닫히면 ( $ stmt-> close () )이면 쿼리 결과가 접근 할 수 없게되며 free_result ()를 호출 할 때 오류가 발생합니다.

    해결책 :
    쿼리 처리를 완료 한 후 명세서를 닫으십시오.

     $stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $stmt->store_result();  // 必须先저장 결과
    $stmt->free_result();   // 그런 다음 결과를 해제 할 수 있습니다
    $stmt->close();         // 마지막 진술
    
  5. 쿼리는 빈 결과 세트를 반환합니다 .
    선택 쿼리가 결과를 반환하지 않으면 (예 : 쿼리 조건이 일치하지 않음), free_result () 호출은 일반적으로 오류를보고하지 않지만 일부 구성이나 환경에서는 일관되지 않은 동작이 발생할 수 있습니다. 이것은 오류의 직접적인 원인이 아니지만 때로는 예상치 못한 다른 문제를 일으킬 수 있습니다.

    해결책 :
    free_result ()를 호출하기 전에 쿼리가 데이터를 반환하는지 확인하십시오.

     $stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $stmt->store_result();
    
    if ($stmt->num_rows > 0) {
        // 결과가 있습니다
        $stmt->free_result();
    } else {
        echo "결과가 발견되지 않았습니다";
    }
    

결론적으로

mysqli_stmt :: free_result 오류 "결과 세트 없음"은 일반적으로 쿼리가 결과 세트를 반환하지 않거나 free_result () 가 store_result () 또는 bind_result ()를 올바르게 호출하지 않고 호출됩니다. 이러한 오류를 피하기 위해 개발자는 다음 사항에주의를 기울여야합니다.

  • select 쿼리 이후에만 free_result ()가 호출되는지 확인하십시오.

  • free_result ()를 호출하기 전에 store_result () 또는 bind_result () 를 실행하십시오.

  • SQL 쿼리가 성공적으로 실행되는지 확인하십시오.

  • 문을 닫기 전에 모든 작업을 완료하십시오.

위의 방법과 기술을 통해이 오류를 효과적으로 피할 수 있으며 데이터베이스 작동을 원활하게 보장 할 수 있습니다.