현재 위치: > 최신 기사 목록> pdostatement를 통한 객체 데이터의 중복로드를 피하는 방법 :: FetchObject

pdostatement를 통한 객체 데이터의 중복로드를 피하는 방법 :: FetchObject

gitbox 2025-05-12

pdostatement :: FetchObject는 데이터베이스 작업에 PDO를 사용할 때 매우 편리한 기능입니다. 쿼리 결과를 객체로 직접 캡슐화하여 수동 할당의 번거 로움을 줄일 수 있습니다. 그러나 부적절하게 사용하면 문제가 발생하여 프로그램 성능 저하 또는 논리 혼동이 발생할 수 있습니다.

이 기사는 중복 데이터 객체를로드하지 않도록 FetchObject를 올바르게 효율적으로 사용하는 방법을 알려줍니다.

FetchObject 란 무엇입니까?

PHP에서 pdostatement :: FetchObject 메소드는 데이터베이스 쿼리 결과의 단일 행 데이터를 클래스 인스턴스로 캡슐화 할 수 있습니다. 샘플 코드는 다음과 같습니다.

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$stmt = $pdo->query('SELECT id, name FROM users');

while ($user = $stmt->fetchObject()) {
    echo $user->id . ': ' . $user->name . '<br>';
}
?>

기본적으로 FetchObject는 표준 클래스 ( stdclass ) 객체를 반환하며 인스턴스화하려는 클래스 이름을 지정할 수도 있습니다.

중복 객체의 문제의 원인

쿼리 결과에 중복 레코드가 있거나 여러 쿼리에 동일한 데이터가 나타나면 매번 FetchObject를 통해 객체를 직접 인스턴스화하면 동일한 데이터가 나타나고 여러 다른 객체 인스턴스가 생성됩니다 .

예를 들어:

 $user1 = $stmt->fetchObject();
$user2 = $stmt->fetchObject();
// ~ 일지라도 user1 그리고 user2 ~의 id 같은,它们也是不同~의对象

이 중복 인스턴스화는 메모리를 낭비 할뿐만 아니라, 특히 대규모 프로젝트 또는 복잡한 데이터 연관 쿼리에서 일관되지 않은 데이터 상태에 문제가 발생할 수 있습니다.

중복 하중을 피하는 방법은 무엇입니까?

1. 객체 캐시 사용 (객체 풀 모드)

마다 FetchObject를 통해 객체가 생성 될 때마다 동일한 ID가있는 객체가 이미 존재하는지 확인하십시오. 그것이 존재하면 재사용되고 재현되지 않습니다.

예:

 <?php
class User {
    public $id;
    public $name;
}

$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$stmt = $pdo->query('SELECT id, name FROM users');

$users = []; // 用来缓存已经加载~의对象

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $id = $row['id'];
    if (!isset($users[$id])) {
        $user = new User();
        $user->id = $row['id'];
        $user->name = $row['name'];
        $users[$id] = $user;
    }
    // 이미 존재하는 경우,재사용 $users[$id]
}

이 수동 처리는 동일한 데이터가 한 번만 인스턴스화되도록 할 수 있습니다.

2. FetchObject 동작을 사용자 정의하십시오

FetchObject를 자체 클래스로 전달하고 클래스 생성자에서 ID 검사를 구현하여 추가로 자동화 할 수 있습니다.

예를 들어:

 <?php
class User {
    private static $instances = [];

    public $id;
    public $name;

    public function __construct() {
        // 외부 직접을 금지합니다 new,사용 create 방법
    }

    public static function create($row) {
        if (isset(self::$instances[$row['id']])) {
            return self::$instances[$row['id']];
        }

        $obj = new self();
        $obj->id = $row['id'];
        $obj->name = $row['name'];
        self::$instances[$row['id']] = $obj;

        return $obj;
    }
}

$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$stmt = $pdo->query('SELECT id, name FROM users');

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $user = User::create($row);
}
?>

게으른 사람들이 물체를 신속하게 구축 할 수 있도록 FetchObject 자체가 만들어졌지만 프로젝트가 객체 수명주기의 고성능 및 통합 관리가 필요할 때 조금 제어 할 가치가 있습니다.

3. 중복 데이터 쿼리를 피하기 위해 가능한 한 많은 SQL 쿼리를 최적화합니다.

때로는 SQL 쿼리가 잘 작성되지 않기 때문에 중복 데이터가 나타납니다. 예를 들어, 조인을 할 때 제거하지 않으면 동일한 기본 레코드가 여러 번 나타납니다.

올바른 방법은 반환 된 데이터를 제어하기 위해 SQL의 뚜렷한 그룹 또는 하위 쿼리를 사용하는 것입니다.

예를 들어:

 SELECT DISTINCT users.id, users.name
FROM users
LEFT JOIN orders ON orders.user_id = users.id

이를 통해 데이터 소스에서 중복 레코드 생성을 줄이고 문제를 근본적으로 해결할 수 있습니다.

요약

pdostatement :: fetchObject를 사용하는 것이 편리하지만 물체의 독창성에주의를 기울여야합니다. 요약 :

  • 대규모 프로젝트의 경우 객체 캐시 또는 객체 풀링 모드와 협력하는 것이 좋습니다.

  • 소규모 프로젝트의 경우 합리적으로 SQL을 최적화하면 대부분의 중복 하중 문제를 피할 수 있습니다.

  • 엄격한 객체 관리가 필요한 경우 FetchObject 프로세스를 수동으로 캡슐화하는 것을 고려할 수 있습니다.

PDO 기술에 대해 더 많이 배우거나 표준 PHP 데이터 액세스 계층 캡슐화가 필요한 경우보다 자세한 사례 및 관행을 위해 https://gitbox.net/php-tutorials를 방문하는 것이 좋습니다.