현재 위치: > 최신 기사 목록> mysqli :: $ inffected_rows】 multi-query (multi_query)에서 사용하기위한 예방 조치

mysqli :: $ inffected_rows】 multi-query (multi_query)에서 사용하기위한 예방 조치

gitbox 2025-05-28

데이터베이스 작업에 PHP의 MySQLI Extension을 사용할 때 Multi_Query 기능을 사용하면 한 번에 여러 SQL 문을 실행할 수 있습니다. 이는 데이터를 배치 할 때 매우 편리합니다. 그러나 여러 문장을 실행 한 후 영향을받는 행 수 ( 영향을받는 _rows )를 올바르게 얻는 방법이 일반적인 질문이되었습니다.

이 기사는 mysqli :: $ inffected_rows 속성을 결합하여 올바르게 사용하는 방법과 Multi_Query 시나리오에서주의를 기울여야하는 문제를 설명합니다.


1. mysqli의 기본 사용 :: $ infected_rows

mysqli :: $ inffected_rows는 MySQLI 객체의 속성으로, 가장 최근의 삽입 , 업데이트 또는 삭제 명령문의 실행에 영향을받는 행의 수를 나타냅니다. 단일 SQL 문은 실행하기에 매우 직관적입니다.

 $mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->query("UPDATE users SET status=1 WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "영향을받는 행의 수: " . $mysqli->affected_rows;

이 업데이트 명령문을 실행 한 후 영향을 받는_rows는 영향을받는 줄 수입니다.


2. Multi_Query영향을 받은_rows 의 관계

Multi_Query는 여러 SQL 문을 한 번에 실행할 수 있습니다.

 $sql = "UPDATE users SET status=1 WHERE id=1;";
$sql .= "UPDATE users SET status=2 WHERE id=2;";
$mysqli->multi_query($sql);

그러나 현재 영향을받는 _rows 의 가치는 무엇입니까? 답은 다음과 같습니다. 영향을받는 _rows는 현재 처리중인 결과 세트에 해당하는 영향을받는 행의 수만 반영합니다. Multi_Query는 각 문의 결과를 통해 반복해야하므로 하나씩 검색해야합니다.


3. Multi_Query 의 각 명령문에 대해 영향을 받는_rows를 올바르게 얻습니다

샘플 코드 :

 $mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');

$sql = "UPDATE users SET status=1 WHERE id=1;";
$sql .= "UPDATE users SET status=2 WHERE id=2;";
$sql .= "DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;";

if ($mysqli->multi_query($sql)) {
    do {
        // 현재 결과에 대한 영향을받는 행 수를 얻으십시오.
        echo "영향을받는 행의 수: " . $mysqli->affected_rows . "\n";

        // 다음 결과를 처리 할 준비를하십시오
    } while ($mysqli->more_results() && $mysqli->next_result());
} else {
    echo "실행 실패: " . $mysqli->error;
}

여기서 우리는 do ... while 루프를 사용하여 진술을 하나씩 처리합니다. 각각의 실행 후, 우리는 각 명령문의 영향을받는 행의 수를 정확하게 얻기 위해 현재 영향을 받는_rows를 읽습니다.


4. 영향을받는 _rows를 사용할 때주의를 기울여야 할 몇 가지 문제

  1. Multi_Query는 다음 _result () 와 협력하여 결과를 하나씩 가로 지르려면 <br> next_result () 에게 전화하지 않으면 첫 번째 문의 영향을받는 _row 만 얻을 수 있으며 후속 진술은 무시됩니다.

  2. 일부 진술은 행의 수에 영향을 미치지 않을 수 있습니다 <br> 예를 들어, select 문은 -1을 반환합니다. 데이터를 수정하는 명령문에는 유효합니다.

  3. 오류가 발생하면 영향을받는 _rows는 -1 일 수 있습니다
    SQL 문이 실행되지 않으면 영향을 받는_rows는 -1을 반환합니다. 현재 $ mysqli-> 오류를 통해 오류 메시지를 얻어야합니다.

  4. 거래를 처리 할 때 일관성에주의하십시오 <br> 트랜잭션에서 다중 명세서가 실행되면 단일 명세서의 영향을받는 랑 즈는 거래의 전체 최종 상태를 보장 할 수 없으며 거래 커밋 및 롤백을 기반으로 제어해야합니다.


5. 요약

  • Multi_Query가 여러 SQL을 실행하면 Loop을 사용하여 Next_result () 와 협력하여 모든 결과를 가로 지르십시오.

  • 각 명령문이 실행 된 후, 영향을 받는_rows 는 현재 문의 영향을받는 행의 수입니다.

  • 오류 상태 감지 및 영향을받는 _rows 에 대한 특별 명세서의 반환 값을 감지하는 데주의를 기울이십시오.

  • 거래를 운영 할 때, 영향을받는 행의 수는 보조 판단 일뿐이며 최종 상태는 거래 커밋 결과에 따릅니다.

위의 점을 마스터하면 MySQLI :: $ inffected_rowsMulti_Query를 올바르게 사용하여 여러 SQL 실행 및 결과 처리를 수행 할 수 있습니다.