Bei der Verwendung von PHP -PDO zum Betrieb der Datenbank ist die PDOSTATEMENT :: FetchObject () -Methode sehr bequem und kann die Abfrage -Ergebnisse direkt zu einem Objekt zuordnen. Wenn das Datenbankfeld jedoch (z. B. Zeitstempeltypen ) enthält, kann es einige Probleme mit FetchObject aufnehmen, z.
In diesem Artikel wird erläutert, wie diese DateTime -Felder bei Verwendung von FetchObject korrekt behandelt werden und praktische Beispiele angeben.
Angenommen, es gibt einen Benutzer -Tabellenbenutzer , die Struktur lautet wie folgt:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL
);
Daten einfügen:
INSERT INTO users (name, created_at) VALUES ('Alice', '2025-04-27 14:30:00');
Verwenden Sie FetchObject , um Daten zu erhalten:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 1');
$user = $stmt->fetchObject();
echo $user->created_at;
?>
Die Ausgabe ist eine normale Zeichenfolge :
2025-04-27 14:30:00
Wenn Sie auf created_at hinzufügen, subtrahieren, formatieren möchten, müssen Sie es manuell mit der DateTime -Klasse konvertieren, die sehr unelegant ist.
Es gibt zwei allgemeine Möglichkeiten, es anmutig damit umzugehen:
Konvertieren Sie nach dem Erhalten des Objekts das Datumsfeld sofort in das DateTime -Objekt.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 1');
$user = $stmt->fetchObject();
if ($user && isset($user->created_at)) {
$user->created_at = new DateTime($user->created_at);
}
// Jetzt kann es direkt verwendet werden DateTime Verfahren
echo $user->created_at->format('YJahrmMonddTag H:i:s');
?>
Obwohl diese Methode einfach ist, muss sie jedes Mal manuell konvertiert werden . Wenn die Tabellenstruktur komplex ist oder es viele Felder gibt, steigen die Wartungskosten.
Erstellen Sie eine Entitätsklasse, definieren Sie den entsprechenden Attributtyp und verarbeiten Sie das Datum und die Uhrzeit automatisch im Konstruktor.
<?php
class User
{
public int $id;
public string $name;
public DateTime $created_at;
public function __construct()
{
// Müssen die ursprüngliche Zeichenfolge hinzufügen created_at Konvertieren zu DateTime Objekt
if (is_string($this->created_at)) {
$this->created_at = new DateTime($this->created_at);
}
}
}
?>
Geben Sie den Klassennamen an, wenn Sie FetchObject verwenden:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT * FROM users WHERE id = 1');
$user = $stmt->fetchObject(User::class);
echo $user->created_at->format('Y-m-d H:i:s');
?>
Die Vorteile davon sind:
Der Code ist klarer
Vermeiden Sie die fehlende Feldverarbeitung
Die Objektstruktur ist standardisierter und erleichtert die IDE die automatische Abschluss
Geeignet für größere Projekte oder langfristige Wartung
Wenn Ihre PHP -Version es unterstützt, können Sie Deklarationen des Eigenschaftstyps , wie z. B. in PHP 8.0 eingeführte Konstruktor -Eigenschaftsförderung, kombinieren, um das Schreiben von Entitätsklassen weiter zu vereinfachen.
Stellen Sie gleichzeitig sicher, dass das von der Datenbank zurückgegebene Feldformat immer dem ISO-Standard ( YYYY-MM-DD HH: MM: SS ) entspricht, um die Date- Analyse-Fehlerversagen zu vermeiden.
Bei Verwendung von pdostatement :: fetchObject () ist das direkt zurückgegebene Datum und die Uhrzeit eine Zeichenfolge. Wenn Sie eine elegante Behandlung benötigen, wird empfohlen:
Kleine Gegenstände können nach dem Entfernen manuell in DateTime konvertiert werden
In großen Projekten oder standardisierten Entwicklung wird dringend empfohlen, kundenspezifische Entitätsklassen zu verwenden.
Durch rationale Entwurfsklassen können die Robustheit und Wartbarkeit des Codes erheblich verbessert werden.
Wenn Sie mehr über PDO -Nutzungstipps erfahren möchten, können Sie sich auf die offizielle Dokumentation beziehen.