데이터베이스 작업에 PHP의 MySQLI Extension을 사용하는 경우 Next_Result () 함수는 종종 여러 결과 세트가 포함 된 쿼리 (예 : 여러 SQL 문을 실행하는 Multi_Query () 호출)를 포함하는 쿼리를 처리하는 데 사용됩니다. 그러나 개발자는 때때로 함수가 False를 반환한다는 것을 알게되므로 후속 결과 설정을 사용할 수 없습니다. 그렇다면 next_result ()가 거짓을 반환하는 이유는 무엇입니까? 문제 해결 및 해결 방법은 무엇입니까?
이 기사는이 문제를 자세히 분석합니다.
mysqli :: next_result ()는 multi_query () 와 함께 사용되는 다음 결과 세트로 이동하는 데 사용되는 메소드입니다. 일반적으로 다중 상태 쿼리를 실행할 때는 각 결과를 하나씩 설정하려면이를 사용해야합니다.
기본 사용 예제 :
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
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());
} else {
echo "Query Error: " . $mysqli->error;
}
가장 일반적인 이유는 모든 결과 세트를 읽었 기 때문입니다. 현재 Next_result () 에게 전화하면 "더 이상 결과가 없음" 을 나타냅니다.
솔루션 : 사이클 종료 조건을 합리적으로 제어하면 추가 처리가 필요하지 않습니다.
multi_query () 에 의해 실행 된 다중 SQL 문 중 하나가 실패하면, next_result ()는 false를 반환하고 $ mysqli-> 오류는 특정 오류 정보를 갖습니다.
예:
$sql = "SELECT * FROM valid_table; SELECT * FROM invalid_table;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
// 처리 결과
$result->free();
} else {
if ($mysqli->errno) {
echo "Error: " . $mysqli->error;
break;
}
}
} while ($mysqli->next_result());
}
이전 결과 세트 가 올바르게 릴리스되지 않았거나 store_result () 를 통해 명시 적으로 추출되지 않은 경우, 특히 이전 버전의 PHP 또는 MySQL에서 Next_result ()에 문제가 발생할 수 있습니다.
제안 : 결과 내용을 처리하지 않더라도 항상 $ result-> free () 또는 $ mysqli-> store_result ()를 호출하십시오.
Multi_Query ()는 여러 문을 지원하지만 모든 유형의 문 조합을 지원하지는 않습니다. 예를 들어, 엄격한 모드에서 특정 DDL 문 (예 : 생성 프로 시저 )를 실행하면 제한 될 수 있습니다.
제안 : 모든 진술이 합법적인지 확인하고 필요한 경우 문제를 해결하기 위해 $ mysqli-> 오류를 사용하십시오.
Error_Reporting (E_ALL)을 사용하여 모든 오류 프롬프트를 활성화하십시오.
자세한 오류 정보는 $ mysqli-> errno 및 $ mysqli-> 오류를 확인하십시오.
로깅 : 각 next_result () 반환 값 및 오류 출력을 로그에 쓰십시오.
mysqli_more_results ()를 사용하여 결과 세트가 여전히 있는지 여부를 결정하십시오.
if ($mysqli->more_results()) {
$mysqli->next_result();
}
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders WHERE order_date > '2024-01-01'";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo "데이터: " . implode(", ", $row) . "<br>";
}
$result->free();
} else {
if ($mysqli->errno) {
echo "실수: " . $mysqli->error . "<br>";
}
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo "초기 쿼리가 실패했습니다:" . $mysqli->error;
}