현재 위치: > 최신 기사 목록> 업데이트 작업을 수행 할 때 행이 일치하는지 여부를 확인하는 것을 잊어 버렸습니다. mysqli :: $ inffected_rows의 가치에 어떤 영향을 미칩니 까?

업데이트 작업을 수행 할 때 행이 일치하는지 여부를 확인하는 것을 잊어 버렸습니다. mysqli :: $ inffected_rows의 가치에 어떤 영향을 미칩니 까?

M66 2025-06-29

데이터베이스 작업에 PHP의 MySQLI 확장을 사용할 때 업데이트 문은 가장 일반적으로 사용되는 SQL 작업 중 하나입니다. 그러나 많은 개발자들은 업데이트 작업을 수행 할 때 중요한 세부 사항을 무시합니다. 업데이트를 수행하기 전에 실제로 일치하는 레코드가 있는지 확인하지 않습니다. 이 무지는 mysqli :: $ inffected_rows 속성의 값에 직접적인 영향을 미치며, 이는 프로그램 논리 오류 또는 비정상적인 동작으로 이어질 수 있습니다.

1. mysqli :: $ infected_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;
</코드>

이 코드는 영향을받는 줄의 수, 즉 상태를 성공적으로 업데이트 한 사용자 수를 출력합니다.

2. 일치하는 행이 없을 때 행동

$ 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 이므로 레코드가 업데이트되지 않았 음을 나타냅니다.

3. 데이터가 변경되지 않은 경우

또한 쉽게 오해 할 수있는 또 다른 상황이 있습니다. 레코드가 일치하더라도 업데이트 된 값이 원래 값과 동일하면 영향을받는 행의 수로 계산되지 않습니다.

예를 들어:

<code> $ mysqli = new mysqli ( "localhost", "user", "pass", "database");

$ mysqli-> query ( "업데이트 사용자 set status = 'active'where status = 'active'");

echo $ mysqli-> infected_rows;
</코드>

이 코드에서는 상태 필드가 이미 '활성' 이므로 많은 줄이 일치 할 수 있지만 실제 데이터 수정 작업은 발생하지 않습니다. MySQL은 행이 "영향을받지"고 반환 한다고 생각합니다.

4. 영향을받는 _rows를 처리하는 올바른 방법

영향을받는 _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 "레코드가 업데이트되지 않습니다.";
}
</코드>

5. 실제 사례를 상기시켜줍니다

관리 시스템이나 인터페이스를 구축 할 때 개발자는 고객의 들어오는 조건이 영향을 받는_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 에 반영되지 않으며 추가 판단이 필요합니다.

이 속성을 사용할 때 개발자는 자신의 동작을 완전히 이해하고 논리적 취약성 또는 업데이트 결과를 잘못 판단하지 않아야합니다.