PHP의 PDO (PHP Data Objects)를 사용하여 데이터베이스를 작동 할 때 PDOSTATEMENT :: ROWCOUNT ()는 종종 작업에 영향을 미치는 행 수를 얻는 데 사용되는 메소드입니다. 그러나 많은 개발자들은 실제 개발에서 행동이 데이터베이스마다 크게 다르다는 것을 발견했습니다. 이 기사는 다양한 데이터베이스에서 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.";
?>
업데이트/삭제/삽입 : RowCount ()는 영향을받는 행 수를 반환합니다. 이는 정확하고 유효합니다.
선택 : 기본적으로 RowCount ()는 0 의 값을 반환합니다. MySQL 드라이버는 리턴 행 카운트를 선택하여 명령문을 선택 하지 않기 때문입니다.
select , rowCount ()를 포함한 모든 진술에 대해 일반적으로 올바른 수의 행을 반환 할 수 있습니다.
대부분의 시나리오에 적합하지만 일부 견해 나 기능은 행동 불안정성을 유발할 수 있습니다.
MySQL과 유사하게 업데이트 , 삽입 , 삭제 지원이 좋습니다.
0은 일반적으로 SELECT 문으로 반환됩니다.
모든 유형의 명령문은 SELECT를 포함하여 영향을받는 행 수를 반환하도록 지원되지만 SQL 서버가 올바르게 구성되고 NoCount를 설정할 때 NOCount가 사용되지 않는 경우에만 해당됩니다.
Select의 RowCount ()에 의존하지 마십시오.
데이터베이스 드라이버 지원을 명확하게 알지 못하면 FetchAll ()을 사용한 다음 Count ()를 사용하여 여행 수를 얻는 것이 좋습니다.
$stmt = $pdo->query("SELECT * FROM users");
$rows = $stmt->fetchAll();
echo count($rows) . " rows selected.";
RowCount 이후 Execute를 사용해보십시오
준비 및 실행 의 조합은 RowCount ()가 지원되는 데이터베이스에서 정확한 행 수를 반환하도록 보장 할 수 있습니다.
거래의 행동은 다를 수 있습니다
일부 데이터베이스는 거래가 커밋 될 때까지 거래의 행 수를 즉시 반영하지 않습니다.
드라이브 구현에 의해 제한됩니다
PDO 자체는 통합 인터페이스이며 기본 동작은 사용 된 드라이버 (예 : PDO_MYSQL , PDO_PGSQL 등)에 따라 다릅니다.
삽입에 대한 영향은 무시/중복 키에 영향을 미칩니다
MySQL 의이 진술의 경우 RowCount () 의 리턴 값이 반드시 예상되는 인서트 수는 아니며 0 일 수 있습니다.
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 () 의 데이터베이스 차이로 인한 문제에 대해 걱정하지 않고보다 안전하고 교차 플랫폼을 처리 할 수 있습니다.