PHP에서 데이터베이스 작업에 MySQLI 확장을 사용할 때는 종종 메모리 누출을 피하기 위해 실행 결과 세트를 제거하기 위해 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 () 메소드는 존재하지 않는 결과 세트를 자유롭게하려고합니다.
쿼리 유형 불일치 :
비 선택 유형의 쿼리가 실행되면 (예 : 삽입, 업데이트, 삭제 등)이 쿼리는 결과 세트를 생성하지 않으므로 free_result () 호출하면이 오류가 발생합니다.
해결책 :
select 쿼리 이후에만 free_result ()가 호출되는지 확인하십시오.
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$stmt->execute();
// 전화하지 마십시오 free_result(),결과 세트가 없기 때문입니다
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(); // 이제 안전합니다
쿼리는 성공적으로 실행되지 않았습니다 .
어떤 이유로 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();
}
사전 진술 :
쿼리를 실행하고 결과를 저장하기 전에 쿼리 명령문이 사전에 닫히면 ( $ 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(); // 마지막 진술
쿼리는 빈 결과 세트를 반환합니다 .
선택 쿼리가 결과를 반환하지 않으면 (예 : 쿼리 조건이 일치하지 않음), 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 쿼리가 성공적으로 실행되는지 확인하십시오.
문을 닫기 전에 모든 작업을 완료하십시오.
위의 방법과 기술을 통해이 오류를 효과적으로 피할 수 있으며 데이터베이스 작동을 원활하게 보장 할 수 있습니다.