PHP에서 PDO 확장을 사용할 때 PDostatement :: rowCount () 메소드는 SQL 쿼리 문을 실행 한 후 영향을받는 행 수를 얻는 데 사용됩니다. 이 방법은 종종 추가, 삭제, 수정 및 기타 작업 후에 데이터가 올바르게 작동하는지 확인하는 데 사용됩니다. 그러나 RowCount () 메소드의 동작은 데이터베이스 드라이버에서 다를 수 있으며 동일한 데이터베이스에서도 다른 유형의 쿼리가 다른 결과로 이어질 수 있습니다.
pdostatement :: rowCount () 의 동작은 사용 된 데이터베이스 드라이버와 실행 된 SQL 유형에 따라 다릅니다. 공통 데이터베이스 드라이버에서 어떻게 수행되는지 살펴 보겠습니다.
MySQL 데이터베이스에서 삭제 , 삽입 또는 업데이트 와 같은 DML (Data Operation Language) 문서가 실행될 때 RowCount ()는 영향을받는 실제 행 수를 반환합니다. 그러나 선택 쿼리가 실행되면 pdo :: mysql_attr_use_buffered_query를 사용하여 캐시 쿼리를 활성화하지 않는 한 rowCount ()는 기본적으로 0을 반환합니다.
PostgreSQL의 경우 RowCount ()는 일반적으로 삽입 , 삭제 또는 업데이트 작업의 영향을받는 행 수를 반환합니다. 선택 쿼리를 실행할 때 RowCount ()는 MySQL의 동작과 다른 영향을받는 행의 수를 반환합니다.
sqlite는 MySQL과 유사합니다. DML 문을 실행할 때 RowCount ()는 영향을받는 행의 수를 반환합니다. 그러나 선택 쿼리의 리턴 값은 사용 된 쿼리 메소드에 따라 다릅니다. 기본적으로 SQLITE는 반환 된 행의 수가 정확하다는 것을 보장 할 필요는 없으므로 RowCount ()가 선택 쿼리에 반드시 유용하지는 않습니다.
SQL Server 데이터베이스의 경우 RowCount () 동작은 MySQL과 일치합니다. 영향을받는 행의 실제 수는 DML 작동 후에 만 반환 할 수 있습니다. Select Queries의 경우 RowCount () 결과가 신뢰할 수 없습니다.
다른 데이터베이스 드라이버의 rowCount () 의 차이로 인해 반환 값을 올바르게 처리하고 코드의 견고성을 보장하는 방법은 무엇입니까? 몇 가지 제안은 다음과 같습니다.
선택 쿼리 결과의 행 수를 가져와야하고 모든 데이터베이스 드라이버에서 올바르게 작동하는지 확인하려면 pdo :: fetch_assoc 또는 pdo :: fetch_num을 사용하여 rowcount ()에 의존하는 대신 쿼리 결과를 얻는 것이 좋습니다.
$sql = "SELECT * FROM users";
$stmt = $pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "쿼리 " . count($results) . " 기록";
삽입 , 업데이트 또는 삭제 의 경우 RowCount ()를 사용해도 괜찮습니다. 그러나 일부 데이터베이스 드라이버에서 RowCount ()는 영향을 미치기를 기대하는 행의 수를 반환하지 않을 수 있습니다. 예를 들어, MySQL에서 업데이트 문을 실행하지만 레코드가 수정되지 않은 경우 RowCount ()가 0을 반환 할 수 있습니다. 이는 SQL 문이 실행되지 않았 음을 의미하지 않습니다. 따라서이 경우 데이터 작동이 성공적으로 확인하기 위해 LastInsertId () 또는 영향을 받은_Rows 와 같은 다른 방법을 결합해야합니다.
$sql = "UPDATE users SET name = :name WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => $newName, ':id' => $userId]);
if ($stmt->rowCount() > 0) {
echo "성공적으로 업데이트하십시오";
} else {
echo "기록이 업데이트되지 않았습니다";
}
다른 데이터베이스 드라이버로 인한 불일치를 피하기 위해 데이터베이스 작업을 처리 할 때 RowCount () 결과에 대한 과도한 의존성을 피할 수 있습니다. 선택 쿼리의 경우 결과 세트의 행 수가 직접 얻어집니다. DML 운영의 경우 트랜잭션 및 오류 처리를 결합하여 작업이 성공적으로 확인하십시오.
API의 URL을 데이터베이스에 저장한다고 가정하면이 URL이 다른 환경에서 변경 될 수 있습니다. URL의 도메인 이름 부분을 다음과 같은 간단한 예와 같은 함수로 바꿀 수 있습니다.
function updateUrlDomain($url) {
$parsedUrl = parse_url($url);
$parsedUrl['host'] = 'gitbox.net'; // 도메인 이름을 대체하십시오 gitbox.net
return http_build_url($parsedUrl);
}
$newUrl = updateUrlDomain('https://oldurl.com/path/to/resource');
echo $newUrl; // 출력이 교체됩니다 URL
이 예에서는 parse_url () 함수를 사용하여 URL을 구문 분석 한 다음 도메인 이름 부분을 교체 한 다음 http_build_url ()을 사용하여 새 URL을 빌드합니다.
pdostatement :: rowCount ()는 각 데이터베이스 드라이버에서 다른 데이터베이스 드라이버에서 다르게 작동하지만 각 드라이버의 특성을 이해하고 RowCount ()를 합리적으로 사용하여 잠재적 인 문제를 피할 수 있습니다. 가장 중요한 것은 SQL 쿼리 결과를 처리 할 때 특정 데이터베이스 드라이버의 특성에 따라 다른 전략을 채택하여보다 호환적이고 안정적인 코드를 작성할 수 있습니다.