PHP에서 MySQLI 확장을 사용하여 데이터베이스를 쿼리 할 때 많은 개발자가 혼란스러운 질문에 직면하게됩니다. 무슨 일이 일어나고 있습니까? 이 기사는 일반적인 오해를 정리하고 문제의 근본 원인을 찾는 데 도움이됩니다.
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이됩니다. 결과 세트 객체를 올바르게 얻으십시오.
일부 개발자는 $ 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는 이야기 할 방법이 없습니다.
기본적으로 MySQLI는 버퍼링 된 쿼리를 사용하며 Num_rows를 직접 사용할 수 있습니다. 그러나 mysqli_use_result 모드를 사용하는 경우 결과 세트가 스트리밍되고 MySQL은 통과하기 전에 총 행 수를 계산할 수 없습니다.
예:
<?php
$result = $mysqli->query("SELECT * FROM users", MYSQLI_USE_RESULT);
echo $result->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_RESULT 및 NUM_ROWS를 올바르게 사용하고 우회를 피할 수 있습니다.