현재 위치: > 최신 기사 목록> Pdostatement :: RowCount가 일부 데이터베이스 드라이버에서 지원되지 않는 이유

Pdostatement :: RowCount가 일부 데이터베이스 드라이버에서 지원되지 않는 이유

gitbox 2025-05-28

데이터베이스를 운영하기 위해 PHP의 PDO (PHP Data Objects) 확장자를 사용할 때 개발자는 종종 PDostatement :: RowCount () 메소드에 의존하여 영향을받는 행의 수를 얻습니다. 그러나 많은 사람들이 실제 개발 에서이 방법이 일부 데이터베이스 드라이버에서 올바른 결과를 반환하지 않는 것으로 보이며 선택 쿼리를 실행할 때도 직접 0을 반환 할 것입니다. 이게 왜? 이 기사는이 문제를 심층적으로 분석합니다.

1. RowCount의 기능과 사용

pdostatement :: rowCount () 는 PDO가 마지막으로 실행 된 SQL 문의 영향을받는 행의 수를 반환하기 위해 제공되는 메소드입니다. 두 가지 유형의 SQL 작업에서 가장 일반적으로 사용됩니다.

  • 업데이트 , 삭제 , 삽입물 등이 데이터 운영을 수정합니다.

  • 쿼리 선택 (일부 드라이버 지원)

기본 사용 예제 :

 $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare("DELETE FROM users WHERE status = :status");
$stmt->execute([':status' => 'inactive']);
echo $stmt->rowCount(); // 영향을받는 행의 수를 출력하십시오

2. 쿼리를 선택할 때 왜 RowCount가 0을 반환합니까?

공식 문서에 따르면 RowCount ()는 일부 데이터베이스 드라이버에서 쿼리를 선택하기 위해 영향을받는 행의 수를 반환하는 것을 지원하지 않습니다. 가장 일반적인 예는 MySQL입니다. MySQL의 PDO 드라이버를 사용하는 경우 선택 쿼리가 실행 된 후 일반적으로 RowCount () 가 예상 결과 수 대신 0을 반환합니다.

그 이유는 : Select Queries의 경우 MySQL의 클라이언트 라이브러리는 MySQLND 드라이버 (기본적으로 PHP 5.3+에서 활성화)에 사용되지 않는 한 영향을받는 행의 수를 알리지 않습니다. 그럼에도 불구하고 당신은 전적으로 RowCount () 에 의존 할 수는 없습니다.

선택한 쿼리 결과 수를 실제로 얻어야하는 경우 더 안전한 방법은 fetchall ()를 사용한 다음 count ()를 사용하여 count를 사용하는 것입니다.

 $stmt = $pdo->query("SELECT * FROM users WHERE status = 'active'");
$results = $stmt->fetchAll();
echo count($results);

이것은 더 많은 메모리를 소비하지만 정확성을 보장합니다.

3. 다른 데이터베이스 드라이버 동작

다음은 여러 공통 데이터베이스에서 RowCount () 의 지원 상황입니다.

데이터 베이스 SELECT가 지원됩니까? RowCount () 사용
MySQL ? 일반적으로 지원되지 않음 (mysqlnd가 아니라면)
Postgresql ? 지원하다
sqlite ? 선택 쿼리는 일반적으로 지원되지 않습니다
MSSQL/SQLSRV ? 지원하다
신탁 ? 지원하다

따라서 RowCount ()를 사용하면 대상 데이터베이스를 기반으로 판단해야합니다.

4. 권장 관행 및 예방 조치

  1. select 쿼리에 결과가 있는지 여부를 결정하려면 rowCount ()에 의존하지 마십시오. 데이터가 반환되는지 여부에 따라 결과가 있는지 확인하기 위해 Fetch () 또는 FetchAll ()을 사용하는 것이 가장 좋습니다.

  2. 삭제/업데이트/삽입에서 RowCount ()는 일반적으로 신뢰할 수 있습니다. 쿼리가 성공하는 한 일반적으로 영향을받는 행의 수를 반환 할 수 있습니다.

  3. MySQLND (MySQL Native Driver)가 활성화 될 때 RowCount ()를 사용하여 선택 수량을 얻으십시오.

phpinfo ()를 사용하거나 다음 코드를 실행하여 mysqlnd를 사용하는지 확인할 수 있습니다.

 echo phpinfo();

또는:

 echo (extension_loaded('mysqlnd')) ? 'mysqlnd loaded' : 'mysqlnd not loaded';

5. 요약

pdostatement :: rowCount () , 편리한 방법이지만 동작은 기본 데이터베이스 드라이버의 지원 정도에 달려 있습니다. 코드의 교차 대사와 호환성을 보장하기 위해 Select Queries를 사용할 때 RowCount ()를 피하고 대신 데이터 행 수를 판단하기 위해보다 안정적이고 신뢰할 수있는 방법을 사용하는 것이 좋습니다.

더 많은 데이터베이스 관련 자습서를 보려면 https://gitbox.net/dev/database-tutorials를 방문하십시오