Lorsque vous utilisez l'APD de PHP pour faire fonctionner la base de données, la méthode PDOSTATION :: fetchObject () est très pratique et il peut dire directement les résultats de la requête dans un objet. Cependant, lorsque le champ de la base de données contient (tel que DateTime , types d'horodatage ), il peut rencontrer des problèmes directement à l'aide de fetchObject , tels que le champ de date traité comme une chaîne normale, ce qui rend le formatage ultérieur et les comparaisons deviennent gênantes.
Cet article expliquera comment gérer correctement ces champs DateTime lors de l'utilisation de FetchObject et de donner des exemples pratiques.
Supposons qu'il y ait un utilisateur de table utilisateur, la structure est la suivante:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL
);
Insérez des données:
INSERT INTO users (name, created_at) VALUES ('Alice', '2025-04-27 14:30:00');
Utilisez FetchObject pour obtenir des données:
<?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;
?>
La sortie est une chaîne normale :
2025-04-27 14:30:00
Si vous souhaitez ajouter, soustraire, format et autres opérations sur Created_at , vous devez le convertir manuellement avec la classe DateTime , qui est très inélégante.
Il existe deux façons courantes de le gérer gracieusement:
Après avoir obtenu l'objet, convertissez immédiatement le champ Date en objet DateTime .
<?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);
}
// Maintenant, il peut être utilisé directement DateTime méthode
echo $user->created_at->format('YAnnéemlunedjour H:i:s');
?>
Bien que cette méthode soit simple, elle doit être convertie manuellement à chaque fois . Si la structure du tableau est complexe ou il existe de nombreux champs, le coût de maintenance augmentera.
Créez une classe d'entité, définissez le type d'attribut correspondant et traitez automatiquement la date et l'heure du constructeur.
<?php
class User
{
public int $id;
public string $name;
public DateTime $created_at;
public function __construct()
{
// Besoin d'ajouter la chaîne d'origine created_at Se convertir DateTime Objet
if (is_string($this->created_at)) {
$this->created_at = new DateTime($this->created_at);
}
}
}
?>
Spécifiez le nom de classe lors de l'utilisation de fetchObject :
<?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');
?>
Les avantages de cela sont:
Le code est plus clair
Éviter le traitement du terrain manquant
La structure de l'objet est plus standardisée, ce qui facilite la réalisation d'IDE
Convient à des projets plus importants ou à une maintenance à long terme
Si votre version PHP le prend en charge, vous pouvez combiner les déclarations de type de propriétés , telles que la promotion de propriétés du constructeur introduit dans PHP 8.0, pour simplifier davantage la rédaction des cours d'entité.
Dans le même temps, assurez-vous que le format de champ renvoyé par la base de données est toujours conforme à la norme ISO ( Yyyy-mm-dd HH: MM: SS ) pour éviter la défaillance de l'analyse de Datetime .
Lorsque vous utilisez PDOSTATION :: fetchObject () , le champ Date et Heure retourné directement est une chaîne. Si vous avez besoin d'un traitement élégant, il est recommandé:
Les petits éléments peuvent être convertis manuellement en datetime après le retrait
Dans les grands projets ou le développement standardisé, il est fortement recommandé d'utiliser des cours d'entités personnalisées.
En concevant rationnellement les cours d'entités, la robustesse et la maintenabilité du code peuvent être considérablement améliorées.
Si vous voulez en savoir plus sur les conseils d'utilisation de l'APD, vous pouvez vous référer à la documentation officielle .