Next_result ()는 데이터베이스 다중 쿼리 작업에 PHP의 MySQLI 확장을 사용할 때 중요한 기능입니다. 저장된 절차 후 여러 결과 세트를 처리하거나 한 번에 여러 SQL 문을 보내는 데 사용됩니다. 그러나 많은 개발자들은 next_result ()를 사용할 때 세부 사항을 무시합니다. next_result ()를 호출하기 전에 심각한 문제가 발생할 수 있습니다.
mysqli :: multi_query ()를 사용하여 여러 SQL 문을 실행할 때 각 문은 결과 세트를 반환 할 수 있습니다. 현재 결과 세트를 처리하려면 store_result () 또는 use_result ()를 사용한 다음 Next_result ()를 사용하여 다음 결과 세트로 이동해야합니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM products;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free(); // 매우 중요한 단계
}
} while ($mysqli->next_result());
}
mysqli :: next_result ()는 현재 결과 세트가 지워지거나 릴리스되는 한 작동합니다. store_result () 또는 free () 단계를 건너 뛰면 Next_result ()가 다음 결과 세트로 올바르게 이동하지 않아서 후속 쿼리 결과가 처리되지 않을 수 있습니다.
가장 일반적인 오류 메시지는 다음과 같습니다.
Commands out of sync; you can't run this command now
이 오류는 현재 결과 세트를 처리하기 전에 새 쿼리를 실행하거나 다음 결과 세트에 액세스하는 등 MySQL에서 잘못된 작업 순서가 있음을 의미합니다.
PHP의 쓰레기 수집 메커니즘은 일반적으로 자원을 자동으로 처리 할 수 있지만, 대규모 데이터 볼륨 또는 긴 연결 시나리오에서 현재 결과 세트가 수동으로 자유롭지 않은 경우 () 이면 메모리 성장이 느려서 궁극적으로 애플리케이션 성능에 영향을 줄 수 있습니다.
항상 store_result () 및 free ()를 호출하십시오.
명확한 루프 구조를 사용하여 각 결과 세트가 깨끗하게 처리되도록하십시오.
논리적 미스를 피하기 위해 각 단계에 대한 오류 검사를 추가하십시오.
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// 처리 결과
$result->free();
} else {
if ($mysqli->errno) {
echo "쿼리가 실패했습니다: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
multi_query () 및 next_result ()를 사용하는 경우 다음을 기억하십시오 : 다음 결과 세트를 처리하기 전에 다음을 요청하기 전에 데이터베이스와 잘 상호 작용할 수있는 기본 에티켓입니다. 그렇지 않으면 곧 Gitbox.net 의 버그 제출 시스템에서 많은 설명 할 수없는 "동기화 된"오류가 표시 될 수 있습니다.