PHP에서 pdostatement :: RowCount 메소드는 영향을받는 행의 수를 얻는 데 사용됩니다. 이 방법은 일반적으로 삽입 , 업데이트 또는 삭제 와 같은 SQL 문을 실행 한 후 작동에 영향을 미치는 데이터의 수를 확인하는 데 사용됩니다. 그러나 때로는 RowCount가 예상 한 것과 다른 수의 행을 반환합니다. 이 상황은 여러 요인으로 인해 발생할 수 있으며이 기사는 몇 가지 일반적인 이유를 자세히 소개합니다.
Select 문의 경우 RowCount 의 동작은 데이터베이스 드라이버 및 데이터베이스 관리 시스템 (DBMS)에 따라 다를 수 있습니다. 예를 들어:
MySQL : Select Queries의 경우 RowCount가 항상 실제 행 수를 반환하지는 않습니다. 일반적으로 삭제 , 업데이트 등과 같은 문의 후에 만 수정 된 행 수를 반환합니다. 선택 쿼리에서는 여러 행의 데이터가 실제로 반환 되더라도 0 또는 1 만 반환 할 수 있습니다. 실제 행 수를 얻으려면 FetchAll 또는 Count 함수를 사용해야합니다.
PostgreSQL : Select 문의 경우 RowCount는 영향을받는 실제 행 수를 반환합니다.
따라서 코드에 선택한 쿼리가있는 경우 데이터베이스 유형과 드라이버 가이 기능을 지원하는지 확인하십시오.
다른 데이터베이스 엔진은 RowCount에서 반환 된 행 수에 영향을 줄 수 있습니다. 예를 들어 , MySQL에서 InnoDB 엔진을 사용하는 경우 RowCount는 실제로 행이 삭제되지 않더라도 0보다 큰 값을 반환 할 수 있습니다. InnoDB는 이러한 동작을 완전히 삭제하는 대신 제거하기 위해 이러한 동작을 표시하기 때문입니다. 실제 물리적 결실 작업은 일반적으로 향후 어느 시점에서 발생합니다.
이 경우 실제 데이터를 선택 하여 반환 된 행 수를 확인할 수 있습니다.
거래에서 데이터에 대해 일부 작업을 수행하고 거래를 커밋하지 않은 경우 RowCount는 작업의 영향을받는 행 수를 올바르게 반환하지 않을 수 있습니다. 그 이유는 트랜잭션이 완전히 커밋되지 않았고 데이터베이스가 이러한 변경 사항을 영구적으로 기록하지 않았기 때문입니다. 이 경우 트랜잭션을 저지른 후 RowCount 메서드를 호출하여 올바른 수의 행을 얻는 것이 가장 좋습니다.
일부 데이터베이스 시스템은 쿼리 캐싱을 활성화합니다. 삽입 , 업데이트 또는 삭제 와 같은 작업이 수행 되더라도 RowCount는 최신 행 수 대신 캐시의 데이터를 반환 할 수 있습니다. 캐싱 정책을 사용할 때 특히 중요합니다.
캐시 메커니즘을 사용하는 경우 작업을 수행 한 후 캐시를 지우거나 Cache가 새로 고침 될 때까지 RowCount가 올바른 행의 행을 반환 할 수 있도록 캐시를 기다려야 할 수도 있습니다.
때때로, SQL 명령문 최적화 또는 실행 계획의 변경으로 인해 RowCount는 기대치와 일치하지 않는 것을 반환 할 수 있습니다. 예를 들어, 일부 쿼리는보다 효율적인 방식으로 최적화되어 변경하지 않고 실제로 작동하는 행의 수를 줄일 수 있습니다.
선택 쿼리에서 한계 또는 오프셋을 사용하면 RowCount는 쿼리의 모든 행이 아니라 제한된 수의 행만 리턴 할 수 있습니다. 예를 들어:
$stmt = $pdo->prepare("SELECT * FROM users LIMIT 10");
$stmt->execute();
echo $stmt->rowCount(); // 반환은 될 수 있습니다0,대신에10
이를 피하려면 실제로 쿼리를 실행 한 후 모든 데이터를 얻은 다음 RowCount 에 의존하는 대신 행 수 를 계산해야합니다.
경우에 따라 RowCount를 실행하면 전처리 문을 사용할 때 다른 결과를 반환 할 수 있습니다. 특히 변수가 바운드되고 데이터베이스 엔진이 특정 최적화를 지원하는 경우 RowCount 에서 반환 한 값은 예상대로 아닐 수 있습니다.
$stmt = $pdo->prepare("UPDATE users SET status = 'inactive' WHERE last_login < :time");
$stmt->bindParam(':time', $time);
$stmt->execute();
echo $stmt->rowCount(); // 수익은 기대치와 일치하지 않을 수 있습니다
마지막으로, 일부 데이터베이스 드라이버 (예 : MySQL 또는 PostgreSQL ) 자체는 RowCount 와 관련된 문제 또는 제한 사항이있을 수 있습니다. 이러한 드라이버를 사용할 때는 설명서를 참조하여 특정 작업을 수행 할 때 데이터베이스 드라이버가 RowCount 의 반환 값을 처리하는 방법을 이해하는 것이 가장 좋습니다.