현재 위치: > 최신 기사 목록> pdostatement :: 다른 데이터베이스 유형에서 RowCount의 동작 차이

pdostatement :: 다른 데이터베이스 유형에서 RowCount의 동작 차이

gitbox 2025-05-21

PHP의 PDO (PHP Data Objects)를 사용하여 데이터베이스를 작동 할 때 PDOSTATEMENT :: ROWCOUNT ()는 종종 작업에 영향을 미치는 행 수를 얻는 데 사용되는 메소드입니다. 그러나 많은 개발자들은 실제 개발에서 행동이 데이터베이스마다 크게 다르다는 것을 발견했습니다. 이 기사는 다양한 데이터베이스에서 RowCount () 의 성능을 심도있게 분석하고 사용할 때주의를 기울여야하는 핵심 사항을 분석합니다.

1. RowCount ()는 무엇을합니까?

PDO에서 RowCount () 메소드는 일반적으로 이전 SQL 문에 영향을받는 행 수를 반환하는 데 사용됩니다. 이것은 일반적으로 업데이트 , 삭제삽입 문에 정확하고 유효합니다. 그러나 Select Queries의 경우 동작은 데이터베이스 드라이버에 따라 다릅니다.

예:

 <?php
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "user", "pass");
$stmt = $pdo->prepare("UPDATE users SET active = 1 WHERE last_login > :date");
$stmt->execute([':date' => '2024-01-01']);
echo $stmt->rowCount() . " rows updated.";
?>

2. 다른 데이터베이스의 차이

1. MySQL

  • 업데이트/삭제/삽입 : RowCount ()는 영향을받는 행 수를 반환합니다. 이는 정확하고 유효합니다.

  • 선택 : 기본적으로 RowCount ()는 0 의 값을 반환합니다. MySQL 드라이버는 리턴 행 카운트를 선택하여 명령문을 선택 하지 않기 때문입니다.

2. Postgresql

  • select , rowCount ()를 포함한 모든 진술에 대해 일반적으로 올바른 수의 행을 반환 할 수 있습니다.

  • 대부분의 시나리오에 적합하지만 일부 견해 나 기능은 행동 불안정성을 유발할 수 있습니다.

3. sqlite

  • MySQL과 유사하게 업데이트 , 삽입 , 삭제 지원이 좋습니다.

  • 0은 일반적으로 SELECT 문으로 반환됩니다.

4. SQL Server (PDO_SQLSRV를 통해)

  • 모든 유형의 명령문은 SELECT를 포함하여 영향을받는 행 수를 반환하도록 지원되지만 SQL 서버가 올바르게 구성되고 NoCount를 설정할 때 NOCount가 사용되지 않는 경우에만 해당됩니다.

3. 주목할만한 것들

  1. Select의 RowCount ()에 의존하지 마십시오.

    • 데이터베이스 드라이버 지원을 명확하게 알지 못하면 FetchAll ()을 사용한 다음 Count ()를 사용하여 여행 수를 얻는 것이 좋습니다.

     $stmt = $pdo->query("SELECT * FROM users");
    $rows = $stmt->fetchAll();
    echo count($rows) . " rows selected.";
    
  2. RowCount 이후 Execute를 사용해보십시오

    • 준비실행 의 조합은 RowCount ()가 지원되는 데이터베이스에서 정확한 행 수를 반환하도록 보장 할 수 있습니다.

  3. 거래의 행동은 다를 수 있습니다

    • 일부 데이터베이스는 거래가 커밋 될 때까지 거래의 행 수를 즉시 반영하지 않습니다.

  4. 드라이브 구현에 의해 제한됩니다

    • PDO 자체는 통합 인터페이스이며 기본 동작은 사용 된 드라이버 (예 : PDO_MYSQL , PDO_PGSQL 등)에 따라 다릅니다.

  5. 삽입에 대한 영향은 무시/중복 키에 영향을 미칩니다

    • MySQL 의이 진술의 경우 RowCount () 의 리턴 값이 반드시 예상되는 인서트 수는 아니며 0 일 수 있습니다.

4. 요약

pdostatement :: rowCount () 는 편리한 기능이지만 데이터베이스 전체의 동작은 일치하지 않습니다. 특히주의해서 사용해야하는 선택 쿼리에서는 일치하지 않습니다. 크로스 플랫폼 또는 높은 호환성이 필요한 응용 프로그램을 구축 할 때는 Select 에서 동작에 의존하지 않고 fetchall () + count () 와 같은 대안을 사용하지 않아야합니다.

예 :보다 호환 가능한 선택 처리

 <?php
$pdo = new PDO("mysql:host=localhost;dbname=demo", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM articles WHERE status = :status");
$stmt->execute([':status' => 'published']);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo "총 " . count($results) . " 기록。\n";

foreach ($results as $row) {
    echo $row['title'] . " - 링크: https://gitbox.net/article/" . $row['id'] . "\n";
}
?>

위의 방법을 통해 쿼리 결과는 RowCount () 의 데이터베이스 차이로 인한 문제에 대해 걱정하지 않고보다 안전하고 교차 플랫폼을 처리 할 수 ​​있습니다.