Aktueller Standort: Startseite> Neueste Artikel> So vermeiden Sie das doppelte Laden von Objektdaten durch pdostatement :: fetchObject

So vermeiden Sie das doppelte Laden von Objektdaten durch pdostatement :: fetchObject

gitbox 2025-05-12

Pdostatement :: fetchObject ist eine sehr bequeme Funktion bei der Verwendung von PDO für Datenbankvorgänge. Es kann direkt Abfrageergebnisse in Objekte einkapseln und den Ärger der manuellen Zuordnung verringern. Wenn dies jedoch nicht ordnungsgemäß verwendet wird, kann dies auch zu Problemen führen, was zu einer Verschlechterung der Programmleistung oder einer logischen Verwirrung führt.

In diesem Artikel werden Sie vermittelt, wie Sie FetchObject ordnungsgemäß und effizient verwenden, um das Laden von doppelten Datenobjekten zu vermeiden.

Was ist FetchObject ?

In PHP kann die PDOSTATEMENT :: FetchObject -Methode eine einzelne Datenreihe aus der Datenbankabfrage in eine Instanz einer Klasse zusammenfassen. Der Beispielcode lautet wie folgt:

 <?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>';
}
?>

Standardmäßig gibt FetchObject ein Standardklassenobjekt ( STDClass ) zurück und Sie können auch den Klassennamen angeben, den Sie instanziieren möchten.

Quelle des Problems doppelter Objekte

Wenn in Ihren Abfrageergebnissen doppelte Datensätze vorhanden sind oder dieselben Daten in mehreren Abfragen angezeigt werden und Sie das Objekt jedes Mal direkt über FetchObject instanziieren, werden dieselben Daten angezeigt und mehrere verschiedene Objektinstanzen werden erstellt .

Zum Beispiel:

 $user1 = $stmt->fetchObject();
$user2 = $stmt->fetchObject();
// wenngleich user1 Und user2 von id Dasselbe,它们也是不同von对象

Diese doppelte Instanziierung verschwendet nicht nur den Gedächtnis, sondern kann auch Probleme mit inkonsistenten Datenzustand verursachen, insbesondere in großen Projekten oder komplexen Datenvereinigungsabfragen.

Wie vermeiden Sie doppelte Belastung?

1. Verwenden Sie den Objekt -Cache (Objektpool -Modus)

Überprüfen Sie, ob ein Objekt mit derselben ID bereits vorhanden ist, wenn ein Objekt über FetchObject erzeugt wird. Wenn es existiert, wird es wiederverwendet und nicht neu erstellt.

Beispiel:

 <?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 = []; // 用来缓存已经加载von对象

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;
    }
    // Wenn es bereits existiert,Wiederverwendung $users[$id]
}

Diese manuelle Verarbeitung kann sicherstellen, dass dieselben Daten nur einmal instanziiert werden.

2. FetobObject -Verhalten anpassen

Es kann weiter automatisiert werden, indem das FetchObject in seine eigene Klasse weitergegeben und ID -Überprüfungen im Klassenkonstruktor implementiert werden.

Zum Beispiel:

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

    public $id;
    public $name;

    public function __construct() {
        // Externe direkte verbieten new,verwenden create Verfahren
    }

    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);
}
?>

Obwohl FetchObject selbst für faule Menschen erstellt wurde, um schnell Objekte zu erstellen, lohnt es sich, es ein wenig zu kontrollieren, wenn das Projekt eine hohe Leistung und ein einheitliches Management des Objektlebenszyklus erfordert.

3.. Optimieren Sie SQL -Abfragen so weit wie möglich, um Abfragen doppelter Daten zu vermeiden

Manchmal werden doppelte Daten angezeigt, da SQL -Abfragen nicht gut geschrieben sind. Wenn Sie beispielsweise bei der Join nicht korrekt ordnungsgemäß deduplizieren, wird derselbe Hauptdatensatz mehrmals angezeigt.

Die korrekte Art und Weise besteht darin, unterschiedliche Gruppen nach oder unterab in SQL zu verwenden, um die zurückgegebenen Daten zu steuern.

Zum Beispiel:

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

Dies kann die Erzeugung doppelter Datensätze an der Quelle der Daten verringern und das Problem grundlegend lösen.

Zusammenfassung

Obwohl die Verwendung von pdostatement :: fetchObject bequem ist, sollten Sie auf die Einzigartigkeit des Objekts achten. Um zusammenzufassen:

  • Für große Projekte wird empfohlen, mit Objektcache oder Objektpooling -Modus zusammenzuarbeiten.

  • Bei kleinen Projekten kann die rational optimale SQL die meisten doppelten Ladeprobleme vermeiden.

  • Wenn ein strengeres Objektmanagement erforderlich ist, können Sie den FetchObject -Prozess manuell verkapsend in Betracht ziehen.

Wenn Sie mehr über PDO-Fähigkeiten erfahren möchten oder einen Standard-Satz von PHP-Datenzugriffsschichtkapselungen benötigen, wird empfohlen, https://gitbox.net/php-tutorials für detailliertere Fälle und Praktiken zu besuchen.