PHP의 PDO (PHP Data Objects)를 사용하여 데이터베이스를 작동 할 때 쿼리 결과를 얻는 방법에는 여러 가지가 있습니다. pdostatement :: fetchobject () 및 pdostatement :: fetch () ( pdo :: fetch_num 과 함께 "fetchrow"효과를 달성)가 가장 일반적인 두 가지 방법입니다. 그러나 많은 개발자들은 종종 궁금합니다. 어떤 것을 선택해야합니까? 성능, 구조 및 사용 편의 측면에서 그들의 차이점은 무엇입니까? 이 기사는 유사점과 차이점 및 적용 가능한 시나리오에 대한 심도있는 이해를 얻게됩니다.
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
$stmt = $pdo->query("SELECT id, name, email FROM users");
$user = $stmt->fetchObject();
echo $user->name;
반환 값 : 기본적으로 stdClass 의 인스턴스 인 오브젝트를 반환하며 사용자 정의 클래스로 인스턴스화 할 수도 있습니다.
액세스 방법 : 속성 메소드 ( $ user-> name )
데이터에 대한 구조화 된 액세스에 적합한 가독성이 높습니다 .
Fetchrow () 메소드는 없지만 Fetch (PDO :: Fetch_Num)는 해당 방법으로 간주 될 수 있습니다.
$stmt = $pdo->query("SELECT id, name, email FROM users");
$row = $stmt->fetch(PDO::FETCH_NUM);
echo $row[1]; // name
반환 값 : 인덱스 배열 반환 (각 열은 숫자 키로 배열됩니다)
액세스 방법 : 색인 메소드 ( $ row [0] , $ row [1] )
데이터 구조가 알려지고 열 순서가 고정 된 경우에 더 적합합니다.
비교 항목 | fetchObject () | fetch (pdo :: fetch_num) |
---|---|---|
반환 유형 | 개체 (기본 stdClass) | 배열 (인덱스 어레이) |
속성 액세스 | $ obj-> 속성 | $ 행 [0] |
확장 성 | 클래스 이름을 전달할 수 있고 클래스 속성을 자동으로 채울 수 있습니다. | 자동으로 수업에 매핑 할 수 없습니다 |
성능 | 약간 느리게 (개체 생성) | 조금 더 빨리 (순수한 배열) |
가독성 | 더 높은 | 일반적으로 |
권장 사용 시나리오 | ORM, 객체 지향 개발, 명확한 구조 출력 | 간단한 보고서 출력, 배치 처리, 임시 데이터 처리 |
FetchObject ()를 사용하는 것이 매우 적합하므로 결과를 객체에 직접 매핑하여 후속 비즈니스 로직 처리를보다 자연스럽고 명확하게 만들 수 있습니다.
class User {
public $id;
public $name;
public $email;
}
$stmt = $pdo->query("SELECT id, name, email FROM users");
$user = $stmt->fetchObject("User");
echo $user->email;
적절한 시나리오 : 엔터프라이즈 레벨 프로젝트, DDD 아키텍처, 편안한 인터페이스 반환 개체
Fetch (PDO :: Fetch_Num)를 사용하면 성능이 향상되고 불필요한 객체 생성을 피하고 현장 순서를 명확하게 제어 할 수 있습니다.
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
echo implode(",", $row) . PHP_EOL;
}
시나리오에 적합 : 배치 처리, 데이터 내보내기 CSV, 빠른보고 시스템
FetchObject ()는 더 높은 가독성을 제공하지만 각 레코드는 객체를 생성하기 때문에 많은 양의 데이터를 처리 할 때 Fetch (PDO :: Fetch_Num) 보다 약간 더 나빠집니다. 예를 들어 10 만 개의 데이터를 가져옵니다.
FetchObject () : 약 1.5 초가 걸립니다
fetch (pdo :: fetch_num) : 약 1.1 초가 걸립니다
테스트 환경은 로컬 MySQL 8.0 및 PHP 8.1을 기반으로하며 테스트 코드 주소는 https://gitbox.net/test/pdo_benchmark.php 입니다.
API, ORM 또는 클래스 캡슐화 레이어를 구축하는 경우 FetchObject ()를 사용하는 것이 좋습니다 .
일시적으로 잘 구조화 된 보고서 또는 배치 데이터를 처리하는 경우 Fetch (PDO :: Fetch_Num)를 선택하는 것이 더 적절합니다 .
가독성이 선호되는 경우 객체를 선택하고 성능이 선호되는 경우 배열을 선택하십시오.
장면 | 권장 방법 |
---|---|
객체 지향 처리 | fetchObject () |
빠르게 통과하고 데이터를 내 보냅니다 | fetch (pdo :: fetch_num) |
명확한 구조화 된 데이터 캡슐화가 필요합니다 | fetchObject () |
극도의 성능을 추구하는 매우 많은 양의 데이터 | fetch (pdo :: fetch_num) |
요컨대, 둘 다 고유 한 강점을 가지고 있으며, 그것들을 합리적으로 사용함으로써 PDO의 최대 효과가 발휘 될 수 있습니다.