<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
$sql = "INSERT INTO users (username, email) VALUES ('testuser', '[email protected]')";
$mysqli->query($sql);
echo "영향을받는 행의 수:" . $mysqli->affected_rows;
?>
위의 코드에서는 새 데이터가 삽입되고 $ fiffected_rows는 1을 반환해야하므로 행이 삽입되었음을 나타냅니다.
원인 : 삽입물을 실행하는 경우 ... 중복 키 업데이트 문서에서 실제로 데이터를 업데이트하지 않으면 MySQL 버전에 따라 $ inffected_rows가 2 또는 0을 반환 할 수 있습니다.
설명 :
MySQL 5.1 이하에서 중복 키 업데이트 에서 영향을받는 행의 수는 1 (삽입) 또는 2 (업데이트)입니다.
MySQL 5.7 이후 실제로 데이터가 업데이트되지 않으면 0이 반환됩니다.
해결하다 :
자세한 내용은 $ mysqli-> 정보를 확인하거나 필요에 따라 논리를 조정할 수 있습니다.
<?php
$sql = "INSERT INTO users (username) VALUES ('user1');";
$sql .= "INSERT INTO users (username) VALUES ('user2');";
$mysqli->multi_query($sql);
do {
if ($result = $mysqli->store_result()) {
$result->free();
}
echo "영향을받는 행의 수:" . $mysqli->affected_rows . "\n";
} while ($mysqli->more_results() && $mysqli->next_result());
?>
참고 : $ inffected_rows는 마지막으로 실행 된 쿼리입니다. 배치로 여러 문장을 실행하는 경우 각 문에 대한 영향을받는 행의 수를 정확하게 얻기 위해 결과를 하나씩 처리해야합니다.
$ inffected_rows는 쓰기 작업 (삽입, 업데이트, 삭제)에만 유효합니다. SELECT 문은 행 카운트에 영향을 미치지 않으며 -1을 반환합니다.
선택 쿼리가 얼마나 많은 결과를 반환하는지 알고 싶다면 $ result-> num_rows를 사용해야합니다.
거래되지 않음 : 트랜잭션이 활성화되어 커밋되지 않은 경우 $ inffected_rows는 여전히 영향을받는 실제 행 수를 반영하지만 데이터는 데이터베이스에 커밋되지 않습니다.
트리거 충격 : MySQL 트리거 실행 중 행 수정은 PHP에서 $ Inffected_rows 의 값을 변경하지 않습니다.
연결 상태 : MySQLI 연결이 정상인지 확인하고 $ infected_rows가 -1을 오류로 반환 할 수 있습니다.
$ mysqli-> 오류를 사용하여 SQL 오류를 확인하십시오.
$ mysqli-> info를 사용하여 가장 최근에 실행 된 문의 세부 사항을보십시오.
MySQL 로그를 켜거나 도구를 사용하여 실행 된 SQL이 예상되는 SQL과 일치하는지 확인하십시오.
mysqli :: $ inffected_rows는 쓰기 작업에 영향을 미치는 행의 수를 감지하는 효과적인 도구이지만 다음 상황에서는 혼동하기 쉽습니다.
복잡한 SQL (예 : 중복 키 업데이트 )을 사용하는 경우 반품 값 규칙에 특별한주의를 기울여야합니다.
여러 SQL 배치가 실행되면 결과를 하나씩 처리해야합니다.
select 문은 행의 수에 영향을 미치지 않으며 대신 $ result-> num_rows를 사용합니다.
거래, 트리거 등은 실제 성능에도 영향을 줄 수 있습니다.
작업 원칙 및 경계 조건을 이해하는 한 $ infected_rows는 데이터베이스 작동 효과를 정확하게 판단하고 코드 견고성을 향상시키는 데 도움이 될 수 있습니다.