PHP의 데이터베이스 추상화 계층 PDO (PHP 데이터 객체)에서 pdostatement :: rowCount ()는 마지막 SQL 실행의 영향을받는 행의 수를 반환하는 일반적인 메소드입니다. 그러나 많은 개발자들은 다른 데이터베이스 드라이버에서 사용할 때 메소드 동작이 일치하지 않으며 일부 시나리오에서 예상 결과를 얻지 못한다는 것을 알게 될 것입니다.
공식 PHP 문서 의 지침에 따르면 :
대부분의 데이터베이스의 경우 rowCount ()는 삭제 , 삽입 또는 업데이트 문의 경우에만 적용됩니다. Select 문의 경우 일부 데이터베이스 드라이버는 영향을받는 행 수를 반환 할 수 있지만 이는 통합 된 PDO 동작의 일부가 아닙니다.
즉, RowCount () 의 동작은 기본 데이터베이스 드라이버 구현에 따라 다릅니다.
데이터베이스 유형 | SELECT 문에 대한 RowCount 지원 | 업데이트/삭제/삽입을 위해 RowCount를 지원합니다 |
---|---|---|
MySQL | ? 신뢰할 수없는 (보통 반환 0) | ? 영향을받는 행의 수를 반환하십시오 |
Postgresql | ? 지원하다 | ? 지원하다 |
sqlite | ? 지원하다 | ? 지원하다 |
MSSQL | ? (종속성 드라이버 구현) | ? |
예를 들어, mysql에서 :
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->query("SELECT * FROM users");
echo $stmt->rowCount(); // 보통 돌아옵니다 0
그러나 postgresql 또는 sqlite에서 실제 행 수를 반환 할 수 있습니다.
주된 이유는 데이터베이스 드라이버가 특히 SELECT 의 경우 다른 방식으로 SQL을 실행하기 때문입니다. 일부 드라이버는 모든 결과를 미리로드하지 않고 트래 버는 동안 데이터를 가져옵니다. 이 경우, 얼마나 많은 행이 있는지 알 수 없습니다.
공식 MySQL 드라이버 ( MySQLND )는 SELECT 의 경우 RowCount ()가 종속되어서는 안된다고 명확하게 명시하고 있습니다.
$stmt = $pdo->query("SELECT * FROM users");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = count($rows);
echo "흔한 {$count} 라인 데이터";
또는:
$count = 0;
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch()) {
$count++;
}
echo "흔한 {$count} 라인 데이터";
참고 : 데이터 볼륨이 크면 FetchAll ()는 많은 메모리를 차지하며 루프 카운팅을 사용하는 것이 좋습니다.
$stmt = $pdo->prepare("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 7 DAY");
$stmt->execute();
echo "업데이트 " . $stmt->rowCount() . " 좋아요";
이러한 작업의 RowCount ()는 일반적으로 신뢰할 수 있습니다.
자신의 RowCount 기능을 캡슐화하고 SQL 유형을 판단하고 적절한 통계 방법을 선택할 수 있습니다.
function safeRowCount(PDOStatement $stmt, $sqlType = 'SELECT') {
if (strtoupper($sqlType) === 'SELECT') {
return count($stmt->fetchAll());
} else {
return $stmt->rowCount();
}
}
이를 통해 다른 데이터베이스 드라이버에서 동작을 일관되게 유지할 수 있습니다.
pdostatement :: rowCount () 의 일관되지 않은 행동은 PHP 데이터베이스 개발에서 일반적인 함정 중 하나입니다. 기본 메커니즘을 이해하고 SQL 유형을 기반으로 적절한 처리 방법을 선택하는 것이 호환 가능한 코드를 작성하는 데 핵심입니다.
더 많은 샘플 코드 또는 공유 경험을 보려면 기술 커뮤니티 ( https://gitbox.net/forum) 를 방문하십시오.