현재 위치: > 최신 기사 목록> mysqli :: $ inffected_rows】 성공적으로 삽입하지만 영향을받는 0 행을 반환합니까? 가능한 이유를 한 번에 설명하십시오

mysqli :: $ inffected_rows】 성공적으로 삽입하지만 영향을받는 0 행을 반환합니까? 가능한 이유를 한 번에 설명하십시오

gitbox 2025-08-16

데이터베이스 작업에 PHP의 MySQLI 확장을 사용하는 경우 일반적으로 SQL 문을 실행 한 후 MySQLI :: $ inffected_rows 속성을 사용하여 영향을받는 행의 수를 얻습니다. 이 속성은 삽입, 업데이트 또는 삭제 후 작업을 수행 한 후 변경된 실제 데이터베이스 레코드 행 수를 반환합니다. 그러나 때로는 데이터가 성공적으로 삽입 되더라도 mysqli :: $ inffected_rows가 영향을받는 0 행을 반환하며 삽입이 적용되지 않는 것으로 보입니다. 그렇다면 그 이유는 무엇입니까? 이 기사는 문제를 신속하게 찾는 데 도움이되는 몇 가지 일반적인 이유를 자세히 분석합니다.

1. 삽입 무시 또는 대체 명령문을 사용하십시오

삽입 무시 또는 교체 명령문을 사용하는 경우 삽입 된 레코드가 기존 레코드와 동일하거나 고유성 제약 조건 (예 : 기본 키 또는 고유 인덱스)을 위반하는 경우 데이터베이스는 삽입 작업을 수행하지 않습니다. 현재 SQL 문이 실행되지만 실제로는 데이터베이스에 삽입되지 않으므로 mysqli :: $ infected_rows는 0을 반환합니다.이 상황이 삽입이 실패한다는 것을 의미하지는 않지만 새 레코드가 추가되지 않기 때문에 주목해야합니다.

예:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT IGNORE INTO users (id, name) VALUES (1, 'Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// 만약에 ID ~을 위한 1 사용자는 이미 존재합니다,반품 0</span></span><span>
</span></span>

2. 자동으로 생성 된 자체 증가 ID

Auto_increment AutoinCrement 필드를 사용하는 경우, 삽입 된 레코드 데이터가 필드를 업데이트하지 못하면 MySQLI :: $ 영향을받는 _rows는 0을 반환 할 수 있습니다. 예를 들어, 삽입 된 데이터가 이미 고유 한 제약 조건을 포함하고 있으며이 필드의 값이 이미 존재하지만 삽입 작업이 성공적이지만 새로운 행이 생성되고 0 이되지 않음 0이됩니다.

예:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (id, name) VALUES (1, 'Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// 만약에 ID ~을 위한 1 레코드는 이미 존재합니다,반품 0</span></span><span>
</span></span>

3. 삽입 후 변경되지 않은 시나리오가 실행됩니다.

때로는 삽입 문이 실행되는 상황이 발생할 수 있지만, 특히 배치 삽입에서 반환 된 영향을받는 _Rows는 0입니다. 삽입 된 데이터가 이미 존재하고 고유성 제약 조건을 위반하지 않으면 삽입 문이 성공적으로 실행되지만 데이터베이스는 변경 사항이 변경되지 않았으며 영향을 받는_rows는 0으로 표시됩니다.

예:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (id, name) VALUES (1, 'Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// 만약에 ID 1 레코드는 이미 존재합니다并且没有违反唯一约束,반품 0</span></span><span>
</span></span>

4. 거래는 커밋되거나 롤백되지 않습니다

트랜잭션을 사용하는 경우 삽입 작업은 거래가 커밋 된 후에 만 적용됩니다. 트랜잭션 실행 중에 오류가 발생하거나 트랜잭션 이 수동으로 롤백되는 경우 삽입 문이 성공적으로 실행되는 것처럼 보이도 데이터베이스는 실제로 데이터를 삽입하지 않습니다. 따라서 영향을받는 _rows 도 0 일 수 있습니다.

예:

 <span><span><span class="hljs-title function_ invoke__">mysqli_begin_transaction</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);

</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name) VALUES ('Alice')"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-comment">// 일부 조건이 롤백을 유발한다고 가정합니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mysqli_rollback</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);  </span><span><span class="hljs-comment">// 반품 0,因~을 위한事务已回滚</span></span><span>
</span></span>

5. 데이터베이스 연결 또는 SQL 실행은 성공을 확인하지 않았습니다.

MySQLI 로 SQL을 실행할 때 때로는 데이터베이스 연결이 성공했는지 여부를 확인하지 않거나 SQL 문을 실행하는 데 오류가 발생하지 않습니다. mysqli_query () 실행이 실패하면 실제로는 아무것도 수행되지 않기 때문에 반환 된 영향을 받는_rows 는 0 일 가능성이 높습니다. 따라서 데이터베이스 작업을 수행 할 때 각 쿼리 실행 결과를 확인하여 SQL 오류 또는 데이터베이스 연결 문제가 없는지 확인하십시오.

예:

 <span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name) VALUES ('Alice')"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysqli_query</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>, </span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"SQL 실행 실패: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">mysqli_error</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli_affected_rows</span></span><span>(</span><span><span class="hljs-variable">$link</span></span><span>);
}
</span></span>

6. 데이터베이스 설정 또는 기타 구성 문제

일부 데이터베이스 설정으로 인해 영향을받는 _rows가 0을 반환 할 수 있습니다. 예를 들어, SQL_MODE 와 관련된 MySQL 구성 에 일부 설정이있을 수 있습니다. strict_trans_tables 모드가 활성화되고 삽입 된 데이터가 특정 제한을 위반하는 경우 MySQL은 삽입 작업을 수행하지 않아 0을 반환 할 수 있습니다.

결론적으로

PHP의 MySQLI 확장자를 사용하는 경우 MySQLI :: $ infectreped_rows 의 영향을 0 줄을 반환하는 것은 드문 일이 아닙니다. 일반적으로 이것은 SQL 문의 실행이 데이터베이스의 데이터를 변경하지 않음을 나타냅니다. 이 문제를 해결할 때 SQL 문 자체, 데이터베이스 설정, 트랜잭션 처리, 데이터 무결성 등과 같은 여러 측면에서 문제를 확인할 수 있습니다. 이러한 일반적인 원인을 이해하면 문제를 신속하게 찾아서 해결하는 데 도움이 될 수 있습니다.