현재 위치: > 최신 기사 목록> num_rows가 0을 반환하는 이유는 무엇입니까? 일반적인 오해 분석

num_rows가 0을 반환하는 이유는 무엇입니까? 일반적인 오해 분석

M66 2025-05-31

PHP에서 MySQLI 확장을 사용하여 데이터베이스를 쿼리 할 때 많은 개발자가 혼란스러운 질문에 직면하게됩니다. 무슨 일이 일어나고 있습니까? 이 기사는 일반적인 오해를 정리하고 문제의 근본 원인을 찾는 데 도움이됩니다.

오해 1 : mysqli_multi_query가 사용되었습니다

mysqli_multi_query 는 여러 SQL 문을 한 번에 실행할 수있는 메소드이지만 부울 값을 반환하며 실제 결과 세트는 mysqli_store_result 또는 mysqli_use_result 를 통해 얻습니다.

샘플 코드 :

 <?php
$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()) {
            echo "현재 결과 세트 행 카운트: " . $result->num_rows . "<br>";
            $result->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}
?>

Multi_Query 리턴 값으로 Num_rows를 호출하려고하면 물론 0이됩니다. 결과 세트 객체를 올바르게 얻으십시오.

오해 2 : 쿼리 실행을 잊었습니다

일부 개발자는 $ stmt = $ mysqli-> 준비 (...) 를 작성한 다음 $ stmt-> num_rows를 직접 사용했지만 참고 : 준비는 쿼리를 실행하지 않으며 준비입니다.

쿼리를 먼저 실행해야하며 결과를 얻어야합니다.

 <?php
$stmt = $mysqli->prepare("SELECT * FROM users WHERE age > ?");
$stmt->bind_param("i", $age);
$age = 18;
$stmt->execute();
$result = $stmt->get_result();
echo "행의 수: " . $result->num_rows;
?>

실행 또는 get_result를 건너 뛰면 NUM_ROWS는 이야기 할 방법이 없습니다.

오해 3 : 부패하지 않은 쿼리가 사용되었습니다

기본적으로 MySQLI는 버퍼링 된 쿼리를 사용하며 Num_rows를 직접 사용할 수 있습니다. 그러나 mysqli_use_result 모드를 사용하는 경우 결과 세트가 스트리밍되고 MySQL은 통과하기 전에 총 행 수를 계산할 수 없습니다.

예:

 <?php
$result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT);
echo $result->num_rows; // 실수:此时无法获取행의 수

해결책은 기본 버퍼링 모드를 사용하거나 통계를 직접 반복하는 것입니다.

오해 4 : num_rows 의 의미를 오해

많은 사람들이 실수로 NUM_ROWS가 삽입 , 업데이트삭제 에 사용될 수 있다고 믿습니다. 실제로 이러한 작업에는 결과 세트가 없으므로 $ mysqli-> infected_rows를 사용해야합니다.

 <?php
$mysqli->query("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "受影响的행의 수: " . $mysqli->affected_rows;
?>

기억하십시오 : Select Query에서 생성 된 결과 세트 만 NUM_ROWS를 가지고 있습니다.

요약

num_rows가 항상 0을 반환하면 먼저 확인하십시오.

? Multi_Query를 사용했지만 결과 세트를 얻지 못했습니까?
? 준비 후 실행하고 get_result를 실행하는 것을 잊었습니까?
? 부패하지 않은 모드를 사용 했습니까?
? 쿼리 유형이 잘못 되었습니까?

이러한 오해를 피하면 MySQLI_RESULTNUM_ROWS를 올바르게 사용하고 우회를 피할 수 있습니다.