현재 위치: > 최신 기사 목록> 삽입이 실패하면 mysqli_stmt :: $ insert_id의 반환 값이 유효한지 아니면 비정상적인 지 확인하는 방법?

삽입이 실패하면 mysqli_stmt :: $ insert_id의 반환 값이 유효한지 아니면 비정상적인 지 확인하는 방법?

gitbox 2025-09-30

데이터베이스 작업에 PHP의 MySQLI Extension을 사용하는 경우 MySQLI_STMT :: $ insert_id는 주로 마지막 삽입 작업에 의해 생성 된 자동 증가 ID를 얻는 데 사용됩니다. 일반적으로 삽입 작업을 수행 할 때 작업이 성공하면 $ insert_id는 정수 값을 반환하여 방금 삽입 된 레코드의 ID를 나타냅니다. 삽입이 실패하면 일반적으로 0 또는 다른 비정상 값을 반환합니다. 따라서 실제 개발에서 MySQLI_STMT :: $ insert_id 의 반환 값이 유효한지 또는 예외가 발생하는지 여부를 결정하는 방법은 무엇입니까?

1. mysqli_stmt :: $ insert_id 의 기본 기능

mysqli_stmt :: $ insert_idmysqli_stmt 객체의 속성으로,이 명령문에 의해 수행 된 최신 삽입 작업에서 생성 된 자동 증가 ID를 저장합니다. 반환 값의 일반적인 경우는 다음과 같습니다.

  • 삽입을 성공적으로 삽입하면 자동 증가 필드가 있습니다. 삽입 레코드의 자동 증가 ID를 반환합니다.

  • 삽입 실패 : return 0 , 삽입이 성공하지 못했으며 일반적으로 자동 증가 ID가 생성되지 않았 음을 의미합니다.

  • 자동 증가 필드없이 작동을 삽입하십시오 : 자동 증가 필드 세트가 없으면 INSERT_ID는 ID가 생성되지 않으므로 0을 반환합니다.

2. mysqli_stmt :: $ insert_id가 유효한지 확인하십시오

mysqli_stmt :: $ insert_id 의 반환 값이 유효한지 확인하려면 두 가지 핵심 사항을 이해해야합니다.

  • 반환 값이 0 인지 결정합니다.

  • 삽입 작업이 성공했는지 여부를 결정하십시오.

2.1 반환 값이 0 인지 결정하십시오

삽입 작업이 성공하고 자동 증가 필드가 관련되면 $ insert_id는 0 보다 큰 정수를 반환해야합니다. 0 인 경우 다음 상황이 발생할 수 있습니다.

  1. 작동이 실패했습니다 (예 : SQL 오류, 제약 조건 충돌 등).

  2. 현재 테이블에는 자동 증분 필드 세트가 없습니다.

  3. 삽입은 성공적 이었지만 테이블에는 자동 증분 필드 (예 : auto_increment 설정이없는 필드)가 포함되지 않았습니다.

따라서 $ insert_id가 0 인지 여부를 결정하는 것이 매우 중요하지만, 이는 삽입이 성공했는지를 완전히 확인할 수는 없습니다.

2.2 삽입 작업이 성공했는지 여부를 결정하십시오

삽입 작업이 성공했는지 정확하게 결정하려면 $ insert_id를 확인하는 것 외에도 mysqli_stmt :: execute () 또는 mysqli_stmt :: inffected_rows 의 반환 값을 사용하는 것이 가장 좋습니다.

  • mysqli_stmt :: execute () : return true 수단 실행이 성공했고, 잘못된 수단 실행이 실패했음을 의미합니다.

  • mysqli_stmt :: infected_rows : 영향을받는 행의 수를 반환합니다. 0 인 경우 레코드가 삽입되지 않았 음을 의미합니다. SQL 문이 성공적으로 실행 되더라도 삽입 작업은 유효한 것으로 간주 될 수 없습니다.

3. 손잡이 삽입 실패

실제 개발에서 우리는 일반적으로 제약 조건 위반, 필드 유형 불일치 등과 같은 삽입 작업이 실패하는 상황에 직면합니다. 문제를 정확하게 판단하려면 MySQLI_STMT :: $ inSERT_IDMYSQLI_STMT :: 오류를 결합하여 자세한 오류 정보를 얻을 수 있습니다.

3.1 샘플 코드 : ID를 삽입하고 확인하십시오

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 데이터베이스 연결을 만듭니다</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-comment">// 연결이 성공했는지 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 준비하다 SQL 성명</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO my_table (name, age) VALUES (?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);

</span><span><span class="hljs-comment">// 매개 변수를 바인딩하고 실행합니다</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
    </span><span><span class="hljs-comment">// 성공적으로 실행,조사하다 insert_id</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"성공적으로 삽입하십시오,생성 ID 예: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id;
    } </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-string">"성공적으로 삽입하십시오,그러나 자동 증분은 생성되지 않습니다 ID。"</span></span><span>;
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-comment">// 실행 실패,출력 오류 메시지</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"삽입 실패: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error;
}

</span><span><span class="hljs-comment">// 폐쇄 statement 그리고 연결</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

위의 코드에서 삽입 작업 후 먼저 $ stmt-> insert_id를 확인합니다. 리턴 값이 0 보다 크면 삽입이 성공하고 자동 증분 ID가 생성됨을 의미합니다. 리턴 값이 0 인 경우 삽입 작업에 실패했거나 삽입 된 테이블에 자동 증분 필드 설정이 없을 수 있습니다.

3.2 영향을받는 행의 수를 확인하려면 mysqli_stmt :: inffected_rows를 사용하십시오.

insert_id를 확인하기 전에 영향을 받는_rows를 사용하여 인서트가 실제로 실행되는지 여부를 추가로 결정하는 것이 가장 좋습니다.

 <span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;affected_rows &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"성공적으로 삽입하십시오,생성 ID 예: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id;
    } </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-string">"삽입 실패:레코드가 삽입되지 않았습니다。"</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-string">"실행 실패: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error;
}
</span></span>

4. 예외 처리

예외를보다 안정적으로 포착하려면 시도 캐치를 사용하여 가능한 데이터베이스 연결 오류 또는 SQL 오류를 포착 할 수 있습니다. MySQLI 자체는 Try-Catch 메커니즘을 지원하지 않지만 처리를위한 사용자 정의 방법의 예외를 캡슐화 할 수 있습니다.

 <span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO my_table (name, age) VALUES (?, ?)"</span></span><span>);
    </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"si"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);

    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
        </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"삽입 실패: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error);
    }

    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"성공적으로 삽입하십시오,생성 ID 예: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;insert_id;
    } </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-string">"성공적으로 삽입하십시오,그러나 자동 증분은 생성되지 않습니다 ID。"</span></span><span>;
    }
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"예외를 포착하십시오: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>

5. 요약

mysqli_stmt :: $ insert_id가 유효한지 여부를 결정하려면 반환 값이 0 인지 여부에만 의존 할 수 없으며 삽입 작업이 성공했는지 여부와 테이블 구조에 자동 증분 필드가 있는지 결합해야합니다. 작업의 정확성을 보장하려면 Execute ()영향을 받은_rows 의 반환 값을 동시에 확인하고 적절한 예외 처리 메커니즘을 통해 가능한 오류를 포착하여 효과적인 오류 피드백 및 처리를 수행하는 것이 좋습니다.