현재 위치: > 최신 기사 목록> pdostatement를 사용하여 병합 쿼리 결과를 얻는 방법 :: RowCount

pdostatement를 사용하여 병합 쿼리 결과를 얻는 방법 :: RowCount

gitbox 2025-05-28

PHP 개발에서 데이터베이스 작업에 PDO를 사용하는 것이 권장되는 방법 중 하나입니다. pdostatement :: rowCount () 는 PDO가 이전 SQL 문의 영향을받는 행의 수를 반환하기 위해 제공하는 메소드입니다. 그러나 동작은 SQL 명령문 유형에 따라 약간 다릅니다. 특히 Select , Update , DeleteUnion Queries를 실행할 때 그 메커니즘을 이해해야합니다.

이 기사는 pdostatement :: rowCount () 의 기본 사용을 소개하고 Union 병합 쿼리 결과를 처리 할 때 수행하는 방법과 합병 결과의 수를 올바르게 계산하는 방법을 심층적으로 탐색합니다.

1. pdostatement의 기본 사용 :: rowCount ()

삭제 , 삽입 또는 업데이트를 실행할 때 RowCount ()는 영향을받는 행의 수를 반환 할 수 있습니다. 예는 다음과 같습니다.

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$stmt = $pdo->prepare("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
$stmt->execute();

echo "업데이트 " . $stmt->rowCount() . " 라인 레코드。";
?>

위 코드에서 RowCount ()는 업데이트 된 행 수를 반환합니다.

그러나 선택 쿼리를 실행할 때 RowCount ()가 항상 예상대로 작동하지는 않습니다. 대부분의 데이터베이스 (특히 MySQL)의 경우 기본 PDO :: MySQL_ATTR_USE_BUFFERED_QUERY SETTING에서 ROWCOUNT ()는 선택 쿼리의 결과 행 수를 반환하지 않지만 0을 반환합니다.

2. 선택 쿼리에서 결과 행 수를 올바르게 얻으십시오.

선택 쿼리를 사용하고 결과의 행 수를 얻으려면 권장되는 방법은 모든 결과를 가져 와서 count ()를 통해 계산하는 것입니다.

 <?php
$stmt = $pdo->query("SELECT * FROM articles WHERE category = 'php'");
$results = $stmt->fetchAll();

echo "총이 있습니다 " . count($results) . " 기록。";
?>

3. Union 쿼리를 사용할 때 행의 수

Union은 두 개 이상의 선택 쿼리 결과를 병합하기위한 SQL의 구문입니다. 기본적으로 중복 행을 제거합니다 (중복 행을 유지하려면 ALL이 사용됩니다). 그렇다면 PDO를 통해 Union 쿼리 결과 행의 수를 얻는 방법은 무엇입니까?

오류 데모 :

 <?php
$stmt = $pdo->query("SELECT name FROM authors UNION SELECT name FROM editors");
echo $stmt->rowCount(); // 대부분 MySQL 다시 돌아올 경우 0
?>

RowCount ()가 MySQL에서 Select Queries의 리턴 결과 행 카운트를 지원하지 않기 때문입니다.

올바른 방법 : fetchall + count

 <?php
$stmt = $pdo->query("
    SELECT name FROM authors
    UNION
    SELECT name FROM editors
");

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "合并查询后총이 있습니다 " . count($rows) . " 기록。";
?>

이 메소드는 fetchall ()을 통해 모든 결과를 얻은 다음 count () 로 행의 수를 계산합니다. Union 쿼리의 병합 된 결과 수를 올바르게 얻을 수있을뿐만 아니라 다른 복잡한 선택 쿼리에도 적합합니다.

4. Union을 모두 사용할 때 행 수를 얻으십시오.

Union All (중복 제거 없음)을 사용하면 동일한 방법을 사용하여 모든 레코드를 얻을 수도 있습니다.

 <?php
$stmt = $pdo->query("
    SELECT name FROM authors
    UNION ALL
    SELECT name FROM editors
");

$rows = $stmt->fetchAll();
echo "UNION ALL 쿼리 결과의 행 수는입니다:" . count($rows);
?>

5. 팁 : Union 쿼리 페이징을 처리하는 방법

노조 쿼리 결과가 많고 PAGE가 필요한 경우 전체 Union 쿼리를 Pagination을 처리하기위한 하위 쿼리로 사용할 수 있습니다.

 <?php
$page = 1;
$limit = 10;
$offset = ($page - 1) * $limit;

$sql = "
    SELECT * FROM (
        SELECT name FROM authors
        UNION
        SELECT name FROM editors
    ) AS combined
    LIMIT :limit OFFSET :offset
";

$stmt = $pdo->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();

$results = $stmt->fetchAll();
foreach ($results as $row) {
    echo $row['name'] . "<br>";
}
?>

요약

  • pdostatement :: rowCount ()는 일반적으로 SELECT 문 (특히 MYSQL)에 대한 유효한 결과를 반환하지 않습니다.

  • fetchall () + count ()를 사용하는 것은 쿼리 행 수를 얻는보다 일반적이고 안정적인 방법입니다.

  • Union 또는 Union 모든 쿼리의 경우 FetchAll ()을 사용하여 배열 길이를 계산하여 총 행 수를 얻는 것이 좋습니다.

  • 병합 쿼리를 페이징 해야하는 경우 노조 결과를 하위 쿼리로 처리 할 수 ​​있습니다.

이 기사가 RowCount () 의 사용 시나리오를보다 명확하게 이해하고 Union Query 결과의 행 수를 계산할 때 트랩을 배치하지 않도록 도와 줄 수 있기를 바랍니다. 이 팁은 API 또는 데이터 분석 플랫폼 (예 : gitbox.net 의 프로젝트)을 구축하는 경우 특히 중요합니다.

당신을 위해 페이징 래퍼 기능을 작성해야합니까?