데이터베이스 작업에 PHP의 MySQLI 확장을 사용할 때 업데이트 문은 가장 일반적으로 사용되는 SQL 작업 중 하나입니다. 그러나 많은 개발자들은 업데이트 작업을 수행 할 때 중요한 세부 사항을 무시합니다. 업데이트를 수행하기 전에 실제로 일치하는 레코드가 있는지 확인하지 않습니다. 이 무지는 mysqli :: $ inffected_rows 속성의 값에 직접적인 영향을 미치며, 이는 프로그램 논리 오류 또는 비정상적인 동작으로 이어질 수 있습니다.
MySQLI에서 $ mysqli-> inffected_rows는 데이터 수정 작업 (예 : 삽입 , 업데이트 또는 삭제 )마다 영향을받는 행의 수를 반환합니다. 이 값은 많은 애플리케이션 시나리오에서 작업이 성공했는지 여부를 결정하기 위해 사용됩니다. 작동 로그 등을 기록하는 데 사용됩니다.
예를 들어:
<code> $ mysqli = new mysqli ( "localhost", "user", "pass", "database");$ mysqli-> query ( "업데이트 사용자 set status = 'active'where last_login <now () - 간격 30 일");
echo $ mysqli-> infected_rows;
</코드>
이 코드는 영향을받는 줄의 수, 즉 상태를 성공적으로 업데이트 한 사용자 수를 출력합니다.
$ mysqli-> infected_rows 실행 된 업데이트 문이 레코드와 일치하지 않으면 0을 반환합니다. 구문이 올바른지 또는 SQL이 성공적으로 실행되는지 여부에 관계없이 레코드가 수정되지 않기 때문에 영향을받는 행의 수는 0으로 남아 있습니다.
참고 : SQL 명령문 구문이 완전히 정확하더라도 상태가 데이터에 도달하지 않으면 영향을 받는_rows는 여전히 0입니다. 그렇다고 SQL 실행이 실패했다는 의미는 아닙니다.
예를 들어:
<code> $ mysqli = new mysqli ( "localhost", "user", "pass", "database");$ mysqli-> query ( "업데이트 사용자 set status = 'active'여기서 id = 999999");
echo $ mysqli-> infected_rows;
</코드>
ID = 99999가 있는 사용자가 존재하지 않는다고 가정하면 출력은 0 이므로 레코드가 업데이트되지 않았 음을 나타냅니다.
또한 쉽게 오해 할 수있는 또 다른 상황이 있습니다. 레코드가 일치하더라도 업데이트 된 값이 원래 값과 동일하면 영향을받는 행의 수로 계산되지 않습니다.
예를 들어:
<code> $ mysqli = new mysqli ( "localhost", "user", "pass", "database");$ mysqli-> query ( "업데이트 사용자 set status = 'active'where status = 'active'");
echo $ mysqli-> infected_rows;
</코드>
이 코드에서는 상태 필드가 이미 '활성' 이므로 많은 줄이 일치 할 수 있지만 실제 데이터 수정 작업은 발생하지 않습니다. MySQL은 행이 "영향을받지"고 반환 한다고 생각합니다.
영향을받는 _rows 에 의존하여 작업이 성공했는지 여부를 결정하는 경우 다음 두 가지 점을 고려해야합니다.
SQL 실행이 성공 여부 ( $ mysqli-> errno 또는 $ mysqli-> 오류 로 판단 할 수 있음)
영향을받는 _rows가 긍정적 값인지 여부는 데이터가 실제로 수정되었음을 의미합니다.
Complete example:
<code> $ mysqli = new mysqli ( "localhost", "user", "pass", "database");$ result = $ mysqli-> query ( "업데이트 사용자 set status = 'inactive'where last_login <now () - 간격 1 년");
if ($ result === false) {
다이 ( "SQL 오류 :". $ mysqli-> error);
} elseif ($ mysqli-> inffected_rows> 0) {
echo "{$ mysqli-> infected_rows} 레코드를 성공적으로 업데이트했습니다.";
} 또 다른 {
Echo "레코드가 업데이트되지 않습니다.";
}
</코드>
관리 시스템이나 인터페이스를 구축 할 때 개발자는 고객의 들어오는 조건이 영향을 받는_rows를 반환하여 모든 데이터에 도달했는지 확인할 수 있습니다. 이 메커니즘이 없으면 클라이언트가 업데이트에 실패했거나 서버 오류가 잘못되었다고 잘못 생각하게 할 수 있습니다.
예를 들어 인터페이스 :
<code> post /api/update-status.php?user_id=123 http/1.1 호스트 : m66.net </code>사용자 ID가 존재하지 않고 인터페이스 코드가 영향을 받은_Rows를 기반으로 작업이 성공했는지 여부 만 결정하면 클라이언트가 시스템에 오류가 있다고 잘못 생각할 수 있습니다. 보다 명시적인 응답 정보를 통해 "작동 실패"가 아닌 "일치하는 레코드 없음"이라는 점에 유의해야합니다.
PHP의 MySQLI 작업에서 $ mysqli-> infected_rows는 데이터가 실제로 변경되는지 여부를 결정하는 중요한 수단입니다. 그러나 주목하는 것이 중요합니다.
일치하는 레코드가 없으면 값은 0 입니다.
레코드와 일치했지만 업데이트 전후의 데이터는 동일하며 0 도 반환됩니다.
SQL 실행 오류는 영향을 받는_rows 에 반영되지 않으며 추가 판단이 필요합니다.
이 속성을 사용할 때 개발자는 자신의 동작을 완전히 이해하고 논리적 취약성 또는 업데이트 결과를 잘못 판단하지 않아야합니다.