현재 위치: > 최신 기사 목록> pdostatement와 함께 사용하는 방법 :: Fetchall Query 효율성을 향상시킵니다

pdostatement와 함께 사용하는 방법 :: Fetchall Query 효율성을 향상시킵니다

gitbox 2025-05-28

데이터베이스 개발에 PHP를 사용하는 경우 PDO (PHP 데이터 객체)는 매우 인기있는 데이터베이스 액세스 방법으로 다양한 데이터베이스를 작동시키기위한 통합 인터페이스를 제공합니다. 이 기사는 일반적으로 사용되는 두 가지 PDO 방법 인 pdostatement :: fetchall and pdostatement :: RowCount를 탐색하고 실제 개발에서이를 사용하는 방법을 분석하여 쿼리 효율성과 코드 견고성을 개선합니다.

1. FetchallRowCount를 이해하십시오

PDO를 사용하여 선택 쿼리를 실행할 때 일반적으로 FetchAll을 사용하여 모든 결과 행을 얻습니다. 이것은 쿼리 결과를 배열로 반환하는 매우 직접적인 방법입니다.

 $stmt = $pdo->query("SELECT * FROM users");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

반면 RowCount는 이전 SQL 문의 영향을받는 행 수를 반환하는 것입니다. Select 문을 실행할 때 RowCount 의 동작은 데이터베이스 드라이버에 따라 다릅니다. 일부 드라이버 (예 : MySQL의 PDO_MySQL)에서 RowCount를 선택한 쿼리로 호출한다고해서 항상 정확한 행 수를 반환하지는 않습니다.

 $count = $stmt->rowCount();

2. 일반적인 오해 : 선정 결과에 대한 RowCount 에 대한 과도한 관계

많은 개발자들은 쿼리 결과가 비어 있는지 판단 할 때 다음과 같은 코드를 습관적으로 작성합니다.

 $stmt = $pdo->query("SELECT * FROM users WHERE status = 'active'");
if ($stmt->rowCount() > 0) {
    $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

이 접근법은 특정 데이터베이스 드라이버 (특히 MySQL)에서 예상 결과를 반환하지 않습니다. 그 이유는 : Select 문의 경우, 결과가 실제로 비어 있지 않더라도 일부 드라이버에서 PDO의 RowCount가 "0"을 반환합니다.

3. 권장 관행 : 먼저 fetchall을 사용한 다음 수량을 결정하십시오.

신뢰할 수있는 결과를 얻고 효율성을 향상시키기 위해 FetchAll을 사용하여 모든 데이터를 얻은 다음 카운트를 사용하여 데이터가 있는지 확인하는 것이 좋습니다.

 $stmt = $pdo->prepare("SELECT * FROM users WHERE status = :status");
$stmt->execute(['status' => 'active']);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (count($users) > 0) {
    // 데이터가 있습니다,처리 로직
} else {
    // 데이터 프롬프트가 없습니다
}

이 접근법의 장점은 다음과 같습니다.

  • RowCount가 다른 운전자에서 일관되지 않게 수행하는 문제를 피하십시오.

  • FetchAll이 실행 된 후 데이터가 메모리에로드되었으며 Count ($ 사용자) 작업 오버 헤드는 매우 작습니다.

  • 더 가독성과 명확한 논리.

4. 효율성을 향상시키기위한 실용적인 기술

FetchAll 은 편리하지만 많은 양의 데이터를 처리 할 때 많은 메모리를 소비 할 수 있습니다. 현재 다음 전략을 고려할 수 있습니다.

1. fetchall 대신 Fetch 루프를 사용하십시오

 $stmt = $pdo->prepare("SELECT * FROM logs WHERE created_at > :date");
$stmt->execute(['date' => '2025-01-01']);

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // 각 데이터 행을 실시간으로 처리하십시오
}

이 방법은 결과 세트가 크지 만 일회성 로딩이 필요하지 않은 시나리오에 적합합니다.

2. 제한 쿼리 데이터를 제한합니다

한계를 추가하는 것은 데이터의 일부만 필요할 때 효율성을 향상시키는 중요한 방법입니다.

 $stmt = $pdo->prepare("SELECT * FROM users WHERE status = :status LIMIT 100");
$stmt->execute(['status' => 'active']);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

3. 카운트 (*)를 사용하여 데이터가 존재하는지 신속하게 결정합니다.

데이터가 있는지 확인하고 실제로 결과를 얻을 필요가없는 경우 Select Count (*)를 사용할 수 있습니다.

 $stmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE status = :status");
$stmt->execute(['status' => 'active']);
$count = $stmt->fetchColumn();

if ($count > 0) {
    // 일치하는 데이터가 있습니다
}

5. 실제 응용 시나리오의 예

gitbox.net 의 백그라운드 시스템에 활성화 된 모든 사용자를 나열해야한다고 가정합니다.

 $url = 'https://gitbox.net/api/active-users';

$stmt = $pdo->prepare("SELECT id, username, email FROM users WHERE status = :status ORDER BY created_at DESC LIMIT 50");
$stmt->execute(['status' => 'active']);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (count($users) > 0) {
    foreach ($users as $user) {
        echo "사용자 이름:{$user['username']},우편:{$user['email']}<br>";
    }
} else {
    echo "활성화 된 사용자가 발견되지 않았습니다。";
}

6. 요약

  • 선택 쿼리의 결과 행 수를 판단하려면 RowCount 에 의존하지 마십시오.

  • 데이터가 존재하는지 여부를 결정하기 위해 Fetchall Plus Count를 사용하는 것이 좋습니다.

  • 큰 데이터 쿼리의 경우 페치 반복 및 제한을 사용하는 것이 주요 최적화 방법입니다.

  • 행의 수만 계산하기 만하면 SELECT COUNT (*)를 사용하여 효율성을 향상시킬 수 있습니다.

PDO가 제공하는 방법을 합리적으로 사용하면 시스템 성능을 향상시킬뿐만 아니라 교차-대사 개발에서 일관되지 않은 행동을 피하고 코드의 견고성과 유지 가능성을 향상시킵니다.